[编码]编码定义与分类:文本编码
作者:互联网
文章目录
突然记起来,之前在学习二维码的时候整理过有关编码的内容
一、编码
计算机是美国发明的(说的不是很准确,这种溯源问题我不是很想去纠结),在计算机诞生的那个年代,美国人对他们使用的字符进行编码,什么数字、大写字母、小写字母,标点符号,算上一些控制字符,总共还不到 128 个。后来微软全球卖它的个人 PC ,卖到英国,卖到法国,卖到中国,卖到韩国…卖到英国还好,和美国都用英语,直接用就行。卖到法国,也好办,一个字节可容纳 256 个字符, ascii 使用的 7 位编码,一个字节中最高位固定为 0 。法国人把最高为整成 1 ,跟 ascii 也不冲突。卖到中国呢,我一个泱泱大国的字符个数,一个字节哪能表示完全?两个字节都放不下( GB2312 是二字节编码,放下简体汉字,繁体汉字就没编进去,后来出现的 GBK ,还有 GB18030 )。到了中国台湾省,人家用繁体汉字,使用 Big5 (大五码),到了韩国还有韩国的一套编码。
所以言归正传,编码就是把我们使用的字符(数字、字母、汉字…)编排到字节里,就是这么一个过程。
常用编码:UCS-2,UCS-4,UTF-8,UTF-16,UTF-32,GB2312,Big5,KANJI
有关编码,可以参考阮一峰的文章,十分经典的一篇:字符编码笔记:ASCII,Unicode 和 UTF-8
二、字符集
与编码对应的,是字符集。字符集可以理解为一张大表,可以是一维的,也可以是二维的,也可以是多维的 … 字符集的作用是涵盖它所包含的全部字符,比如 ascii 字符集,就是全部 ascii 字符。汉字字符集(区位码),就是全部汉字(这个肯定不全,中国汉字到底有多少,没人说的清楚)… 字符集里面,只有字符的值不重复就可以了,好比我们的身份证,一人一证。
常用的字符集:Unicode字符集
字符集与编码区别:这个我也说不太清,我的理解是,字符集主要作用是涵盖全部的字符,给每个字符赋予一个唯一的值;编码是为了传输时,能够准确传递,对字符集的值进行编排,比如 UTF-8 编码(或者说,发送一个汉字时,假设使用 GB2312 编码,汉字使用两字节,如果直接使用字符集,直接发送一个数值,先发高字节还是低字节?规定了,那就是编码,比如 UCS-2 和 UCS-4 编码,直接将 Unicode 的 UCS 字符集的值进行发送,然后只是单纯规定了 LE 还是 BE 模式,决定高字节先发还是低字节先发)
三、Unicode编码
Unicode 是万国码,涵盖了全球所有国家使用的字符(理论上)。
关于 Unicode 的知识,参考文章:彻底弄懂 Unicode 编码
Unicode编码主要有:UCS-2,UCS-4,UTF-8,UTF-16,UTF-32
至于什么是UCS-2?什么是UCS-4?参考这篇:Unicode, UTF-8, UTF-16, UTF-32, UCS-2, UCS-4
言归正传:
无论什么编码,无非是用某种编码方式进行编码,然后用这种编码方式进行解码,相当于对暗号,比如著名的土匪黑话——“天王盖地虎,宝塔镇河妖”——一样,在土匪眼里,这句话包含了有用信息,可对于一些其他人,这什么跟什么啊,驴唇不对马嘴啊。
现在很多设备都是通过字符分析,推测出编码格式后然后解码,所以一般不会特意的指出某些字符是怎么编码的(因为在制定编码格式时候,有意或无意的会规避冲突,在加上中国的一些文本数据基本上只会在中国圈里流传,所以指定一个默认的解码方式基本可以解决大部分问题,此外还可以通过先分析一部分字符来推测出这部分字符使用什么编码,因为应该没有哪个正常人会把一串字符又用 UTF-8 又用 GBK 编码的,毕竟做IT的防君子不防小人嘛)。
但是这种学习过程有时会出错,比如我们的 win10 上的记事本,它是使用 ANSI 编码的(什么是 ANSI 编码?准确说它不是一个编码,是微软提出来的,只有微软的设备上有,它的作用是使用当前系统环境的编码作为编码方式,比如微软卖到中国的 win10 系统,系统编码使用的 GB2312 ,那么 ANSI 等价 GB2312 。卖到日本的, ANSI 等价 KANJI 。简单说,就是系统的环境语言。)这样问题来了,微软的记事本是默认 ANSI 编码的,当你打开一个记事本,写上“联通”,当前是可以正常显示的,然后关掉,重新打开,就显示乱码了。原因就是“联通”二字,它俩的ANSI编码(就是 GB2312 编码)下是 0xC1AA 和 0xCDA8 ,满足 UTF-8 的编码方式,导致记事本认为它是用 UTF-8 编码的。网传是因为联通得罪了微软,就是开玩笑的话,实际就是微软的 BUG :默认用 ANSI 编码,却默认用 UTF-8 解码(实在搞不懂?可能是 Unicode 太好了,连微软都得屈服去使用它,可能吧)。
为了解决这种问题,有一个不是很好的解决方案:在最开始向传输一个指明编码方式的数据串(微软的 BOM 头,当然这个不是单纯指明编码方式的,更多的是指明一些限制信息的,比如 UCS-2 时的表示 LE 和 BE 信息就是放在这部分的,当然可能不叫 BOM 就是了)。
标签:编码,UCS,定义,字符,字符集,Unicode,UTF,文本 来源: https://blog.csdn.net/weixin_39869569/article/details/116301508