Unicode编码

news/2024/11/1 19:37:19/

Unicode编码

以上我们介绍了中文和西欧的字符与编码,但世界上还有很多其他国家的字符,每个国家的各种计算机厂商都对自己常用的字符进行编码,在编码的时候基本忽略了其他国家的字符和编码,甚至忽略了同一国家的其他计算机厂商,这样造成的结果就是,出现了太多的编码,且互相不兼容。

世界上所有的字符能不能统一编码呢?可以,这就是Unicode。

Unicode做了一件事,就是给世界上所有字符都分配了一个唯一的数字编号,这个编号范围从0x000000~0x10FFFF,包括110多万。但大部分常用字符都在0x0000~0xFFFF之间,即65536个数字之内。每个字符都有一个Unicode编号,这个编号一般写成十六进制,在前面加U+。大部分中文的编号范围为U+4E00~U+9FFF,例如,“马”的Unicode是U+9A6C。

简单理解,Unicode主要做了这么一件事,就是给所有字符分配了唯一数字编号。它并没有规定这个编号怎么对应到二进制表示,这是与上面介绍的其他编码不同的,其他编码都既规定了能表示哪些字符,又规定了每个字符对应的二进制是什么,而Unicode本身只规定了每个字符的数字编号是多少。

那编号怎么对应到二进制表示呢?有多种方案,主要有UTF-32、UTF-16和UTF-8。

1.UTF-32

这个最简单,就是字符编号的整数二进制形式,4个字节。

但有个细节,就是字节的排列顺序,如果第一个字节是整数二进制中的最高位,最后一个字节是整数二进制中的最低位,那这种字节序就叫“大端”(Big Endian,BE),否则,就叫“小端”(Little Endian,LE)。对应的编码方式分别是UTF-32BE和UTF-32LE。

可以看出,每个字符都用4个字节表示,非常浪费空间,实际采用的也比较少。

2.UTF-16

UTF-16使用变长字节表示:

1)对于编号在U+0000~U+FFFF的字符(常用字符集),直接用两个字节表示。需要说明的是,U+D800~U+DBFF的编号其实是没有定义的。

2)字符值在U+10000~U+10FFFF的字符(也叫做增补字符集),需要用4个字节表示。前两个字节叫高代理项,范围是U+D800~U+DBFF;后两个字节叫低代理项,范围是U+DC00~U+DFFF。数字编号和这个二进制表示之间有一个转换算法,本书就不介绍了。

区分是两个字节还是4个字节表示一个字符就看前两个字节的编号范围,如果是U+D800~U+DBFF,就是4个字节,否则就是两个字节。

UTF-16也有和UTF-32一样的字节序问题,如果高位存放在前面就叫大端(BE),编码就叫UTF-16BE,否则就叫小端,编码就叫UTF-16LE。

UTF-16常用于系统内部编码,UTF-16比UTF-32节省了很多空间,但是任何一个字符都至少需要两个字节表示,对于美国和西欧国家而言,还是很浪费的。

3.UTF-8

UTF-8使用变长字节表示,每个字符使用的字节个数与其Unicode编号的大小有关,编号小的使用的字节就少,编号大的使用的字节就多,使用的字节个数为1~4不等。

具体来说,各个Unicode编号范围对应的二进制格式如表2-6所示。

表2-6 UTF-8编码的编号范围与对应的二进制格式

表2-6中的x表示可以用的二进制位,而每个字节开头的1或0是固定的。

小于128的,编码与ASCII码一样,最高位为0。其他编号的第一个字节有特殊含义,最高位有几个连续的1就表示用几个字节表示,而其他字节都以10开头。

对于一个Unicode编号,具体怎么编码呢?首先将其看作整数,转化为二进制形式(去掉高位的0),然后将二进制位从右向左依次填入对应的二进制格式x中,填完后,如果对应的二进制格式还有没填的x,则设为0。

我们来看个例子,“马”的Unicode编号是0x9A6C,整数编号是39532,其对应的UTF-8二进制格式是:

1110xxxx 10xxxxxx 10xxxxxx

整数编号39532的二进制格式是:

