最近在弄的一个东西,由于一开始就没有规范好字符编码,结果遇到不少的困扰。《Windows核心编程》第一章就是讲字符编码,可见这东西的重要。于是痛定思痛,决定用UTF-8统一所有内部编码。重温了一些知识,整理出来备忘。
1,简介
Unicode学名"Universal Multiple-Octet Coded Character Set",简称UCS,是一套由国际组织维护的字符编码。UCS为现存的每一个字符都赋予一个唯一码值(code point),通常表示为U+xxxx,其中xxxx为对应的16进制码值
UCS有两种格式:UCS-2 和 UCS-4。UCS-2为2字节编码,范围从U+0000~U+FFFF;UCS-4为4字节编码,范围从 U+00000000~U+7FFFFFFFF。目前Unicode4.0标准中,U+0000~U+FFFF区间已经包含了世界上所有语言的常用文字,简称BMP(Basic Multilingual Plane),加上其它的特殊符号扩展,最高也只用到了U+0010FFFF
2,UTF编码
UCS字符在计算机中的表示方式常用的有UTF-8,UTF-16,UTF-32。UTF-32用32位来表示单个UCS字符,跟UCS-4的码值一一对应。UTF-16以16位为单元来编码UCS字符,U+0000~U+FFFF范围内用单个16位值来表示,跟UCS-2一一对应,而 U+10000~U+10FFFF范围内的字符则需要用2个连续的16位值来表示;UTF-8以8位为单元进行编码,跟UTF-16类似,需要用到1~6 个连续的8位值来表示单个UCS字符(实际上由于目前UCS最高只用到了U+10FFFF,所以UTF-8编码的单个字符的长度不会超过4Byte)。具体算法如下表所示
UCS-4到UTF-16的转换表:
U+00000000~U+0000FFFF
xxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxx
U+00010000~U+0010FFFF
000uuuuuxxxxxxxxxxxxxxxx 110110wwwwxxxxxx 110111xxxxxxxxxx
注1:wwww=uuuuu-1
注2:U+DB00(1101100000000000)~U+DBFF(110110FFFFFFFFFF)称为High Surrogate,U+DC00(1101110000000000)~U+DFFF(110111FFFFFFFFFF)称为Low Surrogate。Surrogate区间只用于UTF-16中表示BMP之外的字符。BMP中除Surrogate之外的也被称为 character's scalar value
UCS-4到UTF-8的转换表:
U+00000000~U+0000007F
0xxxxxxx
U+00000080~U+000007FF
110xxxxx 10xxxxxx
U+00000800~U+0000FFFF