在编写bash终端应用程序中,如果字符串里含有中文字符,可能会出现乱码。
这里以Win 10为例进行代码测试,utf8.py的内容如下:
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
value = '蚁方阵'
print value
以Windows的CMD终端运行代码:
python utf8.py
# 输出 铓佹柟闃 乱码
至于乱码的原因,因为python文件的编码为UTF-8,而CMD终端的解码格式为GBK,所以出现乱码,详细的分析过程见《JAVA总结(二):字符的编码与解码》。
解决办法很简单,必须要以文件的方式进行解码,然后以输出终端进行编码,如下:
value = '蚁方阵'
print value.decode('UTF-8').encode('GBK')
现在控制端输出终于正常,不过需要注意的是,不同的终端采用的解码方式也不一样,所以即使是在同一台机器上,不同的终端也可能出现不同的结果,以我的测试为例,在MINGW64上,第一段代码输出无乱码,windows自带CMD控制台则出现乱码,执行编码与解码过程后,则刚好相反。
除了上述的解决办法,还可以直接在代码中写入UTF-8字符,如下:
# '蚁方阵'的UTF-8编码
value = ur'\u8681\u65B9\u9635'
# 对UTF-8终端正常
print value.encode('UTF-8')
# 对非UTF-8终端正常
print value
但是依旧存在上面的问题,对于输出为UTF-8的终端显示正常,对输出为GBK编码的终端则为乱码,更有意思的是,上面的第二局输出如果在UTF-8终端上进行测试,还直接报错,如下:
Traceback (most recent call last):
File "./utf8.py", line 3, in <module>
print value
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2:
ordinal not in range(128)
结论
解决乱码问题一定要依照输入文件(字符)的编码与输出显示方式的解码,只有掌握了它们之间的转换关系,才能彻底解决乱码。