python中的i18n心得小节

1. 文件开头的 # coding=XXX
是告诉别人/解释器/文本编辑器本文件存储时所用的编码方式
若声明 # coding=utf8 则保存时一定注意存成utf8编码的文本文件
一般用 # coding=gbk 这样不但支持汉字也不需要刻意存储utf8

2. 编码(code)不等于编码点(unicode code point)
例如:汉字 “你”的unicode编码点为:U+4F60,utf8码为:e4 bd a0
print 输出是按照系统使用的编码页进行的,如果是中文windows系统则使用cp936,
所以一个 utf8 编码的汉字在 print前要先decode。
例如:
一个声明为 # coding=utf8 的文件中有汉字 a = '你'
在中文windows控制台下的python环境里
a                          # 输出:'\xe4\xbd\xa0'
print a                    # 输出:浣犲ソ
print a.decode('utf8')     # 输出:你

3. python控制台下的输入为当前系统编码页的对应码或unicode,unicode采用2字节码还是4字节码取决于python编译时的设置,一般为2字节码。
例如:
a = '你'                    # a的编码为'\xc4\xe3'
b = u'你'                   # b的编码为u'\u4f60'
print a, b                  # 输出均正确
b.encode('utf8')            # 得到 '\xe4\xbd\xa0'
a.decode('cp936').encode('utf8') == b.encode('utf8')    # True
值得注意的是:
a.decode('cp936')得到的是unicode。换言之,unicode并不是encode到的,即unicode不是一种编码方案,它是一个编码点表,各种编码方案安装这个表进行自己的映射,映射方法是encode('XXX')。
python内置的unicode方法也是上述映射的逆(另一个逆自然是decode),例如:
a = '你'
b = a.decode('cp936').encode('utf8')
unicode(a, 'cp936') == unicode(b, 'utf8')               # True