UTF-8和UTF-16编码方式相互转换的公式及步骤

2013年12月09日 其他资源 6条评论 阅读7092次

UTF-8和UTF-16编码方式相互转换的公式及步骤

 

不使用英文语言的地区,为使其语言文字正确显示到计算机等终端上,他的字符的编码就要单独处理了。

utf-8作为这种背景下的产物,因其编码范围等因素的制约,不得不将下一代编码方式utf-16推出。

utf-8和utf-16的编码相互转化就成为我们要掌握的重点了。以下就是正文内容:建议详细阅读。

 

UTF-16 编码程序

 

假设要将 U+64321 (16进位) 转成 UTF-16 编码. 因为它超过 U+FFFF, 所以他必须编译成32位(4个byte)的格式,如下所示

 

V  = 0x64321

Vx = V - 0x10000

   = 0x54321

   = 0101 0100 0011 0010 0001

 

Vh = 01 0101 0000 // Vx 的高位部份的 10 bits

Vl = 11 0010 0001 // Vx 的低位部份的 10 bits

w1 = 0xD800 //結果的前16位元初始值

w2 = 0xDC00 //結果的後16位元初始值

 

w1 = w1 | Vh

   = 1101 1000 0000 0000

   |        01 0101 0000

   = 1101 1001 0101 0000

   = 0xD950

 

w2 = w2 | Vl

   = 1101 1100 0000 0000

   |        11 0010 0001

   = 1101 1111 0010 0001

   = 0xDF21

 

所以这个字 U+64321 最后正确的 UTF-16 编码应该是:

 

0xD950 0xDF21

 

而在小尾序中最后的编码应该是:

 

0x50D9 0x21DF

 

假设要处理的UNICODE编码为X,来推一下位运算公式

 

第一步:X - 0x10000  得到结果为Y

 

第二步:取Y的高十位:Y >> 10   得到结果为Vh

 

第三步:取Y的低十位:Y  & 3FF(11 1111 1111) 这样就可以把十位前的全部清零了。 得到结果为Vl

 

第四步:将高位与前16位初始元0xD800 进行或操作 Vh | 0xD800  得到前半部  记为Uf

 

第五步:将低位与后16位初始元0xDC00进行或操作Vl |0xDC00 得到后半部份。Ue

 

第六步:将前后两部份合在一起。先左移十六位 (Uf << 16) 再或上Ue 即 (Uf << 16) | Ue

 

 

把这个写为宏的形式:

 

#define UNICODETOUTF16(x)  ((Uf << 16) | Ue) 将这个公式向前代替,最终得到

 

#define UNICODETOUTF16(x) (((((x - 0x10000) >>10) | 0xD800) << 16)  | (((x-0x10000)&3FF) | 0xDC00))        

 

同样使用UTF16转回为大于0x10000 的Unicode码;

 

#define MULITTHREEBYTEUTF16TOUNICODE(x,y) (((((x ^ 0xD800) << 2) | ((y ^ 0xDC00) >> 8)) << 8) | ((y ^ 0xDC00) & 0xFF)) + 0x10000 

 

本文总结整理来自多篇博客、论坛等资料。具体就不一一列出,若有侵权,请及时联系。

分享本文至:

WRITTEN BY

avatar
本文标签:UTF-8UTF-16
看了本文是不是觉得很赞,那就赶紧点击下面按钮分享给身边的朋友吧!

6 条评论

  1. avatar 津电动卷帘门

    这个步骤还是挺好的

  2. avatar bet365娱乐城

    看过了··还真不是太晓得

  3. avatar 预应力钢绞线

    这个公式可以好好学习的哈

  4. avatar 行业报告分析

    嗯嗯,看过了~

  5. avatar 梦居家

    看不太懂  不是很明白

  6. avatar 按摩椅

    看起来很不错哦

欢迎留言




用户登录

sitemap