当前位置:首页 >> 信息与通信 >>

嵌入式字符编码(经典)(ucs2,+unicode,+utf8,+gb2312)


字符编码

版本
V0.1 V1.0 V1.1 V1.2 V1.3 V1.4

修订日期
2008-12-1 2008-12-11 2008-12-13 2008-12-14 2008-12-18 2008-12-23

修订内容
初始化 第一版 First reported 添加 ASCII 码表 添加 code page 添加 BOM

修订人

1

1 ASCII
American Standard Code for Information Interchange,美国标准信息交换码。因为计算机 只能表示和存储二进制的数据, 所以需要对常用的 52 个字母, 阿拉伯数字等字符进行编码, 为了便于信息交换,需要一个统一的标准,于是 American National Standard Institute(ANSI) 制定了这个 ASCII 码, 并于 1967 年成为美国国家标准, 后被 ISO(International Standardization Organization)国际标准化组织定为国际标准 ISO646。 ASCII 属于单字节编码,即使用一个字节(8 bytes)进行编码,因此最多只能表示 256 个 字符。基础的 ASCII 使用 7bits 编码,最高位位为 0,或者用于奇偶校验。ASCII 编码适用 于所有的拉丁字母。 0x00 – 0x1F:为控制字符 ASCII 编码可以满足美国的拉丁字母需求,但是不能满足其他语种的需求,例如中日韩的象 形文字,所以导致下面编码的出现。 具体定义如下:

十六进制 字符
0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F NULL SOH STX ETX EOT ENQ ACK BELL BS TAB LF VT CR SO SI

意义
空字符 Start of head Start of text End of text End of Transmission Enquiry Acknowledge 铃声 Backspace Horizontal tab Line Feed Vertical tab Carriage return Shift out Shift in

十六进制 字符 意义
0x10 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1A 0x1B 0x1C 0x1D 0x1E 0x1F

2

2 UCS
国际标准 ISO 10646 定义了通用字符集 (Universal Character Set, UCS)。 UCS 是所有其他字符集标准的一个超集。它保证与其他字符集是双向兼容的,就 是说,如果你将任何文本字符串翻译到 UCS 格式,然后再翻译回原编码,你不会 丢失任何信息。 UCS 包含了用于表达所有已知语言的字符,不仅包括拉丁语,希腊语,斯拉 夫语,希伯来语,阿拉伯语,亚美尼亚语和乔治亚语的描述,还包括中文,日文 和韩文这样的象形文字,以及平假名,片假名,孟加拉语,旁遮普语,果鲁穆奇 字符(Gurmukhi),泰米尔语,印.埃纳德语(Kannada),Malayalam,泰国语,老 挝语,汉语拼音(Bopomofo),Hangul,Devangari,Gujarati,Oriya, Telugu 以 及其他数也数不清的语。 对于还没有加入的语言, 由于正在研究怎样在计算机中 最好地编码它们, 因而最终它们都将被加入。这些语言包括 Tibetian, 高棉语, Runic(古代北欧文字), 埃塞俄比亚语, 其他象形文字, 以及各种各样的印-欧 语系的语言, 还包括挑选出来的艺术语言比如 Tengwar, Cirth 和克林贡语 (Klingon). UCS 还包括大量的图形的, 印刷用的, 数学用的和科学用的符号, 包括所有由 TeX, Postscript, MS-DOS,MS-Windows, Macintosh, OCR 字体, 以 及许多其他字处理和出版系统提供的字符。 ISO 10646 定义了一个 31 位的字符集。然而, 在这巨大的编码空间中, 迄 今为止,只分配了前 65534 个码位 (0x0000 到 0xFFFD)。这个 UCS 的 16 位 子集称为基本多语言面 (Basic Multilingual Plane, BMP)。将被编码在 16 位 BMP 以外的字符都属于非常特殊的字符(比如象形文字), 且只有专家在历史和 科学领域里才会用到它们。 按当前的计划, 将来也许再也不会有字符被分配到从 0x000000 到 0x10FFFF 这个覆盖了超过 100 万个潜在的未来字符的 21 位的 编码空间以外去了。ISO 10646-1 标准第一次发表于 1993 年, 定义了字符集与 BMP 中内容的架构。定义 BMP 以外的字符编码的第二部分 ISO 10646-2 正在准 备中, 但也许要过好几年才能完成。新的字符仍源源不断地加入到 BMP 中, 但 已经存在的字符是稳定的且不会再改变了。 UCS 不仅给每个字符分配一个代码,而且赋予了一个正式的名字,表示一个 UCS 或 Unicode 值的十六进制数, 通常在前面加上 "U+", 就象 U+0041 代表 字符"拉丁大写字母 A". UCS 字符 U+0000 到 U+007F 与 US-ASCII(ISO 646) 是 一 致 的 , U+0000 到 U+00FF 与 ISO 8859-1(Latin-1) 也 是 一 致 的 . 从 U+E000 到 U+F8FF, 已经 BMP 以外的大范围的编码是为私用保留的。 UCS 只是规定如何编码,并没有规定如何传输、保存这个编码。例如“汉” 字的 UCS 编码是 6C49,我可以用 4 个 ASCII 数字来传输、保存这个编码;也可 以用 UTF-8 编码:3 个连续的字节 E6 B1 89 来表示它。关键在于通信双方都要 认可。UTF-8、UTF-7、UTF-16 都是被广泛接受的方案。UTF-8 的一个特别的好处 是它与 ISO- 8859-1 完全兼容。UTF 是“UCS Transformation Format”的缩写。

