首页 > 编程知识 正文

unicode是什么意思,utf8和unicode的区别

时间:2023-05-05 08:29:11 阅读:21064 作者:1098

ASCII代码

在计算机世界里,信息的显示方式只有0和1,而我们人类信息的显示方式与之大不相同,往往通过语言文字、图像、声音等传递信息。

如何转换为二进制文件并将其存储在计算机上,这个过程称为编码。 更广义地说,是把信息从一种形式变成另一种形式的过程。

一个二进制文件有两种状态。 “0”状态和“1”状态。 那么,它可以表示两个不同的东西,它想赋予什么意义,赋予什么意义? 例如,“0”表示“吃过”,“1”表示“还没吃”。 这相当于将现实信息编码为二进制数。 而且,在这个例子中是一位的二进制数。 两位二进制数可以分别表示四种情况: 00、01、10和11。 7种是2^7=128。

计算机中的每8位配置一个字节(字节),存储在计算机上的最小单位为字节。 字节如下图所示。

早期的人们用8位二进制编码英文字母(前一位为0 )。 也就是说,将英文字符、常用字符和这128个中的二进制0、1字符串一一对应起来。 例如,将与大写“a”对应的二进制位“01000001”转换为十六进制数,设为41。

在美国,这128是足够的,但在其他国家是不够的。 他们的文字和英语不同。 例如,在法语里,像一样,字母上有注音符号。 因此,各国决定将字节开头的未使用的位带来。 原始128状态为256,编码为130 (二进制10000010 )。

为了与ASCII代码兼容,最高位通常为0时与原始ASCII代码相同,最高位为1时,每个国家都自己赋予后面的位(1xxx xxxx )国家字符的含义。

但是,这样又出了问题。 对不同国家新增加的128个数字赋予了不同的意义。 例如,130在法语中表示,而在希伯来语中表示字母Gimel。 (这不是希伯来语,而是翻译成英语的形式。 )具体希伯来字母Gimel见下图:

所以,不同的国家有不同的编码方式,所以如果你给二进制字符串,你要解码,你就必须知道它的编码方式。 否则,我们有时看到的乱码就会发生。

优衣码

Unicode为世界上的所有字符指定了唯一的数字编号。 该编号范围从0x000000到0x 10 ffff (十六进制),有110万以上。 每个字符都有唯一的Unicode编号,该编号通常用十六进制写,前面带u。 例如,“马”的Unicode是U 9A6C。

Unicode相当于一个建立字符和号码之间联系的表

这是一项规定,Unicode本身只规定每个字符的数字号码是多少,而没有规定如何存储这个号码。

有人会说吧。 那我可以直接把Unicode号码转换成二进制文件保存。 是的,可以。 虽然这需要人为的规定,但Unicode并不是这样摆弄的。 除了这种直接转换为二进制文件的方案以外,主要还有UTF-8、UTF-16和UTF-32。 (UTF-8、UTF-16、UTF-32……都是Unicode代码的实现。 )

1、UTF-32

这是与字符对应的编号的整数二进制格式,4字节。 这就是直接转换。 例如,如果马的Unicode为: U 9A6C,它将直接转换为二进制,显示为: 1001 1010 0110 1100。

注意:转换为二进制后的计算机存储问题。 计算机在内存中排列字节有两种方法:大端序法和小端序法。 大端方法是将高位字节放置在地址(例如0x1234 )中的方法,计算机以高位字节0x12和低位字节0x34两个字节存储。 其保存方法如下。

UTF-32由4字节表示,处理单位为4字节(一次得到4字节进行处理),无论大小如何,都会发生解密错误。 例如,一次处理4字节的12 34 56 78。 最终表示的值取决于这4个字节是表示0x12 34 56 78还是表示0x78 56 34 12。

因为他们表示的意思可以根据他们高低字节的存储位置来判断,所以编码方式有UTF-32BE和UTF-32LE,分别对应大字节序和小字节序,正确解释多个字节(这里是4字节)的意思

2、UTF-16

UTF-16以可变长度字节表示

对于编号从U 0000到U FFFF的字符(常用字符集),直接用2字节表示。

从U 10000到U 10FFFF编号的字符必须以4字节表示。

同样,UTF-16也存在字节顺序问题(大小端),因此UTF-16BE表示大端,UTF-16LE表示小端。

3、UTF-8

UTF-8通过使用可变长度字节表示,正如名称所示,使用的字节数是可变的。 该变化取决于Unicode号码的大小,号码小的使用字节少,号码大的使用字节多。 使用的字节数为1~4字节。

UTF-8编码规则:

对于1字节符号,字节的第一位为0,后面的7位为该符号的Unicode代码。 因此,对于英文字母,UTF-8代码和ASCII代码是相同的。

对于n字节符号(n1 ),第一个字节的前n位全部为1,第n-1位为0,下一个字节

的前两位一律设为10,剩下的没有提及的二进制位,全部为这个符号的Unicode码 。

举个例子:比如说一个字符的Unicode编码是130,显然按照UTF-8的规则一个字节是表示不了它(因为如果是一个字节的话前面的一位必须是0),所以需要两个字节(n = 2)。

根据规则,第一个字节的前 2 位都设为1,第3(2+1)位设为0,则第一个字节为:110X XXXX,后面字节的前两位一律设为10,后面只剩下一个字节,所以后面的字节为:10XX XXXX。所以它的格式为110XXXXX 10XXXXXX 。

Unicode编号范围与对应的UTF-8二进制格式 :

对于一个具体的Unicode编号,具体进行UTF-8的编码的方法:

首先找到该Unicode编号所在的编号范围,进而可以找到与之对应的二进制格式,然后将该Unicode编号转化为二进制数(去掉高位的0),最后将该二进制数从右向左依次填入二进制格式的X中,如果还有X未填,则设为0 。

比如:“马”的Unicode编号是:0x9A6C,整数编号是39532,对应第三个范围(2048 - 65535),其格式为:1110XXXX 10XXXXXX 10XXXXXX,39532 对应的二进制是 1001 1010 0110 1100,将二进制填入进入就为: 11101001 10101001 10101100 。
由于UTF-8的处理单元为一个字节(也就是一次处理一个字节),所以处理器在处理的时候就不需要考虑这一个字节的存储是在高位还是在低位,直接拿到这个字节进行处理就行了,因为大小端是针对大于一个字节的数的存储问题而言的。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。