关于python编码的基本常识
- 在python里面 “明文”是
unicode
类型 “密文”是其他的编码格式 如gbk
utf-8
latin-1
等等 - 编码: “明文”->”密文”
.encode([目标编码格式])
对象必须为unicode
类型 - 解码: “密文”->”明文”
.decode([源编码格式])
对象为str
类型 - 对于汉字 一共有三大类编码方式
- 以中文汉字”李”为例子
- a. unicode类 机器码
\x67\x4e
- unicode(python表示)
\u674e
- HTML Entity
李
- UTF-16(BE)
0x674E
- UTF-32(BE)
0x0000674E
- unicode(python表示)
- b. UTF-8类 机器码
\xe6\x9d\x8e
- UTF-8(python表示)
\xe6\x9d\x8e
- URL Escape Code
%E6%9D%8E
- Octal Escape Sequence
\346\235\216
- UTF-8(python表示)
- c. gb类 机器码
\xc0\xee
gb2312
gbk
gb18030
\xc0\xee
- 在python里面 “明文”是
设置.py文件的编码格式
- .py文件中出现的字符串文字量的编码格式
- 包括前面带u的(转换成unicode格式的字符串) 首先也是根据设置的文件编码格式读取字符串文字量 再作unicode的转换
- 如果没加coding编码的设置 将默认设置为操作系统的默认编码
- 操作系统的默认编码 windows下为ascii
- 可以从出错信息看出来
SyntaxError: Non-ASCII character '\xe6' in file... , but no encoding declared;
- 另外从
sys.getdefaultencoding()
亦可得知
>>> sys.getdefaultencoding()
'ascii'
- 可以从出错信息看出来
设置方式 在.py文件首部 加上代码
#coding=<encoding>
- 根据不同的编辑器,确定不同的
<encoding>
- Sublime Text编辑器:
- 由于ST编辑器默认即为UTF-8编码 所以
<encoding>
为utf-8
- 由于ST编辑器默认即为UTF-8编码 所以
- 系统自带的记事本:
- 记事本默认编码为ascii/gbk(“另存为”中编码选项为”ANSI”) 要正确读取.py文件里的中文 设置为gbk
- 记事本”另存为”的4种编码方式含义
- ANSI: 对英文系统即ASCII 对中文系统即gbk/big5
- Unicode: UTF-16(LE)
- Unicode big endian: UTF-16(BE)
- UTF-8
- 根据不同的编辑器,确定不同的
字符串文字量的类型
前面加u 为’unicode’类型
>>> str_u = u"中文" >>> type(str_u) <type 'unicode'>
前面不加u 为’str’类型
>>> str = str_u.encode('gbk') >>> type(str) <type 'str'> >>> str1 = "中文" >>> type(str1) <type 'str'>
关于print输出中文字符串
unicode类型 编码为’gbk’均可正常显示文字
>>> str = "中文" >>> print str 中文 >>> str_u = u"中文" >>> print str_u 中文
编码为’ascii’ 则会出现
UnicodeEncodeError
错误>>> print str_u.encode('ascii') Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
编码为’utf-8’ 则会乱码显示
>>> print str_u.encode('utf-8') 涓枃
Windows的文件/文件夹的中文名字
- 都是gbk编码
- 所以在读写文件/文件夹名字时 必须先
.encode('gbk')
Windows读写文件内容
- 跟文件名字不一样,文件内容的编码视需求而定(gbk/utf-8)
- 建议编码成
utf-8
这样Sublime Text打开后不需要ConvertToUTF8
爬虫结果的存储
- 现在的网页基本都是UTF-8编码(HTML5默认编码)
- 经过BeautifulSoup处理后的HTML元素内容 类型为
NavigableString
- 可以直接print 由第3点可推断出
NavigableString
底层类型为unicode
- 经过
.replace()
方法后可转换为unicode
类型
日语假名和日语汉字
- 上述说明中所有涉及’gbk’编码的中文处理方式 同样适用于日语假名和汉字
其他
- 这篇文章提倡的最佳实践
- 不使用sys.setdefaultencoding(‘utf-8’)解决编码问题
- 字符串中间处理过程全部转化为unicode处理 只在数据的入口和出口作相应的.decode()和.encode()处理 - 查阅文字的unicode类编码和UTF-8类编码
- 这篇文章提倡的最佳实践