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记录的是字节数组,只是某种编码的存储格式,至于输出到文件或是打印出来是什么格式,完全取决于其解码的编码将它解码成什么样子。