http://www.cnblogs.com/BeginMan/archive/2013/08/08/3246619.html#a1 Python常见常用知识点
http://blog.csdn.net/tingsking18/article/details/4033645 Unicode和Python的中文处理
如何让Python的Unicode字符串支持中文?
要想利用Python的Unicode机制处理字符串,只要能够拥有一个能够把多字节的中文编码(包括GB编码系列和BIG5系列)和Unicode编码进行双向转换的编码/解(在C:\Python27\Lib\encodings\aliases.py中可以找到)模块就可以了。按照Python的术语,这样的编码/解码模块被称为codec。
Python的Unicode处理模块有三个最重要的组成部分:一是codecs.py文件,二是encodings目录,三是aliases.py文件。Python解释器在需要分析Unicode字符串时,会自动加载encodings目录下的这个aliases.py文件。
这个文件中只定义了一个哈希表aliases,它的每个键对应着每一个codec在使用时的名称,也就是unicode()内建函数的第二个参数值;而每个键对应的值则是一个字符串,它是这个codec对应的那个处理文件的模块名。比如,Python默认的解析UTF-8的codec是utf_8.py,它存放在encodings子目录下,则aliases哈希表中就有一项表示其对应关系:
# gb2312 codec'chinese' : 'gb2312','csiso58gb231280' : 'gb2312','euc_cn' : 'gb2312','euccn' : 'gb2312','eucgb2312_cn' : 'gb2312','gb2312_1980' : 'gb2312','gb2312_80' : 'gb2312','iso_ir_58' : 'gb2312',# gbk codec'936' : 'gbk','cp936' : 'gbk','ms936' : 'gbk',
codecs.py文件定义了一个标准的Codec模块应有的接口,部分内容:
Codec.encode(input, errors = "strict")
用于将输入的数据看做是Unicode字符串,并将其“编码”,转换成对应的传统
Python字符串。
Codec.decode(input, errors = "strict")
用于将输入的数据看做是传统Python字符串,并将其“解码”,转换成对应的Unicode
字符串。
分——————割—————————线———————————————————
python编码问题encode,decode
1. 字符串'xxx'虽然是ASCII编码,但也可以看成是UTF-8编码,
而u'xxx'则只能是Unicode编码
2. 把u'xxx'转换为UTF-8编码的'xxx'用encode('utf-8')方法:
>>> u'ABC'.encode('utf-8') 'ABC' >>> u'中文'.encode('utf-8') '\xe4\xb8\xad\xe6\x96\x87'
3. 反过来,把UTF-8编码表示的字符串'xxx'转换为Unicode字符串
u'xxx'用decode('utf-8')方法 >>> 'abc'.decode('utf-8') u'abc' >>> '\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8') u'\u4e2d\u6587' >>> print '\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8') 中文
4. IDLE 中文乱码
http://hi.baidu.com/yobin/item/166e3a46537781d3c1a59257
# utf-8 中一个汉字 占用三个长度 # gbk 中一个汉字 占用两个长度 # 1. utf-8 >>>data = u'长城'.encode('utf-8') >>> data '\xe9\x95\xbf\xe5\x9f\x8e' >>> print data 闀垮煄 >>> print data.decode('utf-8') 长城
# 2. gbk
>>> data = u'长城'.encode('gbk') >>> data '\xb3\xa4\xb3\xc7' >>> print data 长城 >>> print data.decode('gbk') 长城
分——————割—————————线———————————————————
几个知识点
1.string.decode(encoding='UTF-8', errors='strict'):以 encoding 指定的编码格式解码 string,如果出错默认报一个ValueError 的 异常 , 除非 errors 指的是 'ignore' 或者 'replace'
string.encode(encoding='UTF-8', errors='strict') :以 encoding 指定的编码格式编码 string,如果出错默认报一个ValueError 的异常, 除非 errors 指定的是'ignore'或者'replace'
>>> str = "this is string example....wow!!!" >>> print str this is string example....wow!!! >>> str =str.encode('base64','strict') #以指定的base65编码格式编码 >>> print str dGhpcyBpcyBzdHJpbmcgZXhhbXBsZS4uLi53b3chISE= >>> print str.decode('base64','strict') #以指定的base65编码格式解码 this is string example....wow!!!
2.unicode 字符
>>> print 'hello'.encode('UTF-8') hello >>> print 'hello'.decode('UTF-8') hello>>> >>> print 'hello'.encode('base64') aGVsbG8=>>> print 'hello'.encode('ascii') hello >>> print 'hello'.decode('ascii') hello>>> print '长城'.encode('gb2312') UnicodeDecodeError: 'ascii' codec can't decode byte 0xb3 >>> print u'长城'.encode('gb2312') 长城 >>> print '长城'.decode('gb2312') 长城 >>> print '长城'.decode('ascii') UnicodeDecodeError: 'ascii' codec can't decode byte 0xb3
>>> print unicode('长城') UnicodeDecodeError: 'ascii' codec can't decode byte 0xb3 >>> print unicode('长城','gb2312') 长城>>> print unicode('你好','gb2312') 你好 >>> print '你好' 你好 >>> s='你好' >>> print s #str():给人看的 你好 >>> s #repr():给计算机看的 '\xc4\xe3\xba\xc3'
3.python乱码问题
一直以来,python中的中文编码就是一个极为头大的问题,经常抛出编码转换的异常,python中的str和unicode到底是一个什么东西呢?
在python中提到unicode,一般指的是unicode对象,例如'哈哈'的unicode对象为 u'\u54c8\u54c8'
而str,是一个字节数组,这个字节数组表示的是对unicode对象编码(可以是utf-8、gbk、cp936、GB2312)后的存储的格式。这里它仅仅是一个字节流,没有其它的含义,如果你想使这个字节流显示的内容有意义,就必须用正确的编码格式,解码显示。
对于unicode对象哈哈进行编码,编码成一个utf-8编码的 str-s_utf8,s_utf8就是是一个字节数组,存放的就是'\xe5\x93\x88\xe5\x93\x88',但是这仅仅是一个字节数组, 如果你想将它通过print语句输出成哈哈,那你就失望了,为什么呢?
因为print语句它的实现是将要输出的内容传送到操作系统,操作系统会根据系统的编码对输入的字节流进行编码,这就解释了为什么utf-8格式的字符串“哈哈”,输出的是“鍝堝搱”,因为 '\xe5\x93\x88\xe5\x93\x88'用GB2312去解释,其显示的出来就是“鍝堝搱”。这里再强调一下,str记录的是字节数组,只是某种编码的存储格式,至于输出到文件或是打印出来是什么格式,完全取决于其解码的编码将它解码成什么样子。
转载于:https://blog.51cto.com/dragonball/1419969