- Unicode(统一码、万国码、单一码)是计算机科学领域的一项业界标准,包括字符集、编码方式等。Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理,但要表示中文,一个字节是不够的,为了统一所有文字的编码,Unicode应运而生。Unicode把所有语言都统一到一套编码里,就不会再有乱码问题了。 - 在Unicode中,我们有很多方式将数字表示成程序中的数据,包括:UTF-8、UTF-16、UTF、-32。UTF是“Unicode Transformation Format”法缩写,可以翻译成Unicode字符集转换格式,即怎样将Unicode定义的数字转换成程序数据。
- UTF-8以字节为单位对Unicode进行编码。从Unicode到UTF-8的编码方式如下:
Unicode编码(十六进制) | UTF-8字节流(二进制) |
---|
000000-00007F | 0xxxxxxx |
000080-0007FF | 110xxxxx 10xxxxxx |
000800-00FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
010000-10FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
UTF-8的特点是对不同范围的字符使用不同长度的编码。对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。UTF-8编码的最大长度是4个字节。从上表可以看出,4字节模板有21个x,即可以容纳21位二进制数字。Unicode的最大码位0x10FFFF也只有21位。
- UTF-16编码以16位无符号整数为单位。
在基本多语言平面内的码位UTF-16编码使用1个码元且其值与Unicode是相等的(不需要转换)。举例如下:
Unicode | 字符 | UTF-16(码元) | UTF-16 LE(字节) | UTF-16 BE(字节) |
---|
U+0041 | A | 0x0041 | 0x41 0x00 | 0x00 0x41 |
U+7834 | 破 | 0x7834 | 0x34 0x78 | 0x78 0x34 |
U+6653 | 晓 | 0x6653 | 0x53 0x66 | 0x66 0x53 |
- UTF-32是一种定长编码,使用1个32bit的码元,其值与Unicode编码值相等。举例如下:
Unicode | 字符 | UTF-32(码元) | UTF-32 LE(字节) | UTF-32 BE(字节) |
---|
U+0041 | A | 0x00000041 | 0x41 0x00 0x00 0x00 | 0x00 0x00 0x00 0x41 |
U+7834 | 破 | 0x00007834 | 0x34 0x78 0x00 0x00 | 0x00 0x00 0x78 0x34 |
U+6653 | 晓 | 0x00006653 | 0x53 0x66 0x00 0x00 | 0x00 0x00 0x66 0x53 |
U+2A6A5 | ?(四个龍) | 0x0002A6A5 | 0xA5 0xA6 0x02 0x00 | 0x00 0x02 0xA6 0xA5 |