额用python搞中文的时候还是略头疼了下SO特此总结:
环境XP系统python版本2.7.5开发环境ulipad
(0).要转换编码的时候都需要先解码成unicode然后在编码成对应的编码类型
比如已知字符串s的编码为utf8那么要转换为gb2312的代码为:
s.decode("utf8").encode("gb2312")
decode专门负责把某个字符串的编码格式解码成unicode编码,encode专门把unicode编码转化为对应的编码。
A编码->unicode编码->B编码
(1).创建的txt文本文件的默认编码方式是ANSI编码格式,所以我创建了个文件里面输入了“中国”两个字,然后读取直接print,显示正常。
#!/usr/bin/env python #coding=utf-8 import os file = open("d:\\test.txt") data = file.readline() print data
输出:中国
(2).紧接(1),我把文件编码转化为utf8格式,里面输入“中国”两个字,跟(1)同样的代码,输出结果为:
\xef\xbb\xbf\xe4\xb8\xad\xe5\x9b\xbd
丫的,要你输出中国2个字就那么难么--
这里需要注意的:
经过若干研究,从http://www.jb51.net/article/26543.htm中得出一卑鄙无耻的问题:
原来,某些软件,如notepad,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF0xBB0xBF,即BOM),而我正是用notepad做测试的。因此我们在读取时需要自己去掉这些字符,python中的codecsmodule定义了这个常量:codecs.BOM_UTF8
#!/usr/bin/env python #coding=utf-8 import os import sys import codecs file = open("d:\\test.txt") data = file.readline() if data[:3] == codecs.BOM_UTF8: data = data[3:] print "hello" data = data.decode("utf8").encode("gb2312") print data
输出:中国
现在我终于理解notepad里面有一个“以utf-8无BOM格式编码”的意思了
(3)gb2312编码对一些很生僻的中文字并不支持,比如“�濉薄捌}”,这个问题也头疼了半天:
可以参考http://blog.sina.com.cn/s/blog_6285b6f60100u1or.html
我在对从腾讯微博开放平台获取到的json进行输出的时候就用方法(2)就输出不了
会出现:
错误原因:'gb2312'codeccan'tencodecharacteru'\xb7'inposition8061:illegalmultibytesequence
解决方法就是把gb2312编码改成gbk编码就顺利输出了
(4)如果要打开一个含有中文的文件方法如下:
file = open((u"d:\\喜羊羊.txt").encode('gbk'),"r")