python 中文乱码解决方法

比如我从网上下载一些信息或写个电子邮件程序下载到本地,以记事本(txt)
形式写入并保存在本地计算机,为什么看到只是英文和乱码的?该怎样做呢?

乱码原因:
因为你的文件声明为utf-8,并且也应该是用utf-8的编码保存的源文件。但是windows的本地默认编码是cp936,也就是gbk编码,所以在控制台直接打印utf-8的字符串当然是乱码了。

解决方法:
在控制台打印的地方用一个转码就ok了,打印的时候这么写:

print myname.decode('utf-8').encode('gbk')

比较通用的方法应该是:

import sys
type = sys.getfilesystemencoding()
print myname.decode('utf-8').encode(type)

下面我们看常用的中文乱码解决方法集

方法一:

在文件的开头加入编码声明:

#coding = gbk

s = '谷歌'

print s

输出结果:谷歌

 


方法二:

在输出时进行转码:

#coding = utf-8

s = '谷歌'

print unicode(s,'gbk')

输出结果:谷歌

txt文件中文乱码处理

某些软件,如notepad,在保存一个以utf-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xef 0xbb 0xbf,即bom)。因此我们在读取时需要自己去掉这些字符,python中的codecs module定义了这个常量

# coding=gbk 

import codecs

data = open("test.txt").read()

if data[:3] == codecs.bom_utf8:

datadata = data[3:]

print data.decode("utf-8")


用unicode函数和decode方法把str转换成unicode。为什么这两个函数的参数用"gbk"呢?
第一反应是我们的编码声明里用了gbk(# coding=gbk),但真是这样?
修改一下源文件:

# coding=utf-8
s = "中文"
print unicode(s, "utf-8")


运行,报错:

traceback (most recent call last):
  file "chinesetest.py", line 3, in <module>
    s = unicode(s, "utf-8")
unicodedecodeerror: 'utf8' codec can't decode bytes in position 0-1: invalid data


显然,如果前面正常是因为两边都使用了gbk,那么这里我保持了两边utf-8一致,也应该正常,不至于报错。
更进一步的例子,如果我们这里转换仍然用gbk:
# coding=utf-8
s = "中文"
print unicode(s, "gbk")
结果:中文

;