字符串编码的那些事

字符串编码常见的有ASCII码,Unciode编码和UTF-8编码等,那么这些字符串编码他们的作用是什么?他们之间又有何联系?下面让本人来由浅入深来讲解这些编码。

由ASCII码说起

我们知道,计算机只能存储二进制,不能存储字符,如果要存储字符,必须将字符转化为二进制,计算机中定义一个字节为8位,所以一个字节能存的最大整数为255,如果要表示更大的整数,则必须要更大的字节,而ASCII码则是将大小写英文字母、数字和一些符号转化为整数的一种编码,比如整数A的ASCII编码是65,小写a的ASCII编码则是97,ASCII编码一共有127个字符。

由于ASCII编码只编码英文字符,如果要使用汉字则要使用一种新的编码GB2312编码,而编码汉字仅仅一个字节存储的整数是不够的,所以编码汉字至少需要两个字节。

但是如果我们要编码日文或者韩文呢?你可以想得到的是,全世界有上百种语言,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里,各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,如果只用一种特定的编码,显示出来会有乱码。

解决之道

解决方法就是用一种特殊的编码“Unicode编码”,Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。

新的问题产生了

既然Unicode编码将所有语言都统一到一套编码里,那么是不是每种情况都用Unicode编码就行了呢?答案是否定的,那么为什么不在所有情况下都用Unicode编码呢?下面我来举个例子:
首先,根据Unicode标准,一般用两个字节来表示一个字符,某些生僻字会用四个字符来表示。

假设字符“A”,它在ASCII编码条件下二进制为01000001(十进制的65);
而字符A在Unciode编码条件下二进制为00000000 01000001(根据标准Unicode需要两个字节表示,不足位补0);

由上面例子可知,字符A的Unicode编码比ASCII编码多占了一个字节,所以在文本全是英文的环境下,Unicode编码比ASCII编码多一倍存储空间,这是十分不划算的。那么有没有一种既能处理乱码问题又能节约空间的编码呢?当然有,下面我们来介绍一种新的编码UTF-8编码。

UTF-8编码与Unicode编码

UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间,UTF-8编码将英文字符编码成一个字节,所以使用UTF-8编码能很好的兼容古老的用ASCII编码的文本文件。
既然弄清楚了UTF-8编码、Unicode编码的区别和联系,下面我来介绍下这三个编码的应用场景:

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。

比如,在服务器生成网页传给客户端的过程中,服务器会把动态生成的Unicode内容转换成UTF-8编码传给客户端,所以你在客户端网页源码上会看到网页是由UTF-8编码的。

相关推荐