zoukankan      html  css  js  c++  java
  • UTF-8 可变编码格式

    转自:http://blog.csdn.net/swedenfeng/article/details/53467720
     
    UTF-8 是一种可变编码格式,长度从一个字节到四个字节,可根据UTF-8字符的第一个字节来识别一个UTF-8字符的长度(具体见下面描述).

    因为网络中大部分的字符是ASCII码字符,UTF-8可以用一个字节表示ASCII字符,相较于UTF-16和UTF-32的两个字节或者四个字节,大幅节省了空间和传输带宽.

    几个UTF-8的编码例子 (由该网页工具转换 https://sites.google.com/site/nathanlexwww/tools/utf8-convert 

    字符            UTF-8编码    Byte 1                   Byte 2             Byte 3

    A                                         01000001                                                                                          

    Ö                                        11000011            10010110       

    中                                       11100100            10111000      10101101

    Note:   Byte 1 中开头"1"的个数就是整个 UTF-8编码中字节的数目(只适用于长度大于等于两个字节的UTF编码,表示ASCII编码的UTF首字节的首位是0)

    #以下内容部分来自wiki,部分来自stackoverflow.

    UTF-88-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,也是一种前缀码。它可以用来表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII兼容,这使得原来处理ASCII字符的软件无须或只须做少部分修改,即可继续使用。因此,它逐渐成为电子邮件网页及其他存储或发送文字的应用中,优先采用的编码。

    UTF-8使用一至六个字节为每个字符编码(尽管如此,2003年11月UTF-8被RFC 3629重新规范,只能使用原来Unicode定义的区域,U+0000到U+10FFFF,也就是说最多四个字节):

      Binary    Hex                 Comments
    0xxxxxxx  0x00..0x7F   Only byte of a 1-byte character encoding
    10xxxxxx  0x80..0xBF   Continuation bytes (1-3 continuation bytes)
    110xxxxx  0xC0..0xDF   First byte of a 2-byte character encoding
    1110xxxx  0xE0..0xEF   First byte of a 3-byte character encoding
    11110xxx  0xF0..0xF7   First byte of a 4-byte character encoding
      
      
    对于UTF-8编码中的任意字节X,如果X的第一位为0,则X独立的表示一个字符(ASCII码)
    如果X的第一位为1,第二位为0,则X为一个多字节字符中的后续字节(非第一字节)
    如果X的前两位为1,第三位为0,则X为两个字节表示的字符中的第一个字节
    如果X的前三位为1,第四位为0,则X为三个字节表示的字符中的第一个字节
    如果X的前四位为1,第五位为0,则X为四个字节表示的字符中的第一个字节

    Unicode 和 UTF-8 之间的转换关系表 ( x 字符表示码点占据的位 )
    码点的位数码点起值码点终值字节序列Byte 1Byte 2Byte 3Byte 4Byte 5Byte 6
      7 U+0000 U+007F 1 0xxxxxxx
    11 U+0080 U+07FF 2 110xxxxx 10xxxxxx
    16 U+0800 U+FFFF 3 1110xxxx 10xxxxxx 10xxxxxx
    21 U+10000 U+1FFFFF 4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    26 U+200000 U+3FFFFFF 5 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    31 U+4000000 U+7FFFFFFF 6 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

    • 在ASCII码的范围,用一个字节表示,超出ASCII码的范围就用字节表示,这就形成了我们上面看到的UTF-8的表示方法,这様的好处是当UNICODE文件中只有ASCII码时,存储的文件都为一个字节,所以就是普通的ASCII文件无异,读取的时候也是如此,所以能与以前的ASCII文件兼容。
    • 大于ASCII码的,就会由上面的第一字节的前几位表示该unicode字符的长度,比如110xxxxx前三位的二进制表示告诉我们这是个2BYTE的UNICODE字符;1110xxxx是个三位的UNICODE字符,依此类推;xxx的位置由字符编码数的二进制表示的位填入。越靠右的x具有越少的特殊意义。只用最短的那个足够表达一个字符编码数的多字节串。注意在多字节串中,第一个字节的开头"1"的数目就是整个串中字节的数目。

    Some useful links:

    http://www.unicode.org/Public/9.0.0/ucd/UnicodeData.txt

    http://www.utf8-chartable.de/unicode-utf8-table.pl?utf8=bin


    ##博客仅作个人记录##

  • 相关阅读:
    Android传递中文参数方法(之一)
    配置类与yaml
    修改ip失败,一个意外的情况处理方法
    oracle 自增序列与触发器
    Excel导入数据带小数点的问题
    数据库null与空的区别
    小米手机无法打开程序报错Unable to instantiate application com.android.tools.fd.runtime.BootstrapApplication的解决办法
    gradle类重复的问题解决方法
    windowSoftInputMode属性讲解
    android studio 的配置
  • 原文地址:https://www.cnblogs.com/paulbai/p/6586941.html
Copyright © 2011-2022 走看看