问题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 sys reload(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