推荐文章https://my.oschina.net/goldenshaw/blog/310331,讲的非常详细。
还有这个文章,对字符编码历史讲的清楚:
https://blog.csdn.net/LVXIANGAN/article/details/8151670

总结一下,当作学习笔记:
什么是Unicode?
Unicode是Unicode Standard(Unicode标准)的简写;
Unicode为每一字符提供一个数字编号,通俗讲,就是字符集(coded charset);
Unicode的码点(数字编号)的表示形式与范围是?
U+[XX]XXXX是码点的表示形式,X代表一个十六制数字,可以有4-6个,不足4个前补0补足4个。示例:U+0048,U+4F60,U+1D11E。最后一个是5个16进制数的码点。
取值范围:U+0000~U+10FFFF(10FFFF+1=1114112,一般记为111万左右),也就是Unicode可以支持111万个字符;
Unicode平面?
码点的全部范围可以均分成17个65536大小的部分,这里面的每一个部分就是一个平面(Plane),其实就是不同的取值范围。编号从0开始,第一个平面称为Plane 0.
第一个平面即是BMP(Basic Multilingual Plane 基本多语言平面),也叫Plane 0,它的码点范围是U+0000~U+FFFF。这也是我们最常用的平面,日常用到的字符绝大多数都落在这个平面内。

CJK统一汉字
在Unicode中,称为CJK统一汉字(CJK:Chinese, Japanese, and Korean,中日韩)。位于平面0;可以在word里面查询到CJK对应的Unicode编码
Unicode UTF GBK ASCII 区别和联系
正则表达式[\u4E00-\u9FA5]来匹配中文的问题在哪?
这一段大小不过是两万多一点,\u4E00-\u9FA5(19968-40869,4E00就是“一“字。),严格来说这只是Unicode最主要的一段中文区域。不过对于绝大数情况够用了。

什么是UTF?
UTF即是Unicode转换格式(Unicode (or UCS) Transformation Format)(UCS:Universal Character Set(统一字符集),也称ISO/IEC 10646标准,不那么严格的情况下,可以认为它和”Unicode字符集“这一概念是等价的),也就是Unicode的码点(数字编号)的另一种表示形式。所以Unicode的码点可以转换为UTF的格式表示;

UTF有三种格式:UTF-8/UTF-16/UTF-32

UTF-32
UTF-32最简单,采用的定长四字节则是32位,所以它表示所有的unicode 码点不但毫无压力,反而绰绰有余,所以只要把码点的表示形式以前补0的形式补够32位即可

UTF-8
UTF-8是变长的编码方案,可以有1,2,3,4四种字节组合。
UTF-8采用了高位保留方式来区别不同变长,如下:
Unicode UTF GBK ASCII 区别和联系
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

  1. 一字节有效编码位有7位,2^7=128,码点U+0000U+007F(0127)使用一字节。一字节留给了ASCII,所以UTF-8兼容ASCII。
  2. 二字节有效编码位只有5+6=11位,最多只有2^11=2048个编码空间
  3. 三字节模式可看到光是保留位就达到4+2+2=8位,相当一字节,所以只剩下两字节16位有效编码位,它的容量实际也只有65536。码点U+0800U+FFFF(204865535)使用三字节编码。。***基本上,常用的汉字都落在了这三字节的空间里,这就是我们常说的汉字在UTF-8里用三字节表示***那些偏门的汉字自然只能被挤到四字节空间上去了。
  4. 四字节的可以看到它的有效位是3+6+6+6=21位,前面说到最大的码点10FFFF也是21位

Unicode到UTF-8的转换例子:来看一个汉字”你“(U+4F60)的转换示意,如下图所示:
Unicode UTF GBK ASCII 区别和联系

UTF-16
**UTF-16是一种变长的2或4字节编码模式。****对于BMP内的字符使用2字节编码,**其它的则使用4字节组成所谓的代理对来编码。
代理对:
所谓代理对,就是下表格中的行和列的坐标值;
Unicode UTF GBK ASCII 区别和联系
例如:码点U+1D11E对应的代理对即是 D834 DD1E。计算过程如下:
(1D11E - 10000) ÷ 400 + DB00 = D11E ÷ 400 + D800 = 34 + D800 = D834
Trail = (1D11E - 10000) % 400 + DC00 = D11E % 400 + DC00 = 11E + DC00 = DD1E

再来一个例子:
Unicode UTF GBK ASCII 区别和联系

GBK:
汉字国标扩展码,基本上采用了原来GB2312-80所有的汉字及码位,并涵盖了原Unicode中所有的汉字20902,总共收录了883个符号, 21003个汉字及提供了1894个造字码位。Windows 95系统就是以GBK为内码,又由于GBK同时也涵盖了Unicode所有CJK汉字,所以也可以和Unicode做一一对应。但是注意每个汉字对应的数字编码,GBK和Unicode是不一样的;

GBK和Unicode的数字编码查询网址
http://www.mytju.com/classcode/tools/encode_gb2312.asp

ASCII
 所有的空格、标点符号、数字、大小写字母分别用连续的字节状态表示,一直编到了第127号,这样计算机就可以用不同字节来存储英语的文字了。大家看到这样,都感觉很好,于是大家都把这个方案叫做 ANSI 的"ASCII"编码(American Standard Code for Information Interchange,美国信息互换标准代码)

GB2312
GB2312 是对 ASCII 的中文扩展。
中国把那些127号之后的奇异符号们直接取消掉, 规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字符了。
后来还是不够用,于是干脆不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容。结果扩展之后的编码方案被称为 GBK 标准,GBK 包括了 GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字,GBK 扩成了 GB18030。从此之后,中华民族的文化就可以在计算机时代中传承了。

WIFI的中文SSID的表示
用的是Unicode字符集的UTF-8编码形式;
如下图:
SSID含有中文:小米手机
对应的Unicode的数字编号:5C0F 7C73 624B 673A
对应的UTF-8的编码:11100101 10110000 10001111 =e5b08f
11100111 10110001 10110011 =e7b1b3
11100110 10001001 10001011 =e6898b
11100110 10011100 10111010 = e69cba

Unicode UTF GBK ASCII 区别和联系

相关文章: