您的位置:首页 > 编程语言 > Python开发

快乐Python快速上手系列10 - 中文编码问题

2017-12-27 15:09 639 查看
关于现实中文字符,总会遇到很多问题,比方说在Python2.7中,默认情况,Python对字符的解码时采用ASCII的形式,这也是为什么当我们文件里添加了中文注释,或者字符串里包含了中文字符,python会报错如下:

if __name__ == '__main__':
s1 = "你好"
print(s1)
运行后错误信息为:

File "D:\PythonProj\TLDA_Analyser\Chinese_Sym.py", line 2
SyntaxError: Non-ASCII character '\xe4' in file D:\PythonProj\TLDA_Analyser\Chinese_Sym.py on line 5, but no encoding declared;
see http://python.org/dev/peps/pep-0263/ for details
纵然在字符串前面加上u也不行

if __name__ == '__main__':
s1 = u"你好"
print(s1)
运行错误依然为

File "D:\PythonProj\TLDA_Analyser\Chinese_Sym.py", line 3
SyntaxError: Non-ASCII character '\xe4' in file D:\PythonProj\TLDA_Analyser\Chinese_Sym.py on line 3, but no encoding declared;
see http://python.org/dev/peps/pep-0263/ for details
python默认的编码格式为ASCII,所以它无法解释中文字符。

>>> sys.getdefaultencodi
4000
ng()
'ascii'
>>>
解决方法,在文件的开头加入希望python采用的编码格式的声明,例如:

#coding=utf-8
或者
#-*- coding: UTF-8 -*-
总体代码示例如下:

#coding=utf-8

import chardet
if __name__ == '__main__':
s1 = "你好"
print(s1)
s_arr = bytearray(s1)
print(chardet.detect(s_arr))
if isinstance(s1, unicode):
print("S1 is unicode")
else:
print("S1 is not unicode")
s2 = u"你好"
s_arr = bytearray(s2, 'utf-8')
print(chardet.detect(s_arr))
if isinstance(s2, unicode):
print("S2 is unicode")
print(s2)
pass
输出

你好
{'confidence': 0.7525, 'language': '', 'encoding': 'utf-8'}
S1 is not unicode
{'confidence': 0.7525, 'language': '', 'encoding': 'utf-8'}
S2 is unicode
你好
但是在python3.5中就不存在这个问题啦,因为Python3.5的系统编码默认就是utf-8,下面代码在Python3.5中不需要担心任何的问题。

if __name__ == '__main__':
s1 = "你好"
print(s1)

pass
实际应用中,显示的时候还存在其他方面的问题,比方说,cmd的显示问题,
可以相应的更改其codepage来达到目的。
举例,
我们要获取的信息是:

©2015 Baidu 使用百度前必读 意见反馈 京ICP证030173号

  Windows cmd 用的是cp936,也就是中文的GB2312,在GBK的字符集里没有“©”,这就导致通过GBK解析的时候出现编码问题。

  这就像你在翻译英文的时候,出现了一个单词,这个单词你查遍了牛津大词典都没找到对应的含义解释,那么自然是会有问题的。

  那假设,我还就想在cmd下执行这个python程序了,那么可以去修改cmd的默认编码类型为utf-8,对应的编码为CHCP 65001(utf-8)。在cmd 下输入:chcp 65001 命令回车。



然后,修改cmd的字体为“Lucida Console”,再来执行程序就可以被正确输出了。
Wish you happy with python:)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: