了解字符编码

一、什么是字符编码,字符编码的来历?

1、字符集——集合

字符是各种文字和符号的总称,包括各个国家文字、标点符号、图形符号、数字等。

字符集是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,常见字符集有:ASCII字符集、ISO 8859字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。

总结:使用哪些字符,也就是说哪些汉字、字母、符号和数字等会被收入标准中。所包含“字符”的集合就叫做“字符集”。

2、字符编码——规则

字符编码就是以二进制的数字来对应字符集中的字符,比如在ASCII编码规则中,字符‘A’既不对应01000010,也不对应10000000 11110101,而是对应01000001。这就是规则。

总结:规定每个“字符”分别用一个字节还是多个字节存储,用哪些字节来存储,这个规定就叫做“编码”。

3、字符编码的来历

我们在计算机屏幕上看到的是实体化的文字,而在计算机存储介质中存放的实际是二进制的比特流,那么在这两者之间的转换规则就需要一个统一的标准,因此就产生了字符编码。

二、为什么会有那么多种字符编码,编码的演化?

1、ASCII

American Standard Code for Information Interchange,美国信息互换标准代码。

这套编码规则是由美国定制,它主要用于显示现代英语,一共规定了128个字符的编码,只占用了一个字节(8 bit)的后面7位,最前面的1位统一规定为0,一个字节都没用完。

2、ISO-8859-1

扩展ASCII编码。

利用了一个字节的第8位,即 00000000(0) ~ 01111111(127) 与ASCII的编码一样,对 10000000(128) ~ 11111111(255)这一段进行了编码。

3、GB2312

当中国人们得到计算机时,已经没有可以利用的字节状态来表示汉字,于是想到把那些ASCII码中127号之后的奇异符号们直接取消掉, 规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字。

在这些编码里,我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字符了。

这种汉字方案叫做 "GB2312"。GB2312 是对 ASCII 的中文扩展。兼容ASCII。

4、GBK

但是中国的汉字太多了,我们很快就就发现有许多人的人名没有办法打出来,于是不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容。结果扩展之后的编码方案被称为 “GBK” 标准,GBK 包括了 GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。

5、GB18030

后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字,GBK 扩成了 GB18030。从此之后,中华民族的文化就可以在计算机时代中传承了。

三、多种字符编码有没有一个统一的标准?

1、Unicode:字符集而不是字符编码

如果有一种编码,将世界上所有的符号都纳入其中,无论是英文、日文、还是中文等,大家都使用这个编码表,就不会出现编码不匹配现象。每个符号对应一个唯一的编码,乱码问题就不存在了。这就是Unicode编码。

Unicode是指一张表,里面包含了可能出现的所有字符,每个字符对应一个数字,这个数字称为码点(Code Point)。Unicode只是一个符号集,只规定字符所对应的码点,并没有指定如何存储,如何进行存储出现了不同的编码方案,关于Unicode编码方案主要有两条主线:UCS和UTF。UTF主线由Unicode Consortium进行维护管理,UCS主线由ISO/IEC进行维护管理。

2、UCS

UCS-2是定长字节的,固定使用2个字节进行编码;UCS-4是定长字节的,固定使用4个字节进行编码。

固然统一了编码方式,但它的效率不高,比如规定用4个字节存储一个符号,那么每个英文字母前都必然有三个字节是0,这对存储和传输来说都很耗资源。

3、UTF

UTF-8是一种变长编码方式,使用1-4个字节进行编码。UTF-8完全兼容ASCII,对于ASCII中的字符,UTF-8采用的编码值跟ASCII完全一致。UTF-8是Unicode一种具体的编码实现。UTF-8是在互联网上使用最广的一种Unicode的编码规则,因为这种编码有利于节约网络流量(因为变长编码,而非统一长度编码)。

UTF-8是不定长的编码,使用1、2、3、4个字节编码,而UTF-16则只使用2或4个字节编码。UTF-16也是Unicode一种具体的编码实现。

四、fromCharCode()和charCodeAt()

1、fromCharCode()

可接受一个指定的 Unicode 值,然后返回一个字符串。

<script type="text/javascript">
          document.write(String.fromCharCode(72,69,76,76,79))
</script>

结果:HELLO

2、charCodeAt()

可返回指定位置的字符的 Unicode 编码。

<script type="text/javascript">
         var str="Hello world!"
       document.write(“The Unicode for the first character is: ” + str.charCodeAt(0) + “<br />”);
</script>

结果:The Unicode for the first character is: 72

五、总结

 ASCII编码:用来表示英文,它使用1个字节表示,其中第一位规定为0,其他7位存储数据,一共可以表示128个字符。

拓展ASCII编码:用于表示更多的欧洲文字,用8个位存储数据,一共可以表示256个字符

GBK/GB2312/GB18030:表示汉字。GBK/GB2312表示简体中文,GB18030表示繁体中文。

Unicode编码:包含世界上所有的字符,是一个字符集。

UCS-2、UCS-4:是Unicode字符的实现方式之一,固定使用2个字节/4个字节进行编码,是定长字节的。

UTF-8:是Unicode字符的实现方式之一,它使用1-4个字符表示一个符号,根据不同的符号而变化字节长度。

猜你喜欢

转载自blog.csdn.net/qq_42269433/article/details/114973929