在windows的环境下使用Python有时面临一个问题,那就是处理中文时出现乱码的问题,下面举个例子:
s1 = "中文文本"
fr = open('in.txt')
s2 = fr.readline()
fr.close()
print "s1: ", s1
print "s2: ", s2
if s1 == s2:
print "s1: ", s1, "等于", "s2: ", s2
else:
print "s1: ", s1, "不等于", "s2: ", s2
这个脚本中,s1和s2是两个中文字符串,其中s1直接由脚本给出,而s2的值从下面的文件读得:
将它们各自的内容输出,然后比较两个字符串,看看它们是否相等。
虽然它们的文本内容是相同的,但是运行了这个脚本之后却得到了如下结果:
这就是其编码方式不同造成的,我们可以在python shell中看它们各自的编码:
造成这个问题的原因是,windows系统的默认编码系统是GBK,而python解释器的默认编码系统是UTF-8。
这样一来,由于s1是直接由代码给出,因此s1的编码方式是UTF-8,而s2由文件读得,所以s2的编码方式是GBK。
(值得一提的是,windows同样可以正常显示UTF-8编码的文件,而gbk编码的字符串,python解释器也可以将其正常的输出,但是互相比较就不行)
要解决上面的问题也非常简单:
上面的指令中s3为s2用GBK解码之后的结果得到的是“测试文本”这个字符串的标准Unicode表示法,而s4是s3经过UTF-8编码之后的结果,得到的是该Unicode的字节码。可以看到s4此时就和s2的值是一样的了。
所以要比较s2和s1,需要进行转码:
这样一来,输出就是两者相等: