持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情
字符集和字符编码在我们的工作中是很常见的一些概念,很多时候因为没有区分清楚概念导致自己不知道如何选择。




字符集和字符编码的关系
我们可以通过一张图来了解二者的关系

从图上我们可以看到字符编码是字符集的实现,一个字符集可以对应多个实现的字符编码,如我们常见的UTF-8就是Unicode字符集的一种实现。
为什么会有多种字符集
首先要知道我们的自算计只能识别的是二进制数据也就是010101类似这样的二进制数,计算机是美国人最先发明开始使用的,由于英文字母并不是很多,加上数字和一些标点符号也并不庞大,要先计算机能够识别英语,那么只要有一种0101这种二进制数字到英文的映射关系就可以了,所以最开始就采用了ascll这种单字节编码系统,这样计算机就可以把人类的语言转化为自己可以识别的机器语言了,这就是编码,那么从二进制数字到人类语言的转换自然就是对应解码了。随着计算机的快速推广,很快许多国家也加入其中,就那中国来说,其中的汉字早已不是单个字节能够满足的了,所以后续又推出了GBK码,GB也就是国标的意思,后来计算机再不断的发展,每个不同语言的国家都需要给出对应的映射关系,这样字符集的种类就越来越多,很显然编码要是和解码的不是同一个字符集那么肯定就会出现乱码的情况。所以国际标准化组织ISO就推出了Unicode这种编码,肿着字符集可以说是解决了跨语言、跨平台的交流的问题。
为什么有的字符集会对应多种字符编码
一种字符集对应一种字符编码这很合理,一对多反而容易混乱,那么为什么Unicode还有对应的三种编码形式呢?我们知道新的字符集出现的原因是旧的字符集无法囊括现在的字符了,那么新的字符编码产生就是因为其认为传统的编码方案不太好,但是在不弄出新的字符集的情况下,那么只能从字符编码的方面下手了,这样就出现了一对多的关系了。拿unicode举例:英文字母只要一个自己来编码,但是中文需要两个,如果为了能兼容都采用2个字节,那么英文字符的编码就会造成浪费,因此就需要在字符代码和字符编码间进行再编码,这样就引出了UTF-8、UTF-16等编码方式。可以看到UTF-8等编码的形式有效又节约存储空间和传输带宽,所以应用十分的广泛。
其他
在js中很多时候我们也会用到字符的ascll,js为我们提供了charCodeAt(),来获取一个字符的ascll码,用charCode()来获取一个一个数字对应的字符,在进行字符统计的时候这两个方法还是实用的。