3

3 UTF8
UTF8 并不算是一种电脑编码,而是一种储存和传送的格式,如前所述,每 个 Unicode/UCS 字符都以 2 或 4 个 bytes 来储存,看看以下的比较: 以"I am Chinese"为例 用 ANSI 储存: 12 Bytes 用 Unicode/UCS2 储存: 24 Bytes + 2 Bytes(header) 用 UCS4 储存: 48 Bytes + 4 Bytes(header) 以"我是中国人"为例 用 ANSI 储存: 10 Bytes(GB2312) 用 Unicode/UCS2 储存: 10 Bytes + 2 Bytes(header) 用 UCS4 储存: 20 Bytes + 4 Bytes(header) 由此可见直接以 Unicode/UCS 的原始形式来储存是一种极大的浪费, 而且也 不利于互联网的传输(中文稍为合算一点^_^)。 有见及此,Unicode/UCS 的压缩形式--UTF8 出 现了,套用官方网站的首 句话『UTF-8 stands for Unicode Transformation Format-8. It is an octet (8-bit) lossless encoding of Unicode characters.』,由于 UTF 也适用于编 码 UCS,故亦可称为『UCS transformation formats (UTF)』 UTF8 是以 8bits 即 1Bytes 为编码的最基本单位, 当然也可以有基于 16bits 和 32bits 的形式,分别称为 UTF16 和 UTF32,但目前用得不多,而 UTF8 则被广 泛应用在文件储存和网络传输中。 编码原理 先看这个模板: UCS-4 range (hex.) 0000 0000-0000 007F 0000 0080-0000 07FF 0000 0800-0000 FFFF 0001 0000-001F FFFF 0020 0000-03FF FFFF 0400 0000-7FFF FFFF

-------

UTF-8 octet sequence (binary) 0xxxxxxx 110xxxxx 10xxxxxx 1110xxxx 10xxxxxx 10xxxxxx 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 1111110x 10xxxxxx ... 10xxxxxx

编码步骤: 1) 首先确定需要多少个 8bits(octets) 2) 按照上述模板填充每个 octets 的高位 bits 3) 把字符的 bits 填充至 x 中,字符顺序:低位→高位,UTF8 顺序:最后一个 octet 的最末位 x→第一个 octet 最高位 x 不知大家看懂了没有,其实不懂也无所谓,反正又不用自己算,程式可以完 全代劳。以 UTF8 格式储存的文件档首标识为 EF BB BF。 效率
4

