额用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")