编码问题
- 为什么需要编码问题
- 本质是计算机只能识别01代码
- 如何用一串01代码表示负责的信息
- 编码简史
- 二进制
- bit:一个0或者1的二进制数字
- byte:八个01代码,字节
- 第一阶段:ASCII
- 第二阶段:百花齐放,GBxxxx(中国),BIG5(台湾、韩国),Latin1(欧洲),JIS(日本),ANSI-MBCS(Multi-btes charecter set,多字节字符集)
- 第三阶段:Unicode(ISO)
编码表示方法
- ASCII-american standard code for information interchage
- 所有控制字符(包括回车,删除等)编码在0-31范围以及127
- 所有标点符号,英文大小写放在32-126之间
- 预留128-255之间位置
- 0xxx xxxx 是它的编码形式
- Latin1
- 0-127的所有位置不动,那么可以兼容ASCII,二进制0xxx xxxx
- 128-159之间控制字符
- 160-255位文字符号
- 其中包括西语言、希腊语、泰语、阿拉伯语、希伯来语
- 欧元符号
- GB2312
- GBK
- GB18030
Unicode编码
- 只是一个码表,具体实现没有规定
- 0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符
- 中文的编码范围为4E00-9FCF,其中9FC4-9FCF之间的区间没有使用
- 上述区间全部是汉字,不包含全角字符,不包含特殊文字
- UTF
- UTF-8
- UTF-16 早期Utcode历史遗留问题
- UTF-32 浪费空间
- UCS-2
- USC = UniversalCharacterSet,通用字符集
- USC-2与Unicode相同
- 采用2个字节,定长的表示每一个字符,所以总计可以表示2^16个字符
- UCS-4
- 第一个字节
- 第二个字节
- 第三个字节
- 第四个字节
- 如果UCS-4前两个字节为0,则就是UCS-2
常用概念
- 编码/解码:用人类可以直接读取信息转换称bytes格式,叫编码
- 大尾(BigEndian)和小尾(LittleEndian)
- ‘汉’ -> 6C49
- 6C49 -> BigEndian
- 496C -> LittleEndian
- BOM
- UTF-8没有字节顺序问题
- UTF-16会出现问题
- BOM-ByteOrderMark
- ” ZRRO WIDTH NO-BREAK SPACE" - FEFF,在UCS中不存在
- FEFF -> BigEndian
- FFFE -> LittleEndian
- UTF-8表示编码,FEFF的UTF-8编码是EF BB BF
Python编码问题
>>> b = bytes.fromhex('E4 B8 AD')
>>> b
b'\xe4\xb8\xad'
>>> b.decode('utf-8')
'中'
>>> str(b)
"b'\\xe4\\xb8\\xad'"
>>> ord('A')
65
>>> ord('中')
20013
>>> chr(65)
'A'
>>> chr(20013)
'中'
- python文件默认utf-8编码,如果特殊需要,需要声明
- 放在第一行,或者第二行
- ‘’’# * coding:windows-1252 *’’’
- code point方式比较字符串,可能会带来问题
- 重音符号的表示
- 使用unicodedata.normalize 函数
- Python源码中出现了解码错误,那么会产生SyntaxErro异常
- 其他情况下,如果发现编码解码错误,那么会产生UnicodeEncodeError,UnicodeEncodeError
参考资料
- https://www.cnblogs.com/jessonluo/p/4800331.html
- https://blog.csdn.net/xuejianhui/article/
- http://tools.jb51.net/table/gb2312