从上述编码原理中得出的结论是: 1.每个英文字母、数字所占的空间为 1 Byte; 2.泛欧语系、斯拉夫语字母占 2 Bytes; 3.汉字占 3 Bytes。 由此可见 UTF8 对英文来说是个非常诱人的方案, 但对中文来说则不太合算, 无论用 ANSI 还是 Unicode/UCS2 来编码都只用 2 Bytes,但用 UTF8 则需要 3 Bytes。 以下是一些统计资料,显示用 UTF8 来储存文件每个字符所需的平均字节: 1.拉丁语系平均用 1.1 Bytes; 2.希腊文、俄文、阿拉伯文和希伯莱文平均用 1.7 Bytes; 3.其他大部份文字如中文、日文、韩文、Hindi(北印度语)用约 3 Bytes; 4.用超过 4 Bytes 的都是些非常少用的文字符号。

5

4 中文编码
4.1 GB2312

GB2312 码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用 汉字编码字符集——基本集》,由国家标准总局发布,1981 年 5 月 1 日实施, 通行于大陆。新加坡等地也使用此编码。 在国标 GD2312 —80 中规定,所有的国标汉字及符号分配在一个 94 行、94 列的方阵中,方阵的每一行称为一个“区”,编号为 01 区到 94 区,每一列称为 一个“位”,编号 为 01 位到 94 位,方阵中的每一个汉字和符号所在的区号和 位号组合在一起形成的四个阿拉伯数字就是它们的“区位码”。 区位码的前两位 是它的区号,后两位是它的位号(使用 Big Edian 编码,高字节在前)。用区位码 就可以唯一地确定一个汉字或符号,反过来说,任何一个汉字或符号也都对应着 一个唯一的区位码。例如:汉字“母”字的区位码是 3624,表明它在方阵的 36 区 24 位,问号“?”的区位码为 0331,则它在 03 区 3l 位。在这 94*94 的区位 中,其中: 01-09 区为符号、数字区 10-15 区空白区 16-87 区为汉字区 88-94 区空白区 在汉字区分为两级:第 一级是常用汉字计 3755 个,置于 16-55 区,按汉语 拼音字母/笔形顺序排列;第二级汉字是次常用汉字计 3008 个,置于 56-87 区, 按部首/笔画顺 序排列。故而 GB2312 最多能表示 6763 个汉字。 汉字的区码和位码取值都在 01~94 之间, 如果直接使用区位码作为机器内码 的话,就会与 ASCII 码混淆。为了避免这个冲突,需要避开基本 ASCII 码中的控 制码 (00H~1FH),还需与基本 ASCII 码中的字符相区别。为了实现这两点,可以 先在区码和位码分别加上 20H, 在此基础上再加 80H(此处“H”表示 前两位数字 为十六进制数)。 经过这些处理, 用机内码表示一个汉字需要占两个字节, 分别 称 为高位字节和低位字节,这两位字节的机内码按如下规则表示: 高位字节 = 区码 + 20H + 80H(或区码 + A0H) 低位字节 = 位码 + 20H + 80H(或位码 + AOH) 由于汉字的区码与位码的取值范围的十六进制数均为 01H~5EH(即十进制的 01~94),所以汉字的高位字节与低位字节的取值范围则为 A1H~FEH(即十进制的 161~254)。 例如,汉字“啊”的区位码为 1601,区码和位码分别用十六进制表示即为 1001H,它的机内码的高位字节为 B0H,低位字节为 A1H,机内码就是 B0A1H。

6

4.2

GBK

