字符串编码常见的有ASCII码,Unciode编码和UTF-8编码等,那么这些字符串编码他们的做用是什么?他们之间又有何联系?下面让本人来由浅入深来说解这些编码。服务器
咱们知道,计算机只能存储二进制,不能存储字符,若是要存储字符,必须将字符转化为二进制,计算机中定义一个字节为8位,因此一个字节能存的最大整数为255,若是要表示更大的整数,则必需要更大的字节,而ASCII码则是将大小写英文字母、数字和一些符号转化为整数的一种编码,好比整数A的ASCII编码是65,小写a的ASCII编码则是97,ASCII编码一共有127个字符。编码
因为ASCII编码只编码英文字符,若是要使用汉字则要使用一种新的编码GB2312编码,而编码汉字仅仅一个字节存储的整数是不够的,因此编码汉字至少须要两个字节。code
可是若是咱们要编码日文或者韩文呢?你能够想获得的是,全世界有上百种语言,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里,各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,若是只用一种特定的编码,显示出来会有乱码。内存
解决方法就是用一种特殊的编码“Unicode编码”,Unicode把全部语言都统一到一套编码里,这样就不会再有乱码问题了。ci
既然Unicode编码将全部语言都统一到一套编码里,那么是否是每种状况都用Unicode编码就好了呢?答案是否认的,那么为何不在全部状况下都用Unicode编码呢?下面我来举个例子:
首先,根据Unicode标准,通常用两个字节来表示一个字符,某些生僻字会用四个字符来表示。字符串
假设字符“A”,它在ASCII编码条件下二进制为01000001(十进制的65);
而字符A在Unciode编码条件下二进制为00000000 01000001(根据标准Unicode须要两个字节表示,不足位补0);源码
由上面例子可知,字符A的Unicode编码比ASCII编码多占了一个字节,因此在文本全是英文的环境下,Unicode编码比ASCII编码多一倍存储空间,这是十分不划算的。那么有没有一种既能处理乱码问题又能节约空间的编码呢?固然有,下面咱们来介绍一种新的编码UTF-8编码。io
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编码的。