1

好像写Python的人经常遇到这个问题,如果是一个新手,对网上的解答简直头都大了.如果又是Python2.x,简直了都(历史原因,不赘述)
但是,字符串编码是经常要面对的问题,不可不察.

Unicode与各种编码格式

我的理解是:Unicode是一种规则,法则,抽象的,飘在空中的; 而各种编码则是工具,把Unicode字符捣鼓成我们想要的东西. 在Python中,Unicode充当着解决各种字符编码问题的桥梁

数据(字符串)与Python程序无非两种关系: 数据流到Python程序中(输入),Python程序流出各种数据(输出).

数据从外部(文件,网络等地方)-->Python程序时

先不急,用一个unicode接住它们,然后再进行之后的各种操作

content = unicode(originalContent, 'src_data_encoding')  #此处必须要知道源的编码格式

数据从Python-->外部时

Unicode字符是不能随便写的,要先把我们的Unicode编码成具体编码格式,然后再写出

content = unicodeContent.encode(encoding) #必须要清楚目的地能接受的编码格式

其他需要知道的

1 Python有时会「自作主张地」转换我们的unicode(以ascii格式),简直stupid,ascii就那么几个字符,肯定经常抛UnicodeEncodeError啊
2 Python有时能猜到目的地的编码,猜到万幸,没有猜到就抛错误
3 使用Windows_中文版的人需要知道它的cmd控制台是gbk编码的
4 Linux等就好多了,我总是「如果不清楚该使用什么编码,那就是utf-8了」
5 文件头加一个coding=utf-8什么的/或者通过sys模块
6 always be utf-8-no-bom总是好的,所有IDE/editor都默认编码为utf-8-no-bom,可以省去许多麻烦(其中Windows的记事本少用,一不小心就忘记了记事本会插入BOM这一事实)
7 如果能用Python3就绝不使用Python2,3修补了字符串的许多坑(不只是unicode这一项)

举例

1 Windows_cmd控制台打印unicode

Windows8中文版-Python2.7
s = u'中国人民'
print s  #ok,看来Python知道应该使用什么编码,隐式转换了
print s.encode('gbk')  #ok,目的地能接受gbk
print s.encode('utf-8') #fail,看来万能的utf-8不好用啦,因为目的地不接受

2 有时候从网页获取来的数据可能是utf-8的,但是打印到Windows_cmd控制台出错了

content = unicode(contentFromHtml, 'utf-8')  #当然也有可能是其他编码
print content.encode('gbk')  #转换层控制台能接受的编码

总结

unicode是一座桥梁,连接这桥这头与那头


浮生若梦的编程
2.8k 声望21 粉丝

联系邮箱: he.zhimingATfoxmail.com


引用和评论

0 条评论