在学习和编码的过程中,极容易遇到如下概念,他们有些是字符编码,有些是涉及的相关概念,接下来我将围绕下面的熟悉又陌生的概念做详细解释,并且梳理其之间的关系
UTF8, Unicode ,ASCII, UTF16 , UTF32 ,GB2312, GBK , GB18030 ,ANSI,BIG5
常见字符编码
ASCII
我们都知道,无论是什么样的数据或者是指令,在最后和计算机打交道的时候都是0和1这样二进制的方式,而对于人类来说,尤其是发明计算机的那群美国佬来说,看不懂011010101001011000这些指令,而要让计算机处理计算我们人类想要的数据,首先人类得看懂啊(不然人类无法给机器下达指令)。所以就有了ASCII——>
ASCII(American Standard Code for Information Interchange):美国信息交换标准代码,包括了英文、符号等。
可以理解为一种复杂的摩斯编码(通过.━ 的方式来编码传递信息)。也可以理解为一种映射关系,。比方说字母"a", 将其映射为97 ,用计算机算一下
"a",就是97 ,也是01100001,也是61,也是141,只是表示的进制不同,而对于电脑来说,二进制就是01100001 ,其映射为人类的语言就是“a”。美国人日常使用也就大小写英文字母和一些符号,足够了。计算机处理的最小单位是字节,一个字节也就是8比特,2的八次方是256,也就是说,一个字节可以表示256种不同的字符,而美国人用七七八八加起来就128个,256属实太多了,所以ASCII在编码的时候,最高位同统一为0 ,这样就是变成2的七次方,用来存储美国人日常所能用到的所有字符。
对于ASCII对应码表,感兴趣的可以卡查看对应表 ASCII码对照表,ASCII码一览表(非常详细) - C语言中文网
GB2312
上述说到对于美国佬来说,一个字节足够用来存储他们国家交流的一切信息。但是对于中国来说,太少了,完全不够用。于是中国自己也弄一套标准出来GB就是国标的缩写。
GB2312是最早一版的中文编码,每个字占据2bytes。由于要和ASCII兼容(尊重发明者),那这2bytes最高位不可以为0了(否则和ASCII会有冲突)。在GB2312中收录了6763个汉字以及682个特殊符号,已经囊括了生活中最常用的所有汉字。GB2312简体中文编码表 - 常用参考表对照表 - 脚本之家在线工具
GBK
上面所说的GB2312不太够用,六千多个汉字属实之恶能包含高频词汇,对于稍微偏僻的海曙不够用,就出来了BKG,国标扩展,里面有两万多个汉字等字符。一个中文字符用两个字节存储。(2的16次方为65,536)
GBK18030
汉字太多,只用2bytes表示一个字已经不够用了(2bytes最多只有65536种组合,然而为了和ASCII兼容,最高位不能为0就已经直接淘汰了一半的组合,只剩下3万多种组合无法满足全部汉字要求)。因此GB18030多出来的汉字使用4bytes编码。
附:中文编码的兼容性
Unicode字符集(万国码)
中国人有中国人的编码,印度人也有自己的编码,巴基斯坦也如此。那么世界就乱套了。对于10011001可能在GB2312中是一个汉字,而在巴基斯坦码的编码中变成了另一个,在国际化的交流中,是个头大的难题。于是国际组织制定了Unicode,万国码,把所有国家的字符全部收录进来,进行统一的字符编码,各自的国家就不要自己在那玩了,大家一起玩。
Unicode是字符集,UTF-32/ UTF-16/ UTF-8是三种字符编码方案。
UTF-32
简单粗暴,奢侈!不管什么,全部四个字节表示。美国人就很麻烦,原来的“a”明明01100001就可以解决,用UTF-32得 00000000 00000000 00000000 01100001,太浪费了!
UTF-16
尽管有Unicode字符非常多,但是实际上大多数人不会用到超过前65535个以外的字符。因此,就有了另外一种Unicode编码方式,叫做UTF-16(因为16位 = 2字节)。UTF-16将0–65535范围内的字符编码成2个字节,如果真的需要表达那些很少使用的"星芒层(astral plane)"内超过这65535范围的Unicode字符,则需要使用一些诡异的技巧来实现。UTF-16编码最明显的优点是它在空间效率上比UTF-32高两倍,因为每个字符只需要2个字节来存储(除去65535范围以外的),而不是UTF-32中的4个字节。并且,如果我们假设某个字符串不包含任何星芒层中的字符,那么我们依然可以在常数时间内找到其中的第N个字符,直到它不成立为止这总是一个不错的推断。
UTF-8
两个字概括: 伟大!
UTF-8是Unicode字符集的一种编码方案,采取可变长编码方案,共分四个长度区:1个字节,2个字节,3个字节,4个字节。英文字符、数字等只占1个字节(兼容标准ASCI编码),汉字字符占用3个字节。
在vscode 中,我强行把字符编码改为GB2312,韩文就显示不出来,会乱码
改回UTF-8后,正常显示
ANSI
准确说,并不存在哪种具体的编码方式叫做ANSI,它只是一个Windows操作系统上的别称而已。在中文简体Windows操作系统上,ANSI就是GBK;在泰语操作系统上,ANSI就是TIS-620(一种泰语编码);在韩语操作系统上,ANSI就是EUC-KR(一种韩语编码)。并且所谓的ANSI只存在于Windows操作系统上。
查看系统默认编码 :win+r打开cmd ——> chcp ——>可以查看code page的值 ,936
936就是简体中文,GB2312
BIG5
BIG5 是中国台湾使用的繁体的一套编码。其codePage为 950
在C#中可以通过EncodingInfo类 , Encoding.GetEncodings()方法获取所有不同的编码。
EncodingInfo 类 (System.Text) | Microsoft Learn
参考资料
结合相关资料总结,如有侵权,联系删除
C# 小叙 Encoding (一) - 哭过的天空 - 博客园
ANSI是什么编码?-CSDN博客
GB2312、GB18030、GBK、UNICODE、BI G5之间兼容关系_gb180030能够显示big5吗-CSDN博客
字符集和字符编码(Charset & Encoding) - 吴秦 - 博客园
GB2312、GB18030、GBK、UNICODE、BI G5之间兼容关系_gb180030能够显示big5吗-CSDN博客
文章推荐程序员必备:彻底弄懂常见的7种中文字符编码 - 知乎
还是云里雾里的小伙伴,强推一个视频
一听就懂字符集、ASCII、GBK、UTF-8、Unicode、乱码、字符编码、解码问题的讲解_哔哩哔哩_bilibili