zoukankan      html  css  js  c++  java
  • UNICODE UTF编码方式解析

    先明确几个概念

    基础概念部分

    1.字符编码方式CEF(Character Encoding Form)

    对符号进行编码,便于处理与显示

    常用的编码方式有

    GB2312(汉字国标码 2字节)

    ASCII (标准交换字符 1字节)

    UNICODE(统一码, 4字节;现常用2字节编码方式,即使用0组第0面(BMP字符),不包含扩充字符)

    2.码点(Code Point)

    二维表中行与列相交的点,称之为码点,也称之为码位(Code position);每个码点分配一个唯一的编号,称之为码点值或码点编号,除开某些特殊区域(比如代理区、专用区)的非字符码点和保留码点,每个码点唯一对应于一个字符。

     

    3.码元(Code Unit)

    在计算机存储和网络传输时,码点值(即字符编号)被映射到一个或多个码元。

    码元可理解为字符编码方式CEF码点值进行编码处理时作为一个整体来看待的最小基本单元(基本单位)

     

    最常用的码元是8位(1字节)的单字节码元,另外还有16位(2字节)和32位(4字节)两种多字节码元,分别相当于C++中的无符号整型BYTE、WORD、DWORD

    用代码表示如下:

    typedef unsigned char BYTE; //1个字节

    typedef unsigned short WORD; //2个字节

    typedef unsigned long DWORD; //4个字节

    4.编码字符集和字符集编码

    Unicode是编码字符集,而UTF-8、UTF-16、UTF-32是字符集编码

    通俗来说Unicode是给字符编了序号,而这些序号具体怎么传输和表示则是不同UTF来决定。

    UTF编码方式

    UNICODE编码下,这三种码元对应不同的三种UTF编码方式(即Unicode码转换格式Unicode Transformation Format,或称通用字符集转换格式UCS Transformation Format):

    • UTF-8(8-bit Unicode/UCS Transformation Format),
    • UTF-16(16-bit Unicode/UCS Transformation Format),
    • UTF-32(32-bit Unicode/UCS Transformation Format);

    下面分别介绍这三种编码方式

    UTF-8

    UTF-8是一种变长字节编码方式。对于某一个字符的UTF-8编码,如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的位数,其余各字节均以10开头。UTF-8最多可用到6个字节。 
    如表: 
    1
    字节 0xxxxxxx 
    2
    字节 110xxxxx 10xxxxxx 
    3
    字节 1110xxxx 10xxxxxx 10xxxxxx 
    4
    字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 
    5
    字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 
    6
    字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 

     

    以""字为例

     

    Unicode字符编码值 0x6C49

    对应十进制为23383

    对应二进制为110 1100 0100 1001

    那么利用UTF-8的编码规则 一个16位Unicode编码至少需要用三个字节(24位)来表示

    则第一个字节的前三位应为111

    而后两个字节分别可以包含Unicode编码的6位,共12位

    所以第一个字节应包含第13-16位,共4位

     

    第一个字节为 0xE6 11100110

    第二个字节为 0xB1 10110001

    第三个字节为 0x89 10001001

     

    将Unicode字符编码与UTF-8进行对比 可以较好理解上述规则

    Unicode码:         110    110001    001001

    UTF-8 码:    11100 110 10 110001 10 001001

     

    UTF-16码

    相对简单

    直接为Unicode编码值0x6C49

     

    UTF-32码

    在UTF-16上进一步扩充即可得到

    UTF-32编码值为0x00006C49

     

     

    下图为其他示例字符图,读者利用上述可以进行验证。

     

     

    最后是多字节码元的UTF-16、UTF-32不同之处

     

     

    本文参考博客:http://www.cnblogs.com/benbenalin/p/6921553.html

  • 相关阅读:
    最好的(自我感觉)实现多个ASP.NET跨程序池共享Session [转]
    ASP.NET MVC 实现二级域名 [转]
    余弦相似度
    用Appfabric cache存储asp.net Session遇到的问题及总结(转)
    Hbase C# Thrift 连接 , 提示 因为队列满或者系统缺乏足够的缓冲空间
    Dictionary<byte[],string> 出现错误的解决方案
    百分点推荐引擎:从需求到架构
    ETL 学习 (转)
    消息队列软件产品大比拼
    基于Hbase的用户评分协同过滤推荐算法
  • 原文地址:https://www.cnblogs.com/nevel/p/9644179.html
Copyright © 2011-2022 走看看