Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
Unicode 编码系统,可分为编码方式和实现方式两个层次。Unicode用数字0-0x10FFFF (( {注意,这并不表示最多用三个字节就可以表示unicode字符集,因为字符的唯一数字映射到内存中的编码方案(如UTF-8, UTF-16, UTF-32)会使用可能多于三个字节来对应该唯一数字} )) 来映射世界上所有文字和符号的字符,最多可以容纳1114112个字符,或者说有1114112个码位。码位就是可以分配给字符的数字。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。
Unicode 为编码系统, 它的功能是将所有的字符映射到一个唯一的数字上(0-0x10FFFF中), 它的实现方式即如何将 这些数字用内存中的字节表示出来则为 UTF-8, UTF-16, UTF-32等编码方案。
例如在Unicode中:汉字“字”对应的数字是23383(十进制),十六进制表示为5B57。在Unicode中,我们有很多方式将数字23383表示成程序中的数据,包括:UTF-8、UTF-16、UTF-32。UTF是“UCS Transformation Format”的缩写,可以翻译成Unicode字符集转换格式,即怎样将Unicode定义的数字转换成程序数据。例如,“汉字”对应的数字是0x6c49和0x5b57,而编码的程序数据是:
1
2
3
|
char
data_utf8[] = {0xE6, 0xB1, 0x89, 0xE5, 0xAD, 0x97};
// UTF-8编码
char16_t
data_utf16[] = {0x6C49, 0x5B57};
// UTF-16编码
char32_t
data_utf32[] = {0x00006C49, 0x00005B57};
// UTF-32编码
|
这里用char、char16_t、char32_t分别表示无符号8位整数,无符号16位整数和无符号32位整数。
UTF-8、UTF-16、UTF-32分别以char、char16_t、char32_t作为编码单位。(注: char16_t 和 char32_t 是 C++ 11 标准新增的关键字。如果你的编译器不支持 C++ 11 标准,请改用 unsigned short 和 unsigned long。)“汉字”的UTF-8编码需要6个字节。“汉字”的UTF-16编码需要两个char16_t,大小是4个字节。“汉字”的UTF-32编码需要两个char32_t,大小是8个字节。根据字节序的不同,UTF-16可以被实现为UTF-16LE或UTF-16BE,UTF-32可以被实现为UTF-32LE或UTF-32BE。
UTF-8
Unicode编码(十六进制)
|
UTF-8 字节流(二进制)
|
000000 - 00007F
|
0xxxxxxx
|
000080 - 0007FF
|
110xxxxx 10xxxxxx
|
000800 - 00FFFF
|
1110xxxx 10xxxxxx 10xxxxxx
|
010000 - 10FFFF
|
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
|
UTF-16
.............................................
UTF-32
字节序 字节序有两种,分别是“大端”(Big Endian, BE)和“小端”(Little Endian, LE)。
Unicode编码
|
UTF-16LE
|
UTF-16BE
|
UTF32-LE
|
UTF32-BE
|
0x006C49
|
49 6C
|
6C 49
|
49 6C 00 00
|
00 00 6C 49
|
0x020C30
|
43 D8 30 DC
|
D8 43 DC 30
|
30 0C 02 00
|
00 02 0C 30
|
UTF编码
|
Byte Order Mark (BOM)
|
UTF-8 without BOM | 无 |
UTF-8 with BOM
|
EF BB BF
|
UTF-16LE
|
FF FE
|
UTF-16BE
|
FE FF
|
UTF-32LE
|
FF FE 00 00
|
UTF-32BE
|
00 00 FE FF
|