UTF-16
UTF-16
UTF
UTF-16描述
[编辑]Unicode
从U+0000至 U+D7FF以及从U+E000至 U+FFFF的 码位
[编辑]从U+10000到 U+10FFFF的 码位
[编辑]辅助
lead \ trail | DC00 | DC01 | … | DFFF |
---|---|---|---|---|
D800 | 10000 | 10001 | … | 103FF |
D801 | 10400 | 10401 | … | 107FF |
⋮ | ⋮ | ⋮ | ⋱ | ⋮ |
DBFF | 10FC00 | 10FC01 | … | 10FFFF |
- 码位减去
0x10000
,得 到 的 值的范围为20比 特 长的0...0xFFFFF
。 高位 的 10比 特 的 值(值的范围为0...0x3FF
)被 加 上 0xD800
得 到 第 一个码元或称作高位代理(high surrogate),值的范围是 0xD800...0xDBFF
。由 于高位 代理 比 低位 代理 的 值要小 ,所以 为了避免混淆 使用 ,Unicode标准现在称 高 位 代理 为前 导代理 (lead surrogates)。低位 的 10比 特 的 值(值的范围也是0...0x3FF
)被 加 上 0xDC00
得 到 第 二个码元或称作低位代理(low surrogate),现在值的范围是 0xDC00...0xDFFF
。由 于低位 代理 比 高位 代理 的 值要大 ,所以 为了避免混淆 使用 ,Unicode标准现在称 低位 代理 为后 尾 代理 (trail surrogates)。
从U+D800到 U+DFFF的 码位
[编辑]Unicode标准规定U+D800...U+DFFF
示 例 :
[编辑]以U+10437编码(𐐷)为例:
0x10437
减去0x10000
,结果为0x00437
,二 进制为0000 0000 0100 0011 0111
分割 它的上 10位 值和下 10位 值(使用 二 进制):0000 0000 01
和 00 0011 0111
添加 0xD800
到 上 值,以形成 高位 :0xD800 + 0x0001 = 0xD801
添加 0xDC00
到 下 值,以形成 低位 :0xDC00 + 0x0037 = 0xDC37
下表 总结了 一起示例的转换过程,颜色指示 码点位 如何 分布 在所 述 的 UTF-16中 。由 UTF-16编码过程中 加入 附加 位 的 以黑色 显示。
UTF-16 |
UTF-16 |
UTF-16BE |
UTF-16LE | |||
---|---|---|---|---|---|---|
$ | U+0024
|
0000 0000 0010 0100
|
0000 0000 0010 0100
|
0024
|
00 24
|
24 00
|
€ | U+20AC
|
0010 0000 1010 1100
|
0010 0000 1010 1100
|
20AC
|
20 AC
|
AC 20
|
𐐷 | U+10437
|
0001 0000 0100 0011 0111
|
1101 1000 0000 0001 1101 1100 0011 0111
|
D801 DC37
|
D8 01 DC 37
|
01 D8 37 DC
|
𤭢 | U+24B62
|
0010 0100 1011 0110 0010
|
1101 1000 0101 0010 1101 1111 0110 0010
|
D852 DF62
|
D8 52 DF 62
|
52 D8 62 DF
|
示 例 :UTF-16编码程 序
[编辑]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
0xD950 0xDF21
而在
0x50D9 0x21DF
16进制编码范围 | UTF-16 |
10进制码范围 | |
---|---|---|---|
U+0000 - U+FFFF |
xxxx xxxx xxxx xxxx - yyyy yyyy yyyy yyyy |
0-65535 | 2 |
U+10000 - U+10FFFF |
1101 10yy yyyy yyyy - 1101 11xx xxxx xxxx |
65536-1114111 | 4 |
UTF-16
UTF-16的 编码模 式
[编辑]UTF-16
为了FF FE
FE FF
ZERO WIDTH NO-BREAK SPACE
,顾名
编码 |
编码 |
编码 | ||||
---|---|---|---|---|---|---|
BOM | , | 聿 | 𪚥 | |||
UTF-16 LE | 31 67 | 2C 00 | 7F 80 | 69 D8 A5 DE | ||
UTF-16 BE | 67 31 | 00 2C | 80 7F | D8 69 DE A5 | ||
UTF-16 LE | FF FE | 31 67 | 2C 00 | 7F 80 | 69 D8 A5 DE | |
UTF-16 BE | FE FF | 67 31 | 00 2C | 80 7F | D8 69 DE A5 |
UTF-16与 UCS-2的 关系
[编辑]UTF-16
Microsoft Windows操作 系 统内核 对Unicode的 支持
[编辑]Windowswchar_t
wchar_t
wchar_t
// 此源文 件 在 Windows平台 上 必须保存 为Unicode格式 (即 UTF-16小尾 )
// 因 为包含 的 汉字“𪚥”,不能 在 简体中 文 版 Windows默 认的代 码页936(即 GBK)中 表示
// 该汉字 在 UTF-16小尾 序 中 用 4个字节表示
// Windows操作 系 统能正 确显示 这样的 在 UTF-16需用 4字 节表示 的 字 符
// 但 是 Windows API不能 正 确处理 这样的 在 UTF-16需用 4字 节表示 的 字 符 ,把 它判定 为2个UCS-2字 符
#include <windows.h>
#include <stdio.h>
int main()
{
const wchar_t lwc[] = L"𪚥";
MessageBoxW(NULL, lwc, lwc, MB_OK);
int i = wcslen(lwc);
printf("%d\n", i);
int j = lstrlenW(lwc);
printf("%d\n", j);
return 0;
}
Windows 9x
Windows APIwchar_t
类型)
#include <windows.h>
int main() {
char a1[128], a2[128] = { "Hello" };
wchar_t w = L'页';
int n1, n2= 5;
wchar_t w1[128];
int m1 = 0;
n1 = WideCharToMultiByte(CP_UTF8, 0, &w, 1, a1, 128, NULL, NULL);
m1 = MultiByteToWideChar(CP_UTF8, 0, a2, n2, w1, 128);
}
参考 文献
[编辑]- ^ Code in Apache Xalan 2.7.0 which can fail on surrogate pairs. Apache Foundation. [2012-03-23]. (
原始 内容 存 档于2011-04-23).The code wrongly assumes it is safe to use
substring
on the input - ^ Python 2.6 decode of UTF16 does this on Linux, and it correctly handles surrogate pairs. All "CESU" decoders do it too, though they also mistranslate correct surrogate pairs into 2 characters
外部 链接
[编辑]- Unicode Technical Note #12: UTF-16 for Processing (页面
存 档备份,存 于互联网档案 馆) - A very short algorithm for determining the surrogate pair for any codepoint(页面
存 档备份,存 于互联网档案 馆) - Unicode FAQ: What is the difference between UCS-2 and UTF-16? (页面
存 档备份,存 于互联网档案 馆) - Unicode Character Name Index (页面
存 档备份,存 于互联网档案 馆) - RFC 2781: UTF-16, an encoding of ISO 10646
- java.lang.String documentation, discussing surrogate handling (页面
存 档备份,存 于互联网档案 馆)
|