什么是Unicode?
Unicode是一种字符集,让几乎所有语言中的每个字符都和一个唯一数字对应起来。Unicode可以表示世界上的每一个字符,每一个字符都有相应并且唯一的二进制编码。
Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。也就是说世界上的几乎任意一个字符,无论何种语言,都能在Unicode字符集中找到其对应的二进制编码。
Unicode的表现方式
Unicode的表现方式是U+XXXXXX,X代表一位十六进制数,可以有4-6位,不足 4 位前补 0 补足 4 位,超过则按是几位就是几位。 现目前Unicode的范围是U+0000 – U+10FFFF。
举个栗子:
字符A的ASCII码是65,将65转换成16进制就是41(16×4+(16^0)×1 = 65),按照规则前面补0,那么字符A的Unicode表示就是U+0041。依次类推B的Unicode表示就是U+0042...等等,汉字"爱"的字符表示是“U+7231”。

可以通过这个网址来查询字符的Unicode。
Unicode介绍清楚了,那么平时我们看见的UTF-8,UTF-16等等又是什么呢?在介绍它们之前,要先理解两个概念,编码(encrypt)与解码(decrypt)。
还记得以前考试的时候,你的好哥们小明没有好好复习,想要请求你的帮助,善良的你怎么能眼睁睁看着你的好哥们考砸了回去挨揍,于是你和小明就一起约定了一个规则。 你左手摸头就是选A,右手摸头就是选B,咳嗽就是选C,摸下耳朵就是选D。于是,考场上,你不断通过这些动作来向小明传达你想要表达的真实信息,而小明则根据你们提前约定好的规则来获取你想要表达的信息。“右手摸头”——B,“摸下耳朵”——D,“咳嗽”——C,“左手摸头”——A,当然,最后你由于动作太多被监考老师请出了考场(滑稽)......
上面的故事其实就是一种最简单的编码与解码的演示。将A这个信息编码成左手摸头的动作,而解码者根据你们的约定好的规则,来将左手摸头的动作解码为A这个信息。理解了编码与解码,UTF-8,与UTF-16就好理解了。
什么是UTF-8,UTF-16?
答案就是它们都是一种编码方式
用通信理论的思路可以理解为:
unicode是信源编码,对字符集数字化。
utf-8是信道编码,为更好的存储和传输。
常见的编码方式有 UTF-8 , UTF-16 , GB2312 , GBK等,它们都只是一种编码方式,每种编码有自己的规则。
拿“爱”这个字举个例子,爱的Unicode为“U+7231”,在不同的编码方式下,存储在计算机中的二进制是完全不同的,如图, 在UTF-8的编码方式下,二进制为"11100111 10001000 10110001",而在UTF-16LE(UTF-16的一种)的编码方式下,二进制则为"00110001 01110010"。

-
在VScode中新建一个test.txt文件,并输入一个“爱”字
-
点击右下方的UTF-8,并选择“通过编码保存”,选择“UTF-16 LE”
-
然后再次点击右下方的UTF-8,并选择“通过编码重新打开”
-
选择"UTF-8",然后文件就变成乱码了,因为我们用了错误的编码方式去打开。
-
我们如果使用“UTF-16 LE”来打开,我们就会得到正确的文本信息。
结论是:使用UTF-16 LE进行编码,但使用UTF-8来进行解码,我们会得到一份乱码文件,不能正确读出信息。因为它们两个是不同的编码方式,有不同的规则。
UTF-8与UTF-16及其其他的编码方式(比如GB2312,GBK等等),都是不同的编码方式,它们有各自的格则,优点与缺点及其时代背景,以及适用的场景。下面简单列出其规则及定义,有兴趣的同学可自己查找资料看看。
UTF-8是一种非常通用的可变长字符编码方式,范围由1-4个字节不等。
UTF-16通常由2字节或者4字节表示一个字符,U+000~U+FFFF的范围内用2个字节表示。 U+10000~U+10FFFF的范围内用4个字节表示。
GB2312,每个汉字及符号以两个字节来表示,兼容ASCII码,GB 2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB 2312也收录了许多其他语音的文字及符号。它所收录的汉字已经覆盖中国大陆99.75%的使用频率,对于人名、古汉语等方面出现的罕用字,GB 2312不能处理,这导致了后来GBK及GB 18030汉字字符集的出现。
GBK 向下与 GB 2312 编码兼容,向上支持 ISO 10646.1国际标准,是前者向后者过渡过程中的一个承上启下的产物。GBK编码,是在GB2312-80标准基础上的内码扩展规范,使用了双字节编码方案,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了21003个汉字,完全兼容GB2312-80标准
如果有理解不对或者不到位的地方,感谢指出。
参考