Python 编码知识学习笔记

在平时工作中经常会涉及一些字符串编码和解码的知识,简单归纳总结如下。

1. 为什么需要字符串编码和解码?
文本内容是人类可以理解的一种符号表达,例如英语、德语、法语等,每种语言都使用自己的符号来表达某个单词/字的含义,例如 汉子 "中国" 是两个方块字,在英语里面是 "china" 是5个字母,但是都表达了相同的意思,为了区分不同语言,因此计算机需要能够区分每种语言的每个字,从而才能表达人类的任意想法。现代的电子计算机只能表达 0 或者1 ,是无法表达  字母或者方块字的,因此我们要想办法让计算机来表达方块字、字母和其他语言的字, 计算机能够表达0和1,0和1组合起来就是数字,因此我们可以用数字来对应想要表达的符号(字), 每一个数字对应一个符号,所有想表达的符号和数字的对应关系的集合就叫做字符集,字符集中的每一个数字叫做字码点(code point),例如  20013 对应符号 "中",这就是世界上一种流行的字符集unicode中的一个条目。
字符集中的每一个数字都代表一个符号,我们只需要在计算机里面存储这些数字就可以表达我们想要的符号了,通常现代32位计算机的整数类型都是32bit的,就是4个byte, 就是说每个4 byte长度的二进制位代表一个符号(汉子、字母、阿拉伯字母等等),理论上说这种方法是可行的,但是存在很多缺陷,我们不能使用32bit的二进制位来表达符号,主要的缺陷有一下几点:

  • 32bit的二进制太长,一一对应后,很多符号对应的二进制比特里面都是连续的0,很浪费空间,传输的时候也浪费带宽,大家都是花了银子的哈。
  • 不同的处理器有大端地址和小端地址的区分,这种表达方式兼容性不好。
  • 有很多互联网协议无法处理全部是0的字节
考虑到以上几种问题,我们不能直接使用数字的二进制表达来表示符号, 因此我们需要设计更好的方案解决上面所提的问题,就是说符号对应的数字在计算机里面不能直接用数字的二进制来表达,而是需要把每个符号对应的数字用更高效、通用性更好的二进制表达出来(对应起来),这个过程就叫做编码(encoding),把人类可以理解的数字转换成更加方便计算机处理的二进制字节就是编码,反过来的过程就是解码(decoding)。为什么要编码?就是为了让计算机更加方便处理,解决上面提到的那几个问题,解码则是为了让人类更容易理解二进制的含义。

2. 常见字符集和编码方式
目前世界通用的字符集有unicode字符集,可以表达世界上所有的语言和文字.
编码方式有很多,unicode字符集一般采用utf-8编码方案,中国的编码方案一般有GB2312, utf-8编码方案可以对unicode字符集中的所有字符进行编码,但是GB2312只能编码中文和普通字符符号,不能编码法文或者德文(我的理解待确认).
unicode 字符集可以表达目前世界上的所有文字,字码点范围 0x0-0x10FFFF,编码方案如下:

  • 小于128的字码点,直接使用对应的8位二进制值表示,只有一个字节长度
  • 大于128小于0x7FF的字码点,使用2个字节长度表示,每个字节的值位于128到255
  • 大于0x7FF的字码点,使用3个或者4个字节长度表示,每个字节的值位于128到255

下面是关于编解码的一些编程实践,仅供参考。

Python编码知识学习笔记

>>>a='' ===>a是一个编码之后的二进制,采用的操作系统默认的编码方式,类似于byte

>>>s=u'' ===>s是一个unicode类型,32bit整数,变量的内容为unicode的码字(codepoint)

>>>a

'\xd6\xd0' ===>如上所述当前系统是GBK编码,GBK编码的二进制值

>>>s

u'\u4e2d' ===>如上所述存储的是码字4e2d,和unicode定义一致

>>>print a

>>>print s

>>>a.decode('gbk').encode('utf-8') ===>对字符串解码后,在使用utf8进行编码

'\xe4\xb8\xad'

>>>s.encode('utf-8') ===>对码字4e2d使用utf8编码方案进行编码,输出编码后的二进制值和上

'\xe4\xb8\xad' ===>一步骤的内容一致

猜你喜欢

转载自blog.csdn.net/jinlxz/article/details/44539865