编写一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