关于ASCII、Unicode、编码的简单理解
首先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:
utf8编码规则https://www.bo56.com/utf8编码规则/
如果你想证实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