python中的编码与解码
自我学习使用
Unicode
- Unicode只是一个符号集(而非编码方式),它只规定了符号的二进制代码。(囊括世界上所有文字)
- 因为Unicode如果统一规定3或4个字节表示,那么对于英文字母(1 Byte)在存储上过于浪费,所以又出现了许多不同的根据Unicode编码的方式。UTF-8就是其中之一。
UTF-8
- UTF-8 是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。
- 编码规则
- 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。即对于英语字母,UTF-8 编码和 ASCII 码是相同的。
- 对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。
Unicode符号范围 | UTF-8编码方式
(十六进制) | (二进制)
----------------------+----------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
根据上表,解读 UTF-8 编码非常简单。如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。
- 一般的Unicode编码指UCS-2方式(定长),即每个字符2个字节
- UTF-8,是对Unicode编码的压缩和优化,它不再要求最少使用2个字节,而是将所有的字符和符号进行分类:ASCII码中的内容用1个字节保存、欧洲的字符用2个字节保存,东亚的字符用3个字节保存。
计算机中的编码解码
- 当计算机在工作时,内存中的数据一直是以Unicode的编码方式(定长,较浪费)表示的,当数据要保存到磁盘或者网络传输时,才会使用utf-8编码进行操作。
这样,大家各取所需,皆大欢喜。 - 由于可节省空间或流量,在存储和传输时,大部分时候遵循utf-8编码
python3中的编码解码
- python中有两种字符串类型,str类型,存储类型为Unicode数据,bytes类型存储的是字节数据(UTF-8编码)。utf-8编码的中文占3个字节,unicode编码的中文占2个字节。(实例见参考2)
文件从磁盘到内存的编码
- 当我们在编辑文本的时候,字符在内存对应的是unicode编码的,这是因为unicode覆盖范围最广,几乎所有字符都可以显示。
- 当我们将文本等保存在磁盘时,数据通过某种编码方式编码成bytes字节串,如UTF-8,很好地节省了空间。当我们点击保存的时候,这些编辑软件已经"默默地"帮我们做了编码工作。
- 当我们再打开这个文件时,软件又默默地给我们做了解码的工作,将数据再解码成unicode,然后就可以呈现明文给用户了。
- 所以,unicode是离用户更近的数据,bytes是离计算机更近的数据。