python2.7中文编码

来源:互联网 发布:mac迅雷界面看不见人物 编辑:程序博客网 时间:2024/05/22 17:24

问题1:在编辑器(如Notepad++)中

print '中文'SyntaxError: Non-ASCII

问题2:在编辑器(如Notepad++)中

#-*- coding:utf-8- *-print '中文'在windows cmd乱码:涓枃

问题3::在编辑器(如Notepad++)中

# -*- coding: utf-8 -*-print '中文'.decode('utf-8') #在cmd中结果正常

问题4:在cmd中

print '中文'结果正常

问题5:在编辑器(如Notepad++)中

# -*-coding: utf-8-*-import sysreload(sys)sys.setdefaultencoding('utf-8')print '中文'.encode('gbk')结果正常

然而

# -*-coding: utf-8-*-print '中文'.encode('gbk')UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

先说两个东西:
1.编辑器中的编码,可以由 --coding:utf-8-- 声明,若无此句,默认保存字符串的方式是ascii

2.终端里编码格式,windows中cmd默认为gbk格式
在问题1中,因为存在‘中文’这个非ascii字符串,导致报错。
问题2,加了--coding:utf-8--,没有报错,因为声明了字符串的保存方式是utf-8格式,但由于终端中的编码格式是gbk,所以乱码。

问题3,’中文’.decode(‘utf-8’)产生正确结果,是因为将utf-8格式字符串先转换为unicode,然后在终端cmd中python自动转换为gbk格式。

问题4,在cmd中,输入中文,结果正常。道理和在编辑器中一样。整体环境是gbk格式。输出环境也是gbk格式。

问题5,利用reload(sys),sys.setdefaultencoding(‘utf-8’),str.encode()= str.decode(sys.getdefaultencoding()).encode()

结论:保持终端和文本的编码方式一致

【补充 2017-12-4】
有时候不明白一个东西,往往是混淆了太多的概念。对一些基本概念进行梳理总结一番。

位(bit):0/1。储存容量的计量单位。

字节(byte):八位。储存容量的计量单位。

字符(character):计算机中使用的文字和符号。一个占一个字节位置或者多个字节单位。

字符串(String):一个或多个字符构造。

二进制(binary):用0,1数码表示数据(字符)的方式。在python中,以0b开头,如:0b11表示十进制3。

十六进制(Hexadecimal):用0-9,A-F数码表示数据(字符)的方式。计算机只能识别0,1,但用二进制表示数据太长,人不易读,所以可以用十六进制表示。注意这与实际储存在计算机里的容量没有关系,占用多少内存就是多少内存,十六进制只是表示方式。在python中以0x或\x开头,如:0x11表示17。

字符集(Character set):字符的集合。常见的字符集:ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集。

解码(decode):数据在不同格式之间的转换。解码是针对计算机而言的,可以理解将计算机不明白的东西解释给计算机听(当然实际上并不是这样),也就是将计算机读不懂的数据转换成计算机里已经储存好的信息(字符集),让计算机明白。

编码(encode):解码的逆过程。

字符集编码方式:字符集的编码规则。字符集都是计算机信息,表示一个个人类可以读懂或者需要的符号。对于不同字符集,它们都有各自的编码方式(规则)。常见的编码方式:ASCII、GBK、GB2312、CP936、UTF-8、UTF-16。

在python2.7中,有两种类型的字符集。一个是str主导的,另一个是unicode。str类型数据编码格式取决于具体环境。在Windows系统cmd中编码方式为cp936(查看命令chcp)。在编辑器中,若在第一行输入了#coding:utf-8,编码方式则为utf-8。

另外,转载一篇关于python2.7编码的文章,写得很详细。
转载:https://www.cnblogs.com/liaohuiqiang/p/7247393.html