编码和解码
将字符转化为字节的过程称为编码,将字节转化为字符的过程
>>> t = '中'
>>> type(t)
<type 'str'>
>>> print t
中
>>> t = '中'.decode('UTF-8')
>>> type(t)
<type 'unicode'>
>>> print t
中
>>> t = '中'.decode('GBK')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 2: incomplete multibyte sequence
>>> t = u'中'
>>> type(t)
<type 'unicode'>
>>> print t
中
>>> t = u'中'.encode('UTF-8')
>>> type(t)
<type 'str'>
>>> print t
中
>>> t = u'中'.encode('GBK')
>>> type(t)
<type 'str'>
>>> print t
��
两个问号表示出现了乱码
>>> t = '中'.encode('UTF-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
str调用encode时内部会先用ascii编码进行decode
>>> t = u'中'.decode('UTF-8')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py", line 16, in decode
return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u4e2d' in position 0: ordinal not in range(128)
unicode调用decode时内部会先用ascii编码进行encode
错误的原因
每个字符都对应一个编号,如果编号超过了一个字节的大小,就需要多个字节来存储和传输
此处的编码(encoding)指的是编解码所使用的规则的名称,不是指编码过程
- 字符是按字节存储和传输的
- 而展示则是按照字符来处理的
- 所以会出现字节和字符之间的转换
- 编码是字节和字符之间转换规则的实现
- 实现字节和字符之间的转换的编码有很多种
- 如果编码和解码用的规则不一致就可能导致乱码
报错和乱码的根本原因就是因为编码和解码所使用的编码不一致导致的,所以只有知道都有哪些编解码过程才能解决乱码的问题
参考
十分钟搞清字符集和字符编码
字符串,那些你不知道的事
Python2 中的编码问题
Python字符编码详解
立即停止使用 setdefaultencoding('utf-8')
Unicode中关于中文和其他特殊字符的编码范围
判断一个字符串中是否含有中文字符