在UTF-8中,一个汉字为何须要三个字节?

  UNICODE是万能编码,包含了全部符号的编码,它规定了全部符号在计算机底层的二进制的表示顺序。有关Unicode为何会出现就不叙述了,Unicode是针对全部计算机的使用者定义一套统一的编码规范,这样计算机使用者就避免了编码转换的问题。Unicode定义了全部符号的二进制形式,也就是符号如何在计算机内部存储的,并且每一个符号规定都必须使用两个字节来表示,也就是用16位二进制去表明一个符号,这样就致使了一个问题,英文编码的空间浪费,由于在ANSI中的符号都是一个字节来表示的,而使用了UNICODE编码就白白浪费了一个字节。也就表明着Unicode须要使用两倍的空间去存储相应的ANSI编码下的符号。虽然如今硬盘或者内存都很廉价,可是在网络传输中,这个问题就凸显出来了,你能够这样想一想,原本1M的带宽在ANSI下能够表明1024*1024个字符,可是在Unicode下却只能表明1024*1024/2个字符。也就是1MB/s的带宽只能等价于512KB/s,这个很可怕啊。因此为了解决符号在网络中传输的浪费问题,就出现了UTF-8编码,Unicode transfer format -8 ,后面的8表明是以8位二进制为单位来传输符号的,可是这样又致使了一个问题,虽然UTF-8可使用一个字节来表示ANSI下的符号,可是对于其它相似汉语的符号,得须要两个字节来表示,因此计算机不知道如何去截取一个符号,也就是一个符号对应的二进制的截取开始位置和截取结束位置。因此为了解决Unicode下的ANSI符号的空间浪费和网络传输下如何截取字符的问题,UTF规定:若是一个符号只占一个字节,那么这个8位字节的第一位就为0。若是为两个字节,那么规定第一个字节的前两位都为1,而后第一个字节的第三位为0,第二个字节的前两位为10,而后若是是三个字节的话,那么第一个字节的前三位为111,第四位为0,剩余的两个字节的前两位都为10。按照这样的算法去思考一个中文字符的UTF-8是怎么表示的:一个中文字符须要两个字节来表示,两个字节一共是16位,那么UTF-8下,两个字节是不够的,由于两个字节下,第一个字节已经占据了三位:110,而后剩余的一个字节占据了两位:10,如今就只剩下11位,与Unicode下的两个字节,16位去表示任意一个字符是相悖的。因此就使用三个字节去表示非ANSI字符:三个字节下,一共是24位,第一个字节头四位是:1110,后两个字节的前两位都是:10,那么24位-8位=16位,恰好两个字节去表示Unicode下的任意一个非ANSI字符。这也就是为何UTF-8须要使用三个字节去表示一个非ANSI字符的缘由了!算法

  题外话:网络

  然,中国的汉字多达10多万,经常使用的汉字3500左右[08年统计],若是用3个字节来表示,一共只有2^16(65535)种可能,不足以表示10多万的汉字。因此中日韩的超大字符集是采用的4个字节来表示的,多达6万多个。可是平时使用超大字符集的几率0.01%都不到。因此咱们通常认为平常的中文在UTF-8中占三个字节 便可!编码

多个字节提供的位数超过了所须要的,多余的位以0补全到编码前面spa

相关文章
相关标签/搜索