GB2312 只收录了 6763 个汉字,因此许多以前很少使用的生僻字没有收录, 现在这些字也许变得流行了,例如:朱镕 基的“镕”字,未收入 GB2312-80, 现在大陆的报业出刊只得使用(金+容)、(金容)、(左金右容)等来表示, 形式不一而同,这使得表示、存储、输 入、处理都非常不方便。 GBK: 汉字国标扩展码,基本上采用了原来 GB2312-80 所有的汉字及码位,并 涵盖了原 Unicode 中所有的汉字 20902,总共收录了 883 个符号, 21003 个汉字 及提供了 1894 个造字码位。 Microsoft 简体版中文 Windows 95 就是以 GBK 为 内码,又由于 GBK 同时也涵盖了 Unicode 所有 CJK 汉字,所以也可以和 Unicode 做一一对应。 P- Windows3.2 和苹果 OS 就是以 GB2312 为基本汉字编码, Windows 95/98 则以 GBK 为基本汉字编码、但兼容支持 GB2312。 GBK 编码是中国大陆制订的、 等同于 UCS 的新的中文编码扩展国家标准。 GBK 工作小组于 1995 年 10 月,同年 12 月完成 GBK 规范。该编码标准兼容 GB2312, 共收录汉字 21003 个、符号 883 个,并提供 1894 个造字码位,简、繁体字融于 一库。 总体编码范围为 8140-FEFE 之间,首字节在 81-FE 之间,尾字节在 40-FE 之间,剔除 XX7F 一条线。 GBK 共收入 21886 个汉字和图形符号,包括: * GB2312 中的全部汉字、非汉字符号。 * BIG5 中的全部汉字。 * 与 ISO 10646 相应的国家标准 GB13000 中的其它 CJK 汉字, 以上合计 20902 个汉字。 * 其它汉字、部首、符号,共计 984 个。 GBK 编码区分三部分: 1. 汉字区 包括 GBK/2:OXBOA1-F7FE, 收录 GB2312 汉字 6763 个,按原序排列; GBK/3:OX8140-AOFE,收录 CJK 汉字 6080 个; GBK/4:OXAA40-FEAO,收录 CJK 汉字和增补的汉字 8160 个。 2. 图形符号区 包括 GBK/1:OXA1A1-A9FE,除 GB2312 的符号外,还增补了其它符号 GBK/5:OXA840-A9AO,扩除非汉字区。 3. 用户自定义区 即 GBK 区域中的空白区,用户可以自己定义字符。 GBK 码对字库中偏移量的计算公式为: [(GBKH-0xB0)*0x5E+(GBKL-0xA1)]*(汉字离散后每个汉字点阵所占用的字 节)

7

4.3

GB18030

GB18030 是最新的汉字编码字符集国家标准, 向下兼容 GBK 和 GB2312 标准。 GB18030 编码是一二四字节变长编码。一字节部分从 0x0~0x7F 与 ASCII 编码兼容。 二 字节部分, 首字节从 0x81~0xFE, 尾字节从 0x40~0x7E 以及 0x80~0xFE, 与 GBK 标 准 基本兼容。 四字节部分, 第一字节从 0x81~0xFE, 第二字节从 0x30~0x39, 第三和第四字节 的范围和前两个字节分别相同。 四字节部分覆盖了从 0x0080 开始, 除去二字节部分已经 覆盖的所有 Unicode 3.1 码位。也就是说, GB18030 编码在码位空间上做到了与 Unicode 标准一一对应,这一点与 UTF-8 编码类似。

4.4

Big 5

BIG5 是通行于台湾、香港地区的一个繁体字编码方案。虽然存在一些瑕疵, 但广泛应用于电脑行业,尤其是互联网中,从而成为一种事实上的行业标准。 1983 年 10 月, 台湾国家科学委员会、 教育部国语推行委员会、 中央标准局、 行政院共同制定了《通用汉字标准交换码》,后经修订于 1992 年 5 月公布,更 名为《中文标准交换码》,BIG5 是台湾资讯工业策进会根据以上标准制定的编 码方案。 BIG5 码是双字节编码方案,其中第一个字节的值在 OxAO-OxFE 之间,第二 个字节在 Ox40-Ox7E 和 OxA1-OxFE 之间。 BIG5 收录 13461 个汉字和符号,包括: * 符号 408 个,编码位置 A140-A3BE * 常用字 5401 个,编码位置 A440-C67E,包括台湾教育部颁布的《常用国 字标准字体表》的全部汉字 4808 个,台湾教科书常用字 587 个,异体字 6 个。 * 次常用字 7652 个,编码位置 C940-F9D5,包括台湾教育部颁布的《次常用 国字标准字体表》的全部汉字 6341 个,《罕用国字标准字体表》中使用频率较 高的字 1311 个。