1001 101001 101100

将这个二进制位从右到左依次填入二进制格式中,结果就是其UTF-8编码:

11101001 10101001 10101100

十六进制表示为0xE9A9AC。

和UTF-32/UTF-16不同,UTF-8是兼容ASCII的,对大部分中文而言,一个中文字符需要用三个字节表示。

4.Unicode编码小结

Unicode给世界上所有字符都规定了一个统一的编号,编号范围达到110多万,但大部分字符都在65536以内。Unicode本身没有规定怎么把这个编号对应到二进制形式。

UTF-32/UTF-16/UTF-8都在做一件事,就是把Unicode编号对应到二进制形式,其对应方法不同而已。UTF-32使用4个字节,UTF-16大部分是两个字节,少部分是4个字节,它们都不兼容ASCII编码,都有字节顺序的问题。UTF-8使用1~4个字节表示,兼容ASCII编码,英文字符使用1个字节,中文字符大多用3个字节。

https://www.bilibili.com/video/BV16G4y1Q7Ub/?spm_id_from=333.999.0.0


http://www.ppmy.cn/news/20191.html

相关文章

这些好用的办公软件分享给你

软件一:备忘录 现在大部分手机备忘录都提供语音记录功能,可以实时录音并转换成文本内容记录下来,使用起来还是比较方便的,但是要注意它支持转换的时长是有限制的哦! 操作步骤:打开手机备忘录,…

Hadoop基础之《(5)—MapReduce概述》

一、什么是MapReduce MapReduce将计算过程分为两个阶段:Map和Reduce。 1、Map阶段并行处理输入数据。 2、Reduce阶段对map结果进行汇总。 二、结构图 三、HDFS、Yarn、MapReduce三者之间的调用关系 HDFS三台服务器,第一台上有DataNode和NameNode。第二…

Qt扫盲-Reentrant和线程安全

Reentrant和线程安全一、概述二、Reentrant三、线程安全四、Qt类的注意事项一、概述 在整个文档中, Reentrant 和 thread-safe 术语用于标记类和函数,指明如何在多线程应用程序中使用它们: 一个 thread-safe的函数可以从多个线程同时调用,即…

4729. 解密

Powered by:NEFU AB-IN Link 文章目录4729. 解密题意思路代码4729. 解密 题意 给定一个正整数 k, 有 k次询问,每次给定三个正整数 ni,ei,di,求两个正整数 pi,qi,使 nipiqi,eidi(pi−1)(qi−1)1 思路 通过数学推导可以推出 p q …

Git操作

合并远端提交 将远程三次提交合成一次 git -rebase -i HEAD~3:wq 保存 就叫 day 17 再保存 最后 git push -f提交 rebase 与 merge merge 1 新建一个分支 git chekout -b feature-1 添加代码a 并提交 1.1 发现此次提交内容有误 又不想产生两条提交记录 先 git add . gi…

[Vulnhub] DC-4

下载链接&#xff1a;https://download.vulnhub.com/dc/DC-4.zip 同DC-3 这个靶机也是只有一个flag。 全面信息搜集hydra爆破登录和ssh密码teehee命令(写入文件内容)提权/etc/passwd & /etc/sudoers 文件利用 目录 <1> 信息搜集 <2> hydra爆破登录密码 <…

一道编程劝退题,检测你是否适合干编程

前言大家都知道要想成为一名优秀的开发工程师&#xff0c;需要数学基础好&#xff0c;即你要有很强的逻辑思维能力&#xff0c;这里有一道美国斯坦福大学出的一道逻辑思维的测试题&#xff0c;检测你的逻辑思维能力&#xff0c;大家可以看看自己逻辑能力怎么样。题目有一个抽奖…

bug解决:Uncaught (in promise) TypeError: Toast.loading is not a function

在使用vue3做项目时&#xff0c;在其中使用了vant框架&#xff0c;在使用toast的加载组件或者是一些其他组件时&#xff0c;出现了如下的错误&#xff1a;Uncaught (in promise) TypeError: Toast.loading is not a function错误代码如下&#xff1a;Toast.loading({ message: …