1. 苏葳的备忘录首页
  2. 编程

Python令人头大的编码问题

python 字符集 编码从Java到C# 每次学新语言时,在数据库或是文件操作时都会遇到头疼的字符编码转换问题,悲剧的Python也一样。洋人是有多幸福,英文的代码语句,英文的文档,不用知道什么是输入法,一个字节就能容纳下大多数西文符号。甚至网页设计时都能任性的随意下载英文字库。如果都用英文,程序员是否还用把精力浪费在什么UTF8,cp936,GB2312等等名词上?

编写一python程序,里面只有一句:

print '中国'

以windows 默认编码保存,用python test.py执行时,提示非ASCII字符之类。当然,是因为python文件默认以ascii方式保存。无法解析汉字。在前面加上

#-*-coding:utf-8-*-

另存文件为utf-8格式,执行,中文显示为乱码。

将字串改为u’中国’,此时执行,终于可以正常显示中文了。

试试u’中国’.encode(‘gbk’),仍可以正常显示。encode为utf-8,又变为跟不加u时一样的乱码。看来utf-8格式与windows默认编码的默认转换会出问题。

加放文档字符串__doc__

"""中国
"""

然后print u’中国’;print __doc__

中国两字显示正常,__doc__显示为乱码

改为__doc__.decode(‘utf-8′),显示中文正常。至此基本确认 u’中国’等于’中国’.decode(‘utf-8’) 实验证实了这一点,原理大约是u’中国’是Python的内部编码格式(unicode),而utf-8格式字串decode后,亦变为内部格式,而此格式是可自动转换为我中文xp的GBK或gb2312编码的。所以print语句可正常显示中文。

问题又来了,当将如上格式的程序标准输出和错误输出重定向至C# 的process.StartInfo.RedirectStandardInput中时,再次出现乱码。尝试修改p.StartInfo.StandardOutputEncoding,则有时winform中正常而命令行窗口出错,有时相反。

反复尝试,最后将u’中国’加上encode(‘gbk’)后,终于可以兼顾两种输出了。p.StartInfo.StandardOutputEncoding则用系统默认编码。看来C#程序重定向Python程序的输出时,没有进行默认的编码转换而已。而__doc__与程序内的字符串是完全一致的,可以在前面加上u然后再encode(‘gbk’)使其在重定向至C#的process对象输出时正常显示中文。

纠结了一天,问题终于解决。据说Python 3会有对unicode的改进,编码问题会轻松点吗?

原创文章,作者:苏葳,如需转载,请注明出处:https://www.swmemo.com/261.html

发表评论

邮箱地址不会被公开。 必填项已用*标注