Unicode:UTF-8与UTF-16的区别

  为了在计算机中表示字符,人们指定了一种编码:ASCII码,ASCII码由一个字节的7位表示,共128个字符,由于发展需要使用一个字节的全部8位来表示字符,共256个字符,称为扩展ASCII码,中国为了表示汉字用两个扩展ASCII码,该方法称为GB-2312,后来日韩阿拉伯台湾都用类似的方法扩展本地字符集,为了把全世界人民所有的所有的文字符号都统一进行编码,于是制定了UNICODE标准字符集。即用两个字节表示一个字符,这下全世界任何一个地区的软件,可以不用修改地就能在另一个地区运行了。
  UTF-8与UTF-16的区别:UTF-16表示任何字符对应的数字都用两个字节来保存,而UTF-8并不是指用一个字节来保存字符,(这里用的词为保存而不是表示,表示是指用一串数字来表示某个字符,保存则是将这串数字使用某种规则存储在内存中)。那么真正的UTF-8是什么意思,当用UTF-8保存字符说的是:存储该字符的字节是可变的,可以是一个两个三个字节,当然不能超过三个字符。
  举个例子:假如中文字"汉"对应的unicode是6C49(这是用十六进制表示,用十进制表示是27721,二进制表示就是01101100 01001001(共16 bit,两个字节)。
  用UTF-16保存"汉":假如用UTF-16保存的话就是01101100 01001001(共16 bit,两个字节),程序解析的时候知道是UTF-16就把两个字节当成一个单元来解析,这个很简单。
  用UTF-8保存"汉":用UTF-8就有复杂点.因为此时程序是把一个字节一个字节的来读取,然后再根据字节中开头的bit标志来识别是该把1个还是两个或三个字节做为一个单元来处理。
  0xxxxxxx,如果是这样的01串,也就是以0开头后面是啥就不用管了XX代表任意bit。就表示把一个字节做为一个单元,就跟ASCII完全一样.
  110xxxxx 10xxxxxx.如果是这样的格式,则把两个字节当一个单元
  1110xxxx 10xxxxxx 10xxxxxx 如果是这种格式则是三个字节当一个单元.
  这是约定的规则.你用UTF-8来表示时必须遵守这样的规则.我们知道UTF-16不需要用啥字符来做标志,所以两字节也就是2的16次能表示65536个字符.
  而UTF-8由于里面有额外的标志信息,所有一个字节只能表示2的7次方128个字符,两个字节只能表示2的11次方2048个字符.而三个字节能表示2的16次方,65536个字符
由于"汉"的编码27721大于2048了所有两个字节还不够,只能用三个字节来表示
  所有要用1110xxxx 10xxxxxx 10xxxxxx这种格式.把27721对应的二进制从左到右填充XXX符号(实际上不一定从左到右,也可以从右到左,这是涉及到另外一个问题.
  通常情况下,UTF-16统一采用两个字节表示一个字符,虽然在表示上非常简单方便,但是也有其缺点,有很大一部分字符用一个字节就可以表示的现在要用两个字节表示,存储空间放大了一倍,而在网络带宽还非常有限的情况下,这样会增大网络传输的流量,而且也没有必要。而UTF-8采用了一种变长技术,每个编码区域有不同的字码长度。不同类型的字符可以由1-6个字节组成。UTF-8的编码规则是:
(1)如果一个字节,最高位(第8位)为0,表示这是一个ASCII字符(00-7F)。可见,所有的ASCII编码已经是UTF-8了。
(2)如果一个字节,以11开头,连续的1的个数暗示这个字符的字节数,例如:110xxxxx代表它是双字节UTF-8字符的首字节。
(3)如果一个字节,以10开始,表示它不是首字节,需要向前查找才能得到当前字符的首字节。
参考地址:
https://www.cnblogs.com/kingcat/archive/2012/10/16/2726334.html
http://swiftlet.net/archives/category/char-encoding

你可能感兴趣的:(UNIDCODE,UTF-8,UTF-16,字符)