Unicode 与 UTF-8 编码详解


基础概念

  • 解码:字节流 —> Unicode对象
  • 编码:Unicode对象 —> 字节流

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。UTF-8是Unicode的最常见的一种实现方式


Unicode 与 UTF-8

完整版请点链接:《字符编码详解》

UTF-8的编码规则很简单,只有二条:

对于单字节的符号,字节的第一位设为0,后面7位为这个符号的Unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的
对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的Unicode码

Unicode符号范围(十六进制)UTF-8编码方式(二进制)
0000 0000 - 0000 007F0xxxxxxx
0000 0080 - 0000 07FF110xxxxx 10xxxxxx
0000 0800 - 0000 FFFF1110xxxx 10xxxxxx 10xxxxxx
0001 0000 - 0010 FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

上表中第一列是十六进制。十六进制的两位相当于二进制的八位,即一个字节。上表中0000 007F是4个字节。

下面,还是以汉字“严”为例,演示如何实现UTF-8编码。

已知“严”的Unicode是4E25(0100 1110 0010 0101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此“严”的UTF-8编码需要三个字节,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,“严”的UTF-8编码是“11100100 10111000 10100101”,转换成十六进制就是E4B8A5。

下面,举一个实例:

打开记事本Notepad.exe,新建一个文本文件,内容就是一个“严”字,依次采用ANSI,Unicode,Unicode big Endian 和 UTF-8编码方式保存。然后,用文本编辑软件UltraEdit的”十六进制功能“,观察该文件的内部编码方式。

  • ANSI
    文件的编码就是两个字节“D1 CF”,这正是“严”的GB2312编码,这也暗示GB2312是采用大头方式存储的
  • Unicode
    编码是四个字节“FF FE 25 4E”,其中“FF FE”表明是小头方式存储,真正的编码是4E25。
  • Unicode big Endian
    编码是四个字节“FE FF 4E 25”,其中“FE FF”表明是大头方式存储。
  • UTF-8
    编码是六个字节“EF BB BF E4 B8 A5”,前三个字节“EF BB BF”表示这是UTF-8编码,后三个“E4B8A5”就是“严”的具体编码,它的存储顺序与编码顺序是一致的

比如,汉字“严”的Unicode是十六进制数4E25,转换成二进制数足足有15位(100111000100101),也就是说这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。


Code Page

用对应的某个数字,Code Page Number,即Code Page中的标识符(Identifier),表示相应的字符编码。

而一般Code Page也常缩写为CP

比如,CP936表示GBK中文编码,CP65001表示UTF-8编码,CP54936表示GB18030编码,CP950表示BIG5繁体中文等等。


各种中文字符编码标准的关系

  • (中国大陆的标准)GB 13000.1-93
    =(国际标准)Unicode 1.1

  • (中国大陆标准)GB2312-80
    = 简称GB2312
    = Windows系统中的原先的CP936

  • (微软制定的)GBK
    = (微软在编码方面)对 GB2312 的扩展
    = (微软在所包含字符方面上包含了)GB 13000.1-93 + 其他部分汉字+ 台湾和香港的繁体 + 日语 + 朝鲜汉字
    = Unicode 1.1 + 其他部分汉字+ 台湾和香港的繁体 + 日语 + 朝鲜汉字

对于GBK:
在编码方面:向下兼容GB2312,但是和GB 13000不同
在内容方面:等价于GB13000

  • 微软中现在的新的CP936
    = GBK
    =兼容旧的GB2312

在技术编码方面上,演化顺序为:
ASCII ⇒ GB2312 ⇒ GBK ⇒ GB18030
后者对之前的,都是支持之前的编码,即向下兼容,即同一个字符,在这些编码中,都是同样的值,后面的标准,支持更多的字符。

区分中文编码的方法是高字节的最高位不为 0。

按照程序员的称呼,GB2312、GBK 到 GB18030 都属于双字节字符集 (DBCS)

中文字符相关编码标准

编码标准别名标准所属包含字符
ASCII国际通用
GB2312微软Windows中以前的CP936中国大陆6763个汉字和682个其它符号
Unicode 1.1国际通用20,902个字符
GB13000中国大陆20,902个字符
GBK微软Windows中现在的CP936微软21886个符号
GB18030微软Windows中的CP54936中国大陆27484个汉字+其他少数民族字符
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值