在Python中查看字符对应Unicode数值的方法:
>>> "中".encode("unicode_escape")b'\u4e2d'>>> b'\u4e2d'.decode("unicode_escape")'中'需要注意的是,Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储 。比如,汉字严的 Unicode 是十六进制数4E25,转换成二进制数足足有15位(1001110 00100101),也就是说,这个符号的表示至少需要2个字节 。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多 。这里就有几个严重的问题,第一个问题是,计算机如何才能区别 Unicode 和 ASCII ?还有计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果 Unicode 统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储或传输来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的 。它们造成的结果是:出现了 Unicode 的多种存储方式,也就是说有许多种不同的二进制格式,可以用来表示 Unicode 。也导致了Unicode 在很长一段时间内无法推广,直到UTF编码的出现 。
UTF-8编码由于Unicode比较浪费网络和硬盘资源,因此为了解决这个问题,就在Unicode的基础上,定制了一套编码规则(将「码位」转换为字节序列的规则【编码/解码 可以理解为 加密/解密 的过程】),这个新的编码规则就是UTF-8 。UTF-8采用1-4个字符进行传输和存储数据,是一种针对Unicode的可变长度字符编码,又称万国码 。
Unicode与Utf-8编码规则:使用下面的模板进行互转
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 10xxxxxxUnicode字符通过对应模板加上标志位就后是Utf-8编 。例如:"迷" Unicode的编码为 \u8ff7 用二进制表示为:?10001111 11110111?,8ff7处于第三个模板范围内,把10001111 11110111 按模板分成三份 1000 111111 110111,然后加上标志位的二进制为:11101000 10111111 10110111 所以utf-8编码是"?E8BFB7?"
Python中Unicode字符转UTF-8编码:
>>>'迷'.encode('utf-8')b'\xe8\xbf\xb7'那么如何区分utf-8各个字符的?utf-8区分每个字符的开始是根据编码的高位字节来区分的,比如:用一个字节表示的字符,第一个字节高位以"0"开头;用两个字节表示的字符,第一个字节的高位为以"110"开头,后面一个字节以"10开头";用三个字节表示的字符,第一个字节以"1110"开头,后面两个字节以"10"开头;用四个字节表示的字符,第一个字节以"11110"开头,后面的三个字节以"10"开头 。这样计算机就可以认出每个字符由几个字节组成,才能显示出正确的信息 。
UTF-8和Unicode转换比如汉字"智",utf-8编码是"\xe6\x99\xba"对应的二进制为:"11100110 10011001 10111010",由于utf-8中一个汉字是3个字节,所以对应的模板为:
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
11100110 10011001 10111010 | UTF-8编码成的二进制1110xxxx 10xxxxxx 10xxxxxx | 对应模版 0110 011001 111010 |去除模版中的标志位后01100110 01111010代表十六进制667A,因此根据规则转换得出"智"Unicode的编码为667A 。
同样,根据Unicode中字符的编码位置,也能找到对应的utf-8编码 。例如:UTF-8编码:\xe8\xbf\xb7,用二进制表示为:?11101000 10111111 10110111?,有3个字节属于第三个模板范围,按模板去掉标志位后是:1000 111111 110111,结果就是'迷'字的Unicode字符 8ff7 。
>>> b'\u8ff7'.decode('unicode_escape')'迷'Unicode与GBK编码的转换Unicode 与 GBK 是两个完全不同的字符编码方案, 其两者没有直接关系 。如果要对其进行相
互转换, 最直接最高效的方法是查询各自的字符对照表 。
Python实现Unicode与GBK转换(将Unicode对应数值:\u8ff7转GBK字符方法):
>>> l_u = b'\u8ff7'.decode('unicode_escape')>>> l_u.encode('gbk')b'\xc3\xd4'UTF-8、Unicode与GBK的关系Utf-8(utf-16)====编码====Unicode=====编码=====GBK(ANSI)
Utf-8(utf-16)====解码====Unicode===解码=======GBK(ANSI)
推荐阅读
- 电脑的几个基本常识
- 阿里P7架构师浅析:如何优化Java程序设计、编码提高性能
- 蓝牙音频编码哪个音质好?今天我们来逐一解读
- 并使用java实现 一文彻底看懂Base64编码解码原理
- 二进制世界的秘密
- 计算机体系基础
- MySQL数据库锁理论
- 计算机基础必考知识 计算机基础试卷
- 浅谈计算机中的hosts文件
- 计算机语言介绍:机器语言、汇编语言、高级语言