zoukankan      html  css  js  c++  java
  • 编程基础字符篇(3)



    UTF8是一种储存和传送的格式。



    UTF8是以8bits1Bytes为编码的最基本单位,也可以基于16bits32bits的形式,分别称为UTF16UTF32,但目前使用不多,而UTF8则被广泛应用在文件储存和网络传输中。





    编码原理



    先看这个模板:



    UCS-4 range (hex.) UTF-8
    octet sequence (binary)

    0000 0000-0000 007F 0xxxxxxx

    0000 0080-0000 07FF 110xxxxx 10xxxxxx

    0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx



    0001 0000-001F FFFF 11110xxx
    10xxxxxx 10xxxxxx 10xxxxxx

    0020 0000-03FF FFFF 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

    0400 0000-7FFF FFFF 1111110x 10xxxxxx ... 10xxxxxx



    编码步骤:

    1)
    首先确定需要多少个8bits(octets)

    2)
    按照上述模板填充每个octets的高位bits

    3)
    把字符的bits填充至x中,字符顺序:低位高位,UTF8顺序:最后一个octet的最末位x→第一个octet最高位x

    4)
    解码的原理一样。



    实例:(留意每个bit的颜色,粗体字为模板内容)



    UCS-4 UTF-8

    HEX BIN Bytes BIN HEX Bytes

    0000 000A 00001010 4 00001010 0A 1

    0000 0099 10011001 4 11000010 10011001 C2 99 2

    0000 8D99 10001101 10011001 4 11101000 10110110 10011001 E8 B6 99 3



    UTF8格式储存的文件档首标识为EF
    BB BF





    效率



    从上述编码原理中得可以得以下结论:

    1.
    每个英文字母、数字所占用空间为1 Byte

    2.
    汉字占3
    Bytes


    而直接使用无论是ANSI还是Unicode/UCS2来编码,中文都只占用2字节。所以UTF8对英文来说是个非常好的方案,但对中文来说并不是一个好的选择。



    也就是说,英文编码一般用UTF8,中文使用的是GB18030



    Unicode:

    unicode.org
    制定的编码机制, 要将全世界常用文字都函括进去.

    1.0中是16位编码,
    U+0000U+FFFF.
    每个2byte码对应一个字符;
    2.0开始抛弃了16位限制,
    原来的16位作为基本位平面,
    另外增加了16个位平面,
    相当于20位编码,
    编码范围00x10FFFF.



    UCS:

    ISO
    制定的ISO10646标准所定义的
    Universal Character Set,
    采用4byte编码.



    Unicode
    UCS的关系:

    ISO
    unicode.org是两个不同的组织,
    因此最初制定了不同的标准; 但自从unicode2.0开始,
    unicode
    采用了与ISO 10646-1相同的字库和字码,
    ISO
    也承诺ISO10646将不会给超出0x10FFFFUCS-4编码赋值,
    使得两者保持一致.



    UCS
    的编码方式:

    UCS-2,
    unicode2byte编码基本一样.

    UCS-4, 4byte
    编码, 目前是在UCS-2前加上2个全零的byte.



    UTF:
    Unicode/UCS Transformation Format

    UTF-8, 8bit
    编码, ASCII不作变换,
    其他字符做变长编码, 每个字符1-3 byte. 通常作为外码.
    有以下优点:

    *
    CPU字节顺序无关,
    可以在不同平台之间交流

    *
    容错能力高,
    任何一个字节损坏后, 最多只会导致一个编码码位损失, 不会链锁错误(GB码错一个字节就会整行乱码)

    UTF-16, 16bit
    编码, 是变长码,
    大致相当于20位编码,
    值在00x10FFFF之间,
    基本上就是unicode编码的实现.
    它是变长码,
    CPU字序有关,
    但因为最省空间,
    常作为网络传输的外码.

    UTF-16
    unicodepreferred
    encoding.

    UTF-32,
    仅使用了unicode范围(00x10FFFF)32位编码,
    相当于UCS-4的子集.



    UTF
    unicode的关系:

    Unicode
    是一个字符集, 可以看作为内码.

    UTF是一种编码方式,
    它的出现是因为unicode不适宜在某些场合直接传输和处理. UTF-16直接就是unicode编码,
    没有变换,
    但它包含了0x00在编码内,
    256字节码的第一个byte都是0x00,
    在操作系统(C语言)中有特殊意义,
    会引起问题.
    采用UTF-8编码对unicode的直接编码作些变换可以避免这问题, 并带来一些优点.



    中国国标编码:

    GB 13000:
    完全等同于ISO 10646-1/Unicode 2.1, 今后也将随ISO
    10646/Unicode
    的标准更改而同步更改.

    GBK:
    GB2312的扩充,
    以容纳GB2312字符集范围以外的Unicode
    2.1
    的统一汉字部分, 并且增加了部分unicode中没有的字符.

    GB 18030-2000:
    基于GB 13000, 作为Unicode
    3.0
    GBK扩展版本,
    覆盖了所有unicode编码,
    地位等同于UTF-8,
    UTF-16,
    是一种unicode编码形式.
    变长编码,
    用单字节/双字节/4字节对字符编码.
    GB18030
    向下兼容GB2312/GBK.

    GB 18030
    是中国所有非手持/嵌入式计算机系统的强制实施标准.



    做个快乐的自己。
  • 相关阅读:
    linux/eclipse/c++ 动态库的创立与调用
    虚拟机NetworkAdapter三种方式的区别
    关于“三层架构”和MVC
    C# 扩展方法
    鼠标拖移对象
    获取应用程序根目录物理路径(Web and Windows)
    一个简单的管理Web站点文件的页面程序(修改版)
    一个基于jQuery的简单树形菜单
    以人为本的程序的设计
    一个加密解密的小工具及源码(MD5, DES, RSA)
  • 原文地址:https://www.cnblogs.com/Jessy/p/2248039.html
Copyright © 2011-2022 走看看