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之间。
posted on 2010-08-10 17:06 lifehacker 阅读(2047) 评论(0) 编辑 收藏 举报