字符编码讲解(C#)

在学习和编码的过程中,极容易遇到如下概念,他们有些是字符编码,有些是涉及的相关概念,接下来我将围绕下面的熟悉又陌生的概念做详细解释,并且梳理其之间的关系

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是什么编码?-优快云博客

GB2312、GB18030、GBK、UNICODE、BI  G5之间兼容关系_gb180030能够显示big5吗-优快云博客

字符集和字符编码(Charset & Encoding) - 吴秦 - 博客园

GB2312、GB18030、GBK、UNICODE、BI  G5之间兼容关系_gb180030能够显示big5吗-优快云博客

文章推荐程序员必备:彻底弄懂常见的7种中文字符编码 - 知乎

还是云里雾里的小伙伴,强推一个视频

一听就懂字符集、ASCII、GBK、UTF-8、Unicode、乱码、字符编码、解码问题的讲解_哔哩哔哩_bilibili

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值