关于ASCII、Unicode、编码的简单理解

警告
本文最后更新于 2022-12-02 11:07,文中内容可能已过时。

首先ASCII码因为是一个字节对应一个字符,我们可以按照每8位到对照表里找出对应的内容, 其中最高位为0,只使用了7位,所以他的缺点是只有128个字符。而Unicode是一个通用的字符集,他包含了各个国家的字符,目前收录了超过14几万个字符,在Unicode的前128个字符是和ASCII码一样的,所以Unicode兼容ASCII。

Unicode就像是一个超大的密码本,里面的内容就是现实世界的文字对应计算机世界的数字。 比如=>4E25=>100111000100101,比如a=>0061=>1100001 可以发现很多数字代表着一个字符,在计算机中8位称为1个字节,很显然英文字母a使用1个字节就能表示,而中文则需要2个字节。 如果这些字符串组合在一起你要怎么区分呢?比如严a,现在给你一串数字1001110001001011100001,由你来解出他对应的内容,我想你是没有办法找出他对应的内容,因为你并不知道这一串数字代表几个字符,如果他是一个字符,那么你在unicode对照表中是找不到他对应的字符的,unicode中没有这个二进制数对应的字符,如果他是两个字符那么要从哪里开始算是第二个字符呢?

因此我们需要一种协商一种规则,规定该如何存储数据,这样我们就知道该如何进行解码。比如我们定义:每16位(2字节)算一个字符,那么我们在存储数据的时候就需要保证单个字符满足16位的需求,不满足16位在前面补0。比如=>0100 1110 0010 0101,比如a=>0000 0000 0110 0001,那么我们再次对严a进行解码,组合后也就是01001110001001010000000001100001,我们按照每16位一个字符来算,可以将他拆分为0100111000100101 0000000001100001,这样就可以算出结果了,想看计算过程的可以看下面。那么utf8就是这样的一个规则(实际的规则并不是上面举例的,上面只是为了方便理解。)

计算过程

0100111000100101 => 16进制 (4e25)=> 严 (unicode对照表:https://www.unicode.org/charts/PDF/U4E00.pdf )

0000000001100001 => 16进制(0061) => a (unicode对照表:https://www.unicode.org/charts/PDF/U0000.pdf )

PS:

  1. utf8编码规则https://www.bo56.com/utf8编码规则/

  2. 如果你想证实Unicode的前128个字符是和ASCII码一样的,那么你可以先找到ASCII对照表,随便找一个符号的ASCII值,将这个值转换为16进制,到这里进行查询https://unicode.org/charts/,注意查询的格式需要是\uxxxx,不足4位用0补,进入他给你的pdf中搜索你的16进制数,看其对应的符号即可。

参考 https://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

请我喝杯水
SoulChild 微信号 微信号
SoulChild 微信打赏 微信打赏
0%