---- 温铭 http://blog.youkuaiyun.com/wayne92
学Python以来,遇到不少关于编码方面的问题,总是知其然不知其所以然,糊里糊涂的。今天在邮件列表中看到甘晖问一个编码的问题,有不少高手解释。看了以后霍然开朗,记录一下,以后备查:)
一、(以下为张骏的解释,感谢)
个人认为python对unicode的处理已经相当完善了。
对于python来讲,字符集的处理有两个概念:
1 str 是指带有编码的字符串
2 unicode 是指不带有编码的字符串
这两个概念的相互转换是这样进行的:
str ------> unicode --------> str
decode encode
解码 编码
举个最简单的例子:
>>> a = '中'
>>> a
'/xd6/xd0'
>>> b = u'中'
>>> b
u'/u4e2d'
根据上面的描述,b应该是不进行编码的a的值(反正a就是b带有gbk编码的值)
于是,我们可以得到
>>> a.decode( 'gbk' )
u'/u4e2d'
同样也可以得到
>>> b.encode( 'gbk' )
'/xd6/xd0'
不知道我讲的清楚吗?
另外,甘晖遇到的这个xml解析的问题并不是python对编码集处理的问题。而是python的xml模块pyexpat.pyd不支持非utf-8编码的多字节xml的原因。为什么不支持,是因为xml的标准规范仅仅定义了utf-8做为多字节xml的编码,gbk(gb2312)并不是xml规范中允许的字符集。
因此,我们在处理gbk编码集的xml时,都是先将文件读取出来,然后转换为utf8格式,然后再解析
>>> f = file( r'c:/a.xml' )
>>> buf = f.read()
>>> ubuf = buf.decode( 'gbk' ).encode( 'utf-8' )
>>> xml.parser( ubuf )
...
调用字符串的decode和encode方法有一个好处是,不用显式import codecs模块,更不用lookup特定字符编码的decode和encode函数。但是这种方法不适用于对decode和encode方法多次重复调 用的场合,主要是从代码的执行效率方面考虑的。(这一段是 麦田守望者的意见)
二、(以下摘自麦田守望者的blog,感谢)
>>> import codecs
>>> t = codecs.lookup("utf-8")
>>> print t
(<built-in function utf_8_encode>, <function decode at 0x00AA25B0>, <class encodings.utf_8.StreamReader at 0x00AA0720>, <class encodings.utf_8.StreamWriter at 0x00AA06F0>)
>>> encoder = t[0]
>>> decoder = t[1]
>>> StreamReader = t[2]
>>> StreamWriter = t[3]
- getencoder(encoding)
- getdecoder(encoding)
- getreader(encoding)
- getwriter(encoding)
>>> encoder = codecs.getencoder("utf-8")
>>> fin = codecs.open("e://mycomputer.txt", "r", "utf-8")
>>> print fin.readline()
这是我的电脑
>>> fin.close()
-----------------------------------------------
重要补记(二零零六年九月七日下午):
一、上面的例子请在命令行下测试,在IDLE下有些会有错误!!我已经决定再也不用IDLE了,太痛苦了,debug半天才发现是IDLE的bug!!
二、刚才用C扩展Python,发现在Python里面传一个字符串给C,在C中打印,如果其中有中文字符,就会有乱码。(如果你没有在文件中加# -*- coding: utf-8 -*-,就不会有这个问题)
解决方法如下:
s
=
u
"
欢迎使用rss阅读器
"
s
=
s.encode(
'
gbk
'
)
libConsole.ConsoleOutput(s)
#
libConsole是用C封装成的一个dll,
#
ConsoleOutput(s) 是用C写的一个方法,就是#一个printf语句
PS:(2007.11.29)
环境:mysql(utf8编码),eclipse(utf8编码),windows xp
问题:在mysql中显示为中文,程序select出来在eclipse ebug窗口显示为中文,print为乱码,makedirs后为乱码。
解决:path.decode('utf-8').encode('gbk')
先按utf8解码,再按gbk编码
在mysql里面可以看到字符的二进制编码,很好。这个以前没有注意过
1万+



被折叠的 条评论
为什么被折叠?



