python 中文编码笔记

最近碰了很多钉子。。。

 

不得不说,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。

 

 

 

python默认的编码方案是ascii,所有超过128的unicode编码都会报UnicodeEncodeError。

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

  • unicode编码值小于128,原封不动;
  • unicode编码值在128到7ff,将转换为2个字节,每字节值范围在128到255之间;
  • unicode编码值大于7ff的,将转换为3-4个字节,每字节值范围在128到255之间。
为了应付编码问题,可以用repr()函数,type()函数来一探究竟。type能够告诉你这是unicode还是str,如果通过repr看到形如u'\ua000'的串,一般就是unicode了。\u和\U的区别是一个用4位16进制数表示,一个是8位16进制数表示。ord()函数可以返回一个unicode字并返回它的unicode编码(还记得上面提到的那张大码表吗?这编码就是在表中的索引值)。

posted on 2010-08-10 17:06  lifehacker  阅读(2041)  评论(0编辑  收藏  举报

导航