记录学习笔记、分享资源工具、交流技术思想、提升工作效率

字符-unicode字符集-utf-8之间关系

后端 xiaomudk 6年前 (2016-02-26) 2594次浏览 0个评论
文章目录[隐藏]

字符-unicode字符集-utf-8之间关系

之前一直以为字符(英文、中文)直接转化成utf-8、utf-16等编码,所以每次到网站上做utf-8编码转字符时,都无法正常完成。(实际上是用的unicode编码误做utf-8编码转换字符)。

ASCII码

什么样的内容可以被称作一字节?一个字节有256种状态,每种状态代表一个字符。从00000000-11111111

举例:ASCII码一共规定了128个字符的编码,比如SPACE是32(二进制:00100000),大写字幕A是65(二进制是:01000001)

unicode 字符集带中文等其他国家字符集

英语128个符号就够了,但是用来表示其他国家的字符就不够,需要扩展ASCII编码,这时候就引入了unicode编码表,低位兼顾使用ASCII编码表不变,高位排列各个国家的编号和字符。
举例:汉字就有几万个,如果把汉字加入字符集至少需要256 * 256 = 65536 ,2字节的容量才能存储的下,
印象里java用的是unicode字符集,占用2字节,但是光汉字就有10w多个,2字节的范围不能完全表示下,
这里引出:ucs-4是一个更大的尚未填充完全的31位字符集,加上恒为0的首位,共占据32位,即4字节。理论上最多能表示2的32次方,完全可以覆盖一切语言所用的符号

字符编码

utf-8 utf-16 utf-32编码诞生原由

但是对于字符集的编号如何存储,对于不同的应用场景,人们有着不同的需求,从而衍生出,如何存储这些字符集编号。
举例:对于unicode字符集,每个字符定常需占用2-4个字节(取决于字符集最大编号的范围)。如果希望把数据通过网络传输,比如超文本传输协议,由于带宽限制,人们希望尽量发送小的数据包。观察html文本,大多数数据都由二十六个英文字母组成,我们能否通过改变字符占用的字节长度,从而大道压缩数据量的目的?
比如:26个英文字母,我们用ASCII字符集编码只需要占用一个字节就能表示,然后汉字集合,我们需要占用2个字节内存存储。

那么我们如何压缩unicode 编码才能达到理想的数据压缩效果同时不产生表述歧义?

utf-8 编码定义

互联网的普及,强烈要求出现一种统一的编码方式。UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式。其他实现方式还包括 UTF-16(字符用两个字节或四个字节表示)和 UTF-32(字符用四个字节表示),不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8 是 Unicode 的实现方式之一。

utf-8编码特点:可变长度

utf-8编码规则

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

下表总结了编码规则,字母x表示可用编码的位。

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,就表示当前字符占用多少个字节。

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

发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址