UTF-16

UTF-16Unicode的其中一个使用方式。

UTF是Unicode/UCS Transformation Format,即把Unicode转做某种格式的意思。

它定义于ISO/IEC 10646-1的附录Q,而RFC2781也定义了相似的做法。

在基本多语言平面内定义的符号((Basic Multilingual Plane, BMP),或称第零平面(Plane 0)),使用2个字节表示,在此之外的字符(其他平面内的字符),则使用4个字节表示。由于第零平面内,从0XD800到0XDFFF之间的区段是没有使用的,因此可以利用0XD800-0XDFFF之间的值来对辅助平面的字符进行编码。

其编码方法是:

1如果字符编码U小于0x10000,也就是十进制的0到65535之内,则直接使用两字节表示;

2如果字符编码U大于0x10000,由于UNICODE编码范围最大为0x10FFFF,从0x10000到0x10FFFF之间 共有0xFFFFF个编码,也就是需要20个bit就可以标示这些编码。用U'表示从0-0xFFFFF之间的值,将其前 10 bit作为高位和16 bit的数值0xD800进行 逻辑or 操作,将后10 bit作为低位和0xDC00做 逻辑or 操作,这样组成的 4个byte就构成了U的编码。

目录

[编辑] 示例: UTF-16 编码程序

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

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

因为这个字超过 U+FFFF 所以无法用 UCS-2 的格式编码

16进制编码范围UTF-16表示方法(二进制)10进制码范围字节数量
U+0000---U+FFFFxxxxxxxx xxxxxxxx0-655352
U+10000---U+10FFFF110110yyyyyyyyyy 110111xxxxxxxxxx65536-11141114

UTF-16比起UTF-8,好处在于大部分字符都以固定长度的字节(2字节)存储,但UTF-16却无法兼容于ASCII编码。

[编辑] UTF-16的编码模式

UTF-16的大尾序和小尾序存储形式都在用。一般来说,以Macintosh制作或存储的文字使用大尾序格式,以MicrosoftLinux制作或存储的文字使用小尾序格式。

为了弄清楚UTF-16文件的大小尾序,在UTF-16文件的开首,都会放置一个U+FEFF字符作为Byte Order Mark(UTF-16LE以FF FE代表,UTF-16BE以FE FF代表),以显示这个文字文件是以UTF-16编码,其中U+FEFF字符在UNICODE中代表的意义是ZERO WIDTH NO-BREAK SPACE,顾名思义,它是个没有宽度也没有断字的空白。

以下的例子有四个字符:“朱”(U+6731)、半角逗号 (U+002C)、“聿”(U+807F)、“

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值