什么是编码
明文到编码文本的转换称为 "编码", 从编码文本又转回成明文则为 "解码"
ASCII
ASCII 编码: 256 种不同状态, 每种状态就唯一对应一个字符, 比如 A--->00010001, 而英文只有 26 个字符, 算上一些特殊字符和数字, 128 个状态也够用了; 每个电平称为一个比特位, 约定 8 个比特位构成一个字节, 这样计算机就可以用 127 个不同字节来存储英语的文字了. 这就是
GB2312
ASCII 对于中国来说产生一个问题, 就是没办法识别中文, 所以将 ASCII 编码重新写了一遍, 也就是形成了对 ASCII 的中文扩展, 大约可以支持 7000 多个简体汉字
GBK 和 GB18030 编码
由于 GB2312 支持的中文数量有限, 所以在 GB2312 的基础上进行了扩展, 扩展之后的编码方案被称为 GBK 标准, 而 GBK 包括了 GB2312 的所有内容, 同时又增加了近 20000 个新的汉字 (包括繁体字) 和符号
UNICODE 编码
诸多编码产生之后, 同样也引发了一个问题, 就是各国语言之间的编码互不通用, 计算机之间产生乱码现象, 为了解决这个问题, 国际标谁化组织对编码进行了统一, 而统一之后的编码被称为 unicode 编码.
UNICODE 是用两个字节来表示为一个字符, 它总共可以组合出 65535 不同的字符, 这足以覆盖世界上所有的语言和符号(包括甲骨文).
例子:
变量: s="I'm 苑昊 "
unicode 的方式 (UCS-2) 存储方式:
- I 00000000 01001001
- ' 00000000 00100111
- m 00000000 01101101
- 00000000 00100000
苑 10000010 11010001
昊 01100110 00001010
utf8
UTF-8(8-bit Unicode Transformation Format)是一种针对 Unicode 的可变长度字符编码, 它可以使用 1~4 个字节表示一个符号, 根据
不同的符号而变化字节长度, 当字符在 ASCII 码的范围时, 就用一个字节表示, 所以是兼容 ASCII 编码的
Unicode 是内存编码表示方案 (是规范), 而 UTF 是如何保存和传输 Unicode 的方案(是实现) 这也是 UTF 与 Unicode 的区别.
例子:
变量: s="I'm 苑昊 "
UTF-8 的存储方式:
- I 01001001
- ' 00100111
- m 01101101
- 00100000
苑 11101000 10001011 10010001
昊 11100110 10011000 10001010
必须要知道的知识点:
1. 在 python2 默认编码是 ASCII, python3 里默认是 unicode
2.unicode 分为 utf-32(占 4 个字节),utf-16(占两个字节),utf-8(占 1-4 个字节), so utf-16 就是现在最常用的 unicode 版本, 不过在文件里存的还是 utf-8, 因为 utf8 省空间
3. 在 py3 中 encode, 在转码的同时还会把 string 变成 bytes 类型, decode 在解码的同时还会把 bytes 变回 string
编码之间转换流程图:(仅适用于 py2)
编码转换实例:
基于 python2.x
- import sys
- print(sys.getdefaultencoding()) #打印系统默认的编码
- msg = "嗨, 宝宝"
- msg_GB2312 = msg.decode("utf-8").encode("gb2312")
- GB2312_to_GBK = msg_GB2312.decode("gbk").encode("gbk")
- print(msg) print(msg_GB2312)
- print(GB2312_to_GBK)
基于 Python3.x
- import sys
- print(sys.getdefaultencoding())
- msg = "嗨, 宝宝"
- #msg_gb2312 = msg.decode("utf-8").encode("gb2312")
- msg_GB2312 = msg.encode("gb2312") #系统默认就是 unicode, 不用再 decode
- GB2312_to_unicode = msg_gb2312.decode("gb2312")
- GB2312_to_utf8 = msg_gb2312.decode("gb2312").encode("utf-8")
- print(msg)
- print(msg_GB2312)
- print(GB2312_to_unicode)
- print(GB2312_to_utf8)
来源: http://www.bubuko.com/infodetail-2654868.html