5 细节
1. 在双字节编码中,GB 内码的存储格式始终是 big endian,即高位在前。 2. GB2312 的 两个字节的最高位都是 1。但符合这个条件的码位只有 128 * 128=16384 个。所以 GBK 和 GB18030 的低字节最高位都可能不是 1。不过这 不影响 DBCS 字符流的解析:在读取 DBCS 字符流时,只要遇到高位为 1 的字 节,就可以将下两个字节作为一个双字节编码,而不用管低字节的高位是什 么。 3. 从 ASCII、GB2312、GBK 到 GB18030 的编码方法是向下兼容

8

6 BOM
所谓的 BOM 是指字节序标志 (Byte Order Mark) 是为了区分 big 还是 little , 字节序的,在 UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它 的编码是 FFFE。而 FFFE 在 UCS 中是不存在的字符,所以不应该出现在实际传输 中。UCS 规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。这样如果接收者收到 FEFF,就表明这个字节流是 Big-Endian 的;如果 收到 FFFE,就表明这个字节流是 Little-Endian 的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作 BOM。 UTF-8 不需要 BOM 来表明字节顺序, 但可以用 BOM 来表明编码方式。 字符"ZERO WIDTH NO-BREAK SPACE"的 UTF-8 编码是 EF BB BF。所以如果接收者收到以 EF BB BF 开头的字节流,就知道这是 UTF-8 编码了。 Windows 就是使用 BOM 来标记文本文件的编码方式的。

9


相关文章:
UTF-8 GBK UTF8 GB2312 之间的区别
UTF-8 GBK UTF8 GB2312 之间的区别 UTF-8:Unicode TransformationFormat-8bit,允许含 BOM,但通常不含 BOM。是用以 解决国际上字符的一种多字节编码,它对英文...
字符编码
字符编码_计算机软件及应用_IT/计算机_专业资料。ASCII、ANSI、UTF-8unicodeGB2312、GBK、GB18030、字符编码原理、中文乱码原因 ...
Unicode字符集(简称为UCS)
Unicode big endian 和 UTF-8 编码的 txt 文件的...以及由此派生并兼容的字符集, 如: GB2312, 正式的...现在的 PC 平台必须支持 GB18030,对嵌入式 产品暂...
C#将字符转换成utf8编码 GB321编码转换
C#将字符转换成 utf8 编码 GB321 编码转换 public static { string get_uft8(string unicodeString) UTF8Encoding utf8 = new UTF8Encoding(); Byte[] ...
字符编码之间的相互转换
字符编码之间的相互转换 UTF8 与 GBK C++ UTF8 编码转换 CChineseCode 一 ...了字符和字符集之间的关系,字符组成字符集 (iso8859-1,GB2312/GBK,unicode) ...
字符编码简介:ASCII,Unicode,UTF-8,GB2312
字符编码简介: 字符编码简介:ASCII,Unicode,UTF-8,GB2312 ,,, 字符编码简介:ASCII,Unicode,UTF-8,GB2312 1. ASCII 码 我们知道,在计算机内部,所有的信息最终...
GB2312、GBK与UTF-8的区别
GB2312、GBK 与 UTF-8的区别这是一个异常经典的...UTF-8编码 的文字可以在各国支持 UTF8字符集的浏览...GBK、GB2312等与 UTF8之间都必须通过 Unicode 编码...
关于编码ANSI、GB2312、Unicode与UTF-8的区别
关于编码ANSI、GB2312、Unicode与UTF-8的区别_电脑基础知识_IT/计算机_专业资料...字符编码(ucs2,+unicode... 9页 免费 各种字符编码方式详解及... 4页 免费...
txt文档各种编码历史与说明
txt文档各种编码历史与说明_电脑基础知识_IT/计算机_专业资料。文档编码 各种编码 UNICODEUTF-8、ANSI、ASCII、GB2312、 GBK 详解一、编码历史与区别 一直对字符...
oracle 字符集的区别
字符编码 1.Gbk,GB2312,GB18030 字符必须编码后...GB 18030 是中国所有非手持/嵌入式计算机系统的强制...位编码, 相当于 UCS-4 的子集 UTF-8:Unicode ...
更多相关标签: