计算机编码概述 报告人:刘汇丹 2011年11月26日
一、目录 ASCII ISO 2022 ISO 8859-1/2/3/4/5/6/7/8/9系列 GB 2312/GBK/GB 18030 ISO 10646 / UNICODE 问题
ASCII
ISO2022 规定编码中可以表示的字符和字符集包括下列四类,其中编码扩充技术操作的对象主要是编码图形字符集和编码控制字符集。 固定编码字符:定义了三个字符及其编码,分别为:ESCAPE(01/11),SPACE(02/00),DELETE(07/15); 编码图形字符集:对图形字符集可容纳字符数上限有四种限制值:94、96、94^n、96^n,其中n>1,表示多字节字符集; 编码控制字符集:最多可容纳32 字符; 编码单独附加控制功能:一般用特定转义序列表示。
字符集编码元素
编码空间
编码空间中的不同区域应该按如下方式使用: CL:用于表示主控制功能集 GL:用于表示94 字符或94^n 字符的图形字符集,加上SPACE、DELETE 两个字符;或者用于表示96 字符或96^n 字符的图形字符集 CR(仅对8 位编码):或用于表示辅控制功能集,或不使用 GR(仅对8 位编码):用于表示94 字符或94^n 字符的图形字符集,或者用于表示96 字符或96^n 字符的图形字符集
ISO 2022 是一个通用的标准,提供的编码扩充技术非常灵活,要实现其全部功能 一方面需要付出很大的代价 另一方面在特定的应用环境中常常是没有必要的 需要对ISO 2022 的功能进行定制以适应环境需求 实际系统中实现的都是各种定制方案 编码元素——编码空间的映射 无论何种基于ISO 2022 的编码方案,都必须在数据处理和交互之前就定制情况达成一致,实际实现中有多种方法就此达成共识 以标准化编码方案固定其定制情况。 ISO 2022 没有限制动态协商和声明的手段,但作为可用手段之一,提供了ACS(Announce Code Structure)转义序列,从而可以用标准自身定义的方法进行定制
ISO 4873(ECMA-43) 确定了控制字符和ASCII字符的位置
ISO 8859-1/2/3/4/5/6/7/8/9系列 ISO/IEC 8859系列 8-bit的ASCII码扩展 0x80~0xFF之间定义了一批拼音文字及符号 .1 Latin alphabet No.1 法、德、意大利、西班牙 ... .2 Latin alphabet No.2 捷克、阿尔巴尼亚、克罗地亚... .3 Latin alphabet No.3 世界语、英语、拉丁语... .4 Latin alphabet No.4 丹麦语、爱沙尼亚语、挪威语... .5 Latin/Cyrillic alphabet 斯拉夫语系、俄语、乌克兰语... .6 Latin/Arabic alphabet 阿拉伯语 .7 Latin/Greek alphabet 希腊语 .8 Latin/Hebrew alphabet 希伯来语 .9 Latin alphabet No.5 …...
ISO 2022 的派生 ISO-2022-CN: EUC-CN: 使用G0、G1、G2,G0 固定指派为ASCII(隐含了C0 的ASCII 控制字符) G1 可以通过转义序列指派为GB 2312-80 或CNS 11643-1992 平面1 G2 可以通过转义序列指派为CNS 11643-1992 平面2 EUC-CN: 仅使用G0、G1,并分别移位到GL、GR G0指派为GB 1988(ASCII) G1指派GB 2312-80 定义的字符集,不使用其他ISO 2022 控制功能
GB 2312/GBK/GB 18030
GB 2312 编码表示 收录字符 收录字符共计7445个 本标准对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示 在八位的环境中,两个字节的最高位都为1 收录字符 一般符号202个,包括标点符号,运算符号等 序号60个,⒈-⒛,㈠-㈩,⑴-⒇,①-⑩ 数字22个,0-9,Ⅰ-Ⅻ 拉丁字母52个,26个大写,26个小写 日文假名169个 希腊字母48个 俄文字母66个 汉语拼音符号26个 汉语注音字母37个 汉字6763个,分成两级。第一级汉字3755个,第二级汉字3008个
GBK 收录字符 码位分配及顺序 GB 2312 中的全部汉字、非汉字符号 GB 13000.1 中的其他 CJK 汉字。以上合计 20902 个 GB 化汉字 13 个汉字结构符 …… 码位分配及顺序 编码范围为 8140-FEFE,首字节在81-FE ,尾字节 40-FE ,剔除 xx7F 一条线 总计 23940 个码位,汉字(含部首和构件)21003 个,图形符号 883 个,共21886 。 全部编码分为三大部分: 汉字区。包括: GB 2312 汉字区。即 GBK/2: B0A1-F7FE。收录 GB 2312 汉字 6763 个,按原顺序排列。 GB 13000.1 扩充汉字区。包括: GBK/3: 8140-A0FE。收录 GB 13000.1 中的 CJK 汉字 6080 个。 GBK/4: AA40-FEA0。收录 CJK 汉字和增补的汉字 8160 个。 图形符号区。包括: GB 2312 非汉字符号区。即 GBK/1: A1A1-A9FE。其中除 GB 2312 的符号外,还有 10 个小写罗马数字和 GB 12345 增补的符号。计符号 717 个。 GB 13000.1 扩充非汉字区。即 GBK/5: A840-A9A0。BIG-5 非汉字符号、结构符和“○”排列在此区。计符号 166 个。 用户自定义区:分为(1)(2)(3)三个小区: AAA1-AFFE,码位 564 个。 F8A1-FEFE,码位 658 个。 A140-A7A0,码位 672 个。限制使用
GB 18030 收录了27484个汉字,总编码空间超过150万个码位 与GB 2312一脉相承 是国家标准,在技术上是GBK的超集,并与其兼容,因此,GBK将结束其历史使命 采用单字节、双字节和四字节三种方式对字符编码 单字节部分使用0x00至0x7F码位(ASCII)。 双字节部分,首字节码位从0x81至0xFE,尾字节码位分别是0x40至0x7E和0x80至0xFE。 四字节部分采用0x30到0x39作为对双字节编码扩充的后缀,其范围为0x81308130到0xFE39FE39 第一、三个字节编码码位均为0x81至0xFE, 第二、四个字节编码码位均为0x30至0x39。
GB 18030
ISO 10646 / UNICODE ISO 10646 Unicode:由企业组成的联盟 1991年开始,共同制订标准 Information Technology--Universal Multiple-Octet Coded Character(UCS) 针对全世界现有的书面文字和符号统一编码 Unicode:由企业组成的联盟 非正式的国际团体Unicode Consortium Unicode原本是Apple公司的一个项目 改进Macintosh 微机处理多语种文本的体系结构 “Unicode标准, 全球字符编码”, 简称为Unicode 1991年开始,共同制订标准 ISO/IEC 10646与Unicode相互对齐
ISO 10646 / UNICODE 正则形式(32-bit) 每个字符表示为一个肆八位序列 组(Group)八位 平面(Plane)八位 行八位(Row) 列八位(Cell) UCS-4,例如:0000 0041 表示字符 A
ISO 10646 / UNICODE 定义了第0(BMP)、1、2、14平面 预留第15、16平面作为私用平面 实际编码空间0到16平面
基本多文种平面(BMP) 蒙古文 1800-18FF 阿拉伯 / 维吾尔文:0600-06FF 藏 文 0F00-0FFF 藏文扩充集A:F300-F8FF
其他平面 01平面:SMP(辅助多文种平面) 02平面:SIP (辅助表意字符平面) 14平面:SSP(辅助特殊用途平面) 拼音文字平面 02平面:SIP (辅助表意字符平面) 收入中日韩越统一编码汉字4万多个(Extension B) 14平面:SSP(辅助特殊用途平面) 控制字符的溢出分配区域,防止BMP平面上的控制字符区域太小无法容纳更多的控制字符 15、16平面是私有专用平面 0F0000-0F1645:藏文扩充集B
UCS-4: UCS-2: UTF-32: UTF-16: UTF-8: 是ISO 10646 中的肆八位正则形式,即每个字符编码固定32 位, 由表示组、平面、行、字位的四个八位位组构成 UCS-2: 是ISO 10646 中的双八位BMP 形式,字符编码固定16 位长,只能表示BMP 内的字符编码,省略了固定为0 的组、平面两个八位位组 UTF-32: 编码范围限于0~10FFFF以保证与UTF-16 的一致性 可以认为UTF-32 等同于UCS-4 UTF-16: 对BMP 内字符使用16 位编码,与UCS-2 相同 对于超出BMP 的16 个平面(第1~16 平面)使用“替代对”(surrogate pair)机制,用两个16 位编码表示一个字符 构成替代对的两个编码单元的范围分别是D800~DBFF和DC00~DFFF,编码空间大小为210×210=220,相当于16个平面。 UTF-8: 以8 位的字节作为编码基本单位,字符编码长度1~6 字节可变, 对于实际使用的前17 个平面而言,字符编码长度1~4 字节 保证了0~7F 范围内字符与ASCII 一致 相对于其他变长字符编码,UTF-8 成功解决了字符边界的界定问题。
UTF-16 UTF-8 Unicode码点 UTF-16编码结果 BMP平面 xxxxxxxx xxxxxxxx 非BMP平面 000uuuuu xxxxxxxx xxxxxxxx 110110ww wwxxxxxx 110111xx xxxxxxxx x、u、w可取0或1,其中wwww=uuuuu-1
字节序BOM(Byte Order Mark) 使用字符(U+FEFF)标识字节序 Java中读取UTF-16编码的文件 若文件有BOM,设置为UTF-16即可 若文件无BOM,最好明确设置UTF-16LE还是UTF-16BE UTF-16LE用的比较多
记事本的编码 ANSI :中文版系统中相当于 GB2312/GBK Unicode : UTF-16LE Unicode Big Endian : UTF-16BE UTF-8
Linux command hexdump –C –n 100 file.txt iconv –f utf16 –t utf8 file-utf16.txt > file-utf8.txt
问题? Unicode字符(U+FEFF)的UTF-8编码是什么? Other Questions ?