常见编码与乱码 (ASCII、GB2312、GBK、Unicode、UTF-8、UTF-16、UTF-32)

编码的由来
所有的数据在计算机中存储和运算时都要使用二进制数表示,例如,像a-z、A-Z这样的52个字母,以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示,而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套,这就叫编码

而大家如果要想互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了ASCII编码,统一规定了上述常用符号用哪些二进制数来表示。

ASCII码诞生
ASCII美国信息交换标准代码是由美国国家标准学会制定的,是一种标准的单字节字符编码方案,用于基于文本的数据。它最初是美国国家标准,供不同计算机在相互通信时用作共同遵守的西文字符编码标准,后来它被国际标准化组织ISO定为国际标准,称为ISO 646标准。适用于所有拉丁文字字母。

ASCII码的表示
ASCII 码使用指定的7 位二进制数组合来表示128 可能的字符。
标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号,以及在美式英语中使用的特殊控制字符 。下图为ASCII对照表。ASCII对照表
128位在二进制表示中只用占7位,那么为什么实际上ascii每个字符占8位呢?
在这里插入图片描述

由于计算机存储中1byte用来表示8bit,但是ascii字符只有128个,用二进制表示为7bit,刚好少了1bit,因此为了方便存储读取,在标准ASCII中,这1bit用作奇偶校验位,用固定8bit长度来存储字符。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1 。

其他编码方式诞生的原因
在英语中,用128个符号编码便可以表示所有,但是用来表示其他语言,128个符号是不够的。比如,在法语中,字母上方有注音符号,它就无法用 ASCII 码表示。于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。即扩展ASCII码。许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展ASCII 码允许将每个字符的第8 位用于确定附加的128 个特殊符号字符、外来语字母和图形符号。
但是,这里又出现了新的问题。不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号。但是不管怎样,所有这些编码方式中,0–127表示的符号是一样的,不一样的只是128–255的这一段。至于亚洲国家的文字,使用的符号就更多了,汉字就多达10万左右。一个字节只能表示256种符号,肯定是不够的,就必须使用多个字节表达一个符号。比如,简体中文常见的编码方式是 GB2312,使用两个字节表示一个汉字,所以理论上最多可以表示 2562 = 65536 个符号。

GB2312与GB18030
国标 GB2312 是基于 1980 年发布的《信息交换用汉字编码字符集基本集》,是中文信息处理的中国国家标准,是强制执行的中文编码。国标码共收录 6763 个简体汉字、682 个符号,其中汉字部分:一级字 3755 个,以拼音排序,二级字 3008 个,以偏旁部首排序。该标准用双字节表示一个汉字:高字节A1-F7(其中字符区 A1-F9,汉字区 B0-F7)低字节 A1-FE2
国标 GB18030 编码 国标 GB18030 基于 2000 年 3 月发布的《信息技术信息交换用汉字编码字符集基本集的扩充》,新增几千少数民族字符。

Big5
又称为大五码或五大码,是使用繁体中文(正体中文)社区中最常用的电脑汉字字符集标准,共收录13,060个汉字。

GBK
GBK即汉字内码扩展规范。GBK编码标准兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。GBK是对GB2312-80的扩展。

Unicode(UTF32,UTF16,UTF8)
Unicode即统一码,是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台的要求。

Unicode的编码方式有三种 :UTF-8、UTF-16、UTF-32

UTF32 就是用32位bit(4字节)来表示对应字符的码点。因为UTF-32对每个字符都使用4字节,就空间而言,是非常没有效率的。特别地,非基本多文种平面的字符在大部分文件中通常很罕见,以致于它们通常被认为不存在占用空间大小的讨论,使得UTF-32通常会是其它编码的二到四倍。虽然每一个码位使用固定长定的字节看似方便,它并不如其它Unicode编码使用得广泛。

UTF-16 需要1个或者2个字节来表示对应字符的码点。 比起UTF-8,好处在于大部分字符都以固定长度的字节(2字节)储存,但UTF-16却无法兼容于ASCII编码。

UTF-8 是针对Unicode的一种可变长度字符编码,使用1~4字节为每个字符编码。它可以用来表示Unicode标准中的任何字符,而且其编码中的第一个字节仍与ASCII相容,使得原来处理ASCII字符的软件无须或只进行少部分修改后,便可继续使用。
由于UTF-8与字节序无关,同时兼容ASCII编码,使得UTF-8编码成为现今互联网信息编码标准而被广泛使用。

乱码
标准不统一时,乱码问题便随之产生。例如当使用uft8编码的文件,使用gbk解码阅读时便会乱码。
在乱码时,我们时常见到“锟斤拷”的频率较高,乱码就是因为uft8编码的文件使用了gbk解码,而出现“锟斤拷”详细原因是因为Unicode中使用�,用来表示无法显示的字符(一些浏览器常来使用)。它的码点用utf-8表示转换为十六进制的就是EF BF BD,如下图所示。
Unicode
如下图所示。由于GBK以两字节编码,当恰巧有两个�连在一起时,便会出现“锟斤拷”现象了。
unicode
由于有的编码方案之间存在相互兼容部分的关系,有的时候只出现了小部分乱码的情况,不容易被发现是乱码。

相关参考知识
GB2312 编码的补码为何是 0xA0?
https://www.zhihu.com/question/219182
非常详细的字符编码讲解,ASCII、GB2312、GBK、Unicode、UTF-8等知识点都
https://www.bilibili.com/video/BV1gZ4y1x7p7/?share_source=copy_web&vd_source=b3e03023cb0d45ae83f64dd03cefe91f
你懂乱码吗?锟斤拷烫烫烫
https://www.bilibili.com/video/BV1xP4y1J7CS/?spm_id_from=333.337.search-card.all.click&vd_source=ac2ac39e491fe6b482935c71bedb9f28
UTF-16BE、UTF-16LE、UTF-16 三者之间的区别
https://blog.csdn.net/QQxiaoqiang1573/article/details/84937863

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值