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

关于现实中文字符,总会遇到很多问题,比方说在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.getdefaultencoding()
'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:)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值