`
san_yun
  • 浏览: 2663391 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

unicode和utf8小结

 
阅读更多

首先,unicode和utf-8是两个概念,不能混淆在一起,以python为例,当在字符前面加上u,表示采用unicode编码。比如:

 

>>> val = u'¥'
>>> val
u'\xa5'

 

¥这个字符在unicode中的编码格式是0xa5,所以结果为0xa5。参考: http://zh.wikipedia.org/wiki/%C2%A5

 

如果不在前面加u,表示采用文件制定的编码格式,如果在文件头部加上了# -*- coding: utf-8 -*-,表示utf-8编码。比如:

>>> val = '¥'
>>> val
'\xc2\xa5'

 

那么unicode和utf-8有何区别?又如何对应起来?

 

  • 对于UTF-8编码中的任意字节B,如果B的第一位为0,则B为ASCII码,并且B独立的表示一个字符;
  • 如果B的第一位为1,第二位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的一个字节,并且不为字符的第一个字节编码;
  • 如果B的前两位为1,第三位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由两个字节表示;
  • 如果B的前三位为1,第四位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由三个字节表示;
  • 如果B的前四位为1,第五位为0,则B为一个非ASCII字符(该字符由多个字节表示)中的第一个字节,并且该字符由四个字节表示;

因 此,对UTF-8编码中的任意字节,根据第一位,可判断是否为ASCII字符;根据前二位,可判断该字节是否为一个字符编码的第一个字节; 根据前四位(如果前两位均为1),可确定该字节为字符编码的第一个字节,并且可判断对应的字符由几个字节表示;根据前五位(如果前四位为1),可判断编码 是否有错误或数据传输过程中是否有错误。

 

下列字节串用来表示一个字符. 用到哪个串取决于该字符在 Unicode 中的序号.

xxx 的位置由字符编码数的二进制表示的位填入. 越靠右的 x 具有越少的特殊意义. 只用最短的那个足够表达一个字符编码数的多字节串. 注意在多字节串中, 第一个字节的开头"1"的数目就是整个串中字节的数目.

例如: Unicode 字符 U+00A9 = 1010 1001 (版权符号) 在 UTF-8 里的编码为:

11000010 10101001 = 0xC2 0xA9

而字符 U+2260 = 0010 0010 0110 0000 (不等于) 编码为:

11100010 10001001 10100000 = 0xE2 0x89 0xA0

这种编码的官方名字拼写为 UTF-8, 其中 UTF 代表 UCS Transformation Format. 请勿在任何文档中用其他名字 (比如 utf8 或 UTF_8) 来表示 UTF-8, 当然除非你指的是一个变量名而不是这种编码本身.

 

 

 

//    	System.out.println(URLDecoder.decode("V%A5%0A.", "unicode"));
//    	System.out.println(URLEncoder.encode("中文", "utf8"));
    
//    	char c = 165;
//    	System.out.println(c);
    	
//    	System.out.println( Integer.toHexString("¥".getBytes("unicode")[0]));
//    	System.out.println( Integer.toHexString("¥".getBytes("unicode")[1]));
//    	System.out.println( Integer.toHexString("¥".getBytes("unicode")[2]));
//    	System.out.println( Integer.toHexString("¥".getBytes("unicode")[3]));
//    	
//    	System.out.println(Integer.toHexString("¥".getBytes("utf8")[0]));
//    	System.out.println(Integer.toHexString("¥".getBytes("utf8")[1]));
    }

 

 

 

# -*- coding: utf-8 -*-


DBOSS={
 "cat":{
    "locations":["localhost:8989"],
    "references":[
        {
            "id":"cacheService",
            "version":"1.0"
        }
    ]
  },
  "mandala":{
    "locations":["localhost:8989"],
    "references":[
        {
            "id":"searchService",
            "version":"1.0"
        },
        {
            "id":"blogQueryService",
            "version":"1.0"
        },
        {
            "id":"commentQueryService",
            "version":"1.0"
        }

    ]
  }
}
from dboss import  DuitangRemoteProxy
proxy = DuitangRemoteProxy(DBOSS)

blogQueryService = proxy.getService('blogQueryService')
val = 'V\xa5\n.'  		#'\xc2\xa5'
print repr(val)
val =  blogQueryService.toPickle(val)
print repr(val)

  
  

 

python中使用 unicode的关键:unicode是一个类,函数unicode(str,"utf8")从utf8编码(当然也可以是别的编码)的字符串str生成 unicode类的对象,而函数unc.encode("utf8")将unicode类的对象unc转换为(编码为)utf8编码(当然也可以是别的编码)的字符串。于是,编写unicode相关程序,需要做的事情是

    * 获取数据(字符串)时,用unicode(str, "utf8")生成unicode对象
    * 在程序中仅使用unicode对象,对程序中出现的字符串常量都以u"字符串"的形式书写
    * 输出时,可将unicode对象转换为任意编码输出,使用str.encode("some_encoding")

 

>>> s = unicode('V\xa5\n.','unicode-escape')
>>> s
u'V\xa5\n.'
>>> type(s)
<type 'unicode'>

 

import cPickle as p
In [23]: s=u'中¥'

In [24]: p.dumps(s)
Out[24]: 'V\\u4e2d\xa5\np1\n.'

In [25]: s='中¥'

In [26]: s
Out[26]: '\xe4\xb8\xad\xc2\xa5'

 比如¥这个特殊符号,unicode是\xa5,utf-8是\xc2\a5。如果直接unicode的传给java会有问题的。

 

 

参考:

http://bytes.com/topic/python/answers/861195-pickling-unicode

http://ubuntuforums.org/showthread.php?t=951337

分享到:
评论

相关推荐

    unicode、utf-8、ansi的故事及其相互转换.txt

    在探讨 Unicode、UTF-8 和 ANSI 编码之前,我们需要先了解几个基础概念。 **1. 字符编码(Character Encoding):** 字符编码是将人类可读的文字转化为计算机可以处理的数据的过程。在早期计算机系统中,不同的国家...

    MySQL 编码utf8 与 utf8mb4 utf8mb4_unicode_ci 与 utf8mb4_general_ci

    参考:mysql字符集小结 utf8mb4 已成为 MySQL 8.0 的默认字符集,在MySQL 8.0.1及更高版本中将 utf8mb4_0900_ai_ci 作为默认排序规则。 新项目只考虑 utf8mb4 UTF-8 编码是一种变长的编码机制,可以用1~4个字节存储...

    深入UTF8字符编码.doc

    **小结**:Windows系统中,字符编码的处理需要关注不同组件和场景,理解其默认设置和如何进行调整是解决编码问题的基础。 **第二章 文本工具的字符编码** 文本工具如记事本、写字板、Word和开发工具Eclipse在处理...

    ASP关于编码的几个有用的函数小结(utf8)

    1、’UTF转GB—将UTF8编码文字转换为GB编码文字 代码如下: function UTF2GB(UTFStr) for Dig=1 to len(UTFStr) ‘如果UTF8编码文字以%开头则进行转换 if mid(UTFStr,Dig,1)=”%” then ‘UTF8编码文字大于8则转换为...

    asp UTF-8 乱码问题的解决方法小结

    UTF-8编码是一种针对Unicode字符集的可变长度字符编码方式,它可以表示Unicode标准中的任何字符,并且是互联网上使用最广泛的编码之一。UTF-8能够支持包括中文在内的几乎所有国家的语言字符,并且是向下兼容ASCII...

    JSP中文乱码问题解决方法小结

    charset=utf-8")`和`request.setCharacterEncoding("utf-8")`,确保数据在客户端和服务器之间传输时不发生编码转换错误。 3. **中文作为参数传递乱码** 当中文参数通过URL传递时,可能会因URL编码不一致产生乱码。...

    VC中字符串之间的转换和写入文本

    本篇文章将详细介绍如何在VC中实现Ansi、Unicode和UTF-8字符串之间的相互转换,并且如何将这些字符串正确地写入文本文件。 #### Ansi与Unicode之间的转换 在VC中,进行Ansi到Unicode以及Unicode到Ansi的转换是非常...

    core java 小结

    Unicode与UTF的关系在于,UTF是Unicode的传输格式,用于网络传输。 #### 九、Boolean类型与逻辑运算 Java中的`boolean`类型主要用于逻辑判断。异或运算符(`^`)在布尔表达式中具有特殊的应用,用于比较两个布尔值...

    jsp中影响编码的属性及其设置小结

    charset=UTF-8"%&gt;`中定义,用于指定HTTP响应头中的Content-Type,它定义了页面内容的MIME类型和字符编码。默认的MIME类型是"text/html",默认的字符编码是"ISO-8859-1"。 2. `pageEncoding`:在`...

    php递归创建和删除文件夹的代码小结

    在多语言环境中,使用Unicode编码(如UTF-8)通常更为安全。 总结来说,PHP中递归创建和删除文件夹的核心是使用`mkdir`和`rmdir`函数,结合`is_dir`和`is_file`检查,以及递归调用来处理多层次的目录结构。在编写...

    ctf加解密小结

    12. UTF7编码:UTF7是一种编码方式,用于将Unicode字符集编码为ASCII字符集兼容的文本。 13. 莫斯密码:一种以点(.)和划(-)表示不同字母的编码方式。 14. 当铺密码:这是一种通过特定的编码规律将信息隐藏在...

    正则表达式小结

    - 双字节字符:正则表达式通常用于匹配ASCII字符,但可以使用特殊语法匹配如UTF-8编码的双字节或多字节字符。 理解并熟练运用这些正则表达式可以帮助开发者高效地处理各种文本数据,提高代码的灵活性和可维护性。...

    Java中文编码问题小结

    一种检测方法是插入一个Unicode汉字`\u4e00`,然后检查其在JVM内部的整数值是否正确,或者直接以UTF-8打开编译后的`.class`文件查看汉字是否保存正确。 文件读写时,Java使用`InputStream/OutputStream`处理原始...

    XML实用大全

    - UTF-8编码、通用字符系统。 - **7.5 如何使用Unicode编写XML** - **7.5.1 利用字符引用在XML中表示非罗马字符** - 使用实体引用(`&amp;#xHHHH;`)表示特殊字符。 - **7.5.2 直接在XML中使用Unicode字符** - ...

    .NET之美:.NET关键技术深入分析

    10.4.1 ASCIl、UTF8、Unicode编码下的中英文字符大小 10.4.2文本边界问题 10.5异步传输字符串 10.5.1 服务端的实现 10.5.2客户端的实现 10.5.3程序测试 10.6文件传输 10.6.1订立协议 10.6.2协议处理类的实现...

    XML学习中文版

    - **UTF-8:** UTF-8编码的特点和优势。 - **通用字符系统:** Unicode作为全球字符集的重要性。 **7.5 如何使用Unicode编写XML** - **利用字符引用在XML文件中插入字符:** 如何在XML文档中使用字符引用来表示...

    网站开发防止中文乱码需要了解的codepage的重要性小结

    此外,需要注意的是,Unicode是一种统一的编码标准,包括UTF-8、UTF-16等多种实现方式。在ASP中,所有的文本默认以Unicode存储,但在写入数据库或输出到HTML时,需要根据codepage指定的编码进行转换。 总之,理解...

    2024码表IO流-字节流-HM

    ##### 1.4 字符集小结 通过对ASCII码表、GBK字符集和Unicode字符集的理解,我们可以总结以下几点: - **ASCII码表**:包含基本的英文字符,每个字符使用一个字节编码。 - **GBK字符集**:主要用于中文字符的编码,...

    Linux下乱码问题的解决方案小结

    "UTF-8"是Unicode Transformation Format的8位形式,是标准的表示方式。在Windows中,"utf-8"和"UTF8"也是可接受的,但为避免兼容性问题,建议始终使用大写的"UTF-8"。在MySQL中,可以使用"utf8"作为"UTF-8"的别名...

Global site tag (gtag.js) - Google Analytics