最近碰了很多钉子。。。

不得不说,python2.6 相较于之前发布的版本,就编码方面来说,有明显的进步。本机使用的是 python2.6,同样的代码根本没有遇到问题。到了服务器上部署时,一台服务器的 python2.5 和另一台服务器的 python2.4,都折磨得我苦不堪言。

先厘清几个概念:python 内置的字符类型是 unicode,当需要进行编码转换时,都要先转成 unicode,然后再转换成目标编码。而 str 类型是二进制类型,例如

  声明变量 uniStr=u’ 的 ‘,uniStr 的类型为 Unicode

  执行 gbStr=uniStr.encode(‘gb2312’),则 gbStr 的类型为 str,长度为 18 字节(gb2312 标准里用两个字节表示一个汉字)。

  若执行 gbStr.encode(‘gb2312’),则会报错,因为 ‘ascii’ codec can’t decode byte 0xd3 in position 0: ordinal not in range(128)。

关于 unicode:unicode 可以想象成一个比 ascii 大得多的码表,能够包含所有现存字符。每个字符有一个对应的编码,编码的范围是 0 到 0x10ffff,那么我们可以使用 32 位的 int 来储存一个 unicode 字符。但这样比较浪费空间,人们就提出了别的编码方案,例如 utf-8。简而言之,编码方案就是把 unicode 值映射成字节流,术语是 encoding。

utf-8 方案编码方案是应用较广的一种,编码规则如下:

  • unicode 编码值小于 128,原封不动;
  • unicode 编码值在 128 到 7ff,将转换为 2 个字节,每字节值范围在 128 到 255 之间;
  • unicode 编码值大于 7ff 的,将转换为 3-4 个字节,每字节值范围在 128 到 255 之间。

参见:

http://www.b-list.org/weblog/2007/nov/10/unicode/

http://boodebr.org/main/python/all-about-python-and-unicode

http://www.cl.cam.ac.uk/~mgk25/unicode.html

http://docs.python.org/howto/unicode.html

http://hi.baidu.com/a370500904/blog/item/9ff8aff49d8344d5f3d38534.html