# -*- coding:gb2312
CODEC1 = 'gbk'
CODEC2 = 'utf-8'
CODEC3 = 'ansi'
FILE = 'C:/Users/songchen.OF3D/Desktop/chn.txt'
#hello_out = u"Hello world沙发呢\n"
#bytes_out = hello_out.encode(CODEC)
#f = open(FILE, "w")
#f.write(bytes_out)
#f.close()
f = open(FILE, "r")
bytes_in = f.read()
f.close()
try:
hello_in = bytes_in.decode(CODEC1)
except:
try:
hello_in = bytes_in.decode(CODEC2)
except:
try:
hello_in = bytes_in.decode(CODEC3)
except:
print "failed"
print hello_in,
几个原则摘抄自“python核心编程”:
处理unicode时,程序中出现字符串时,前面一定要加u
不要用str(), 用unicode()函数代替
不要调用string模块,如果传给他非ASCII字符,会报错
不到必须时,不要再程序里编解码unicode字符。只在要写入文件或数据库或网络时,才调用encode函数;只在需要把数据都回来时,才调用decode函数。
也就是说,程序中处理的字符串最好始终是unicode类型的,在读入的时候,通过decode(type)正确的type来得到对应的unicode
写出的时候,通过encode(type)把对应编码类型字符写入到文件中
那么如何知道读入的文件是什么类型的编码呢,有人说通过第三方库chardet;
我想到一个通过多个try...except...块来判断的方法,常用的类型也就那么几个;
还有一个方法,通过win32com或者其他什么途径,先把文件转存成统一格式,再操作,不过这个方法就要针对具体问题而言了,而且有可能会丢失一些信息吧,比如图片图表或者不同语言。
PS.注意上面代码例子中的最后一行,很有意思
print hello_in,
在输出的同时不换行,而如果
print hello_in
则会多出一个空行