字符处理基础知识

字符处理基础知识

首先,我们来明确一些概念:

字符: 它是抽象的最小文本单位。字符就是对某种意义的图画表示,或者说形状表示。 “ A” 是一个字符, “¥” 也是一个字符。

字符集: 字符的集合。比如汉字字符集,拉丁字符集,全人类所有的字符的集合。

编码字符集: 也就是一个字符集的编码形式,它为每一个字符分配一个唯一数字。

代码点: 就是在编码字符集中为字符分配的那个数字,在 Java 中称为 codepoint

字符编码方案: 是从一个或多个编码字符集到一个或多个固定宽度代码单元序列的映射。最常用的代码单元是字节,但是 16 位或 32 位整数也可用于内部处理。 UTF-32 UTF-16 UTF-8 Unicode 标准的编码字符集的字符编码方案, GB2312 GBK GB18030 Big5 是中文编码字符集的字符编码方案, Latin (拉丁语的意思)是西方字符集的编码方案,还有 ASCII 这个是美国的,我想每个人都不默生。

ASCII

ASCII 码是 7 位编码,编码范围是 0x00-0x7F ASCII 字符集包括英文字母、阿拉伯数字和标点符号等字符。其中 0x00-0x20 0x7F 33 个控制字符。

只支持 ASCII 码的系统会忽略每个字节的最高位,只认为低 7 位是有效位。 HZ 字符编码就是早期为了在只支持 7 ASCII 系统中传输中文而设计的编码。早期很多邮件系统也只支持 ASCII 编码,为了传输中文邮件必须使用 BASE64 或者其他编码方式。

ISO 8859-1 Latin-1

正式编号为 ISO/IEC 8859-1:1998 ,又称 Latin-1 或“西欧语言”,是国际标准化组织 ISO/IEC8859 的第一个 8 位字符集。它以 ASCII 为基础,在空置的 0xA0-0xFF 的范围内,加入 96 个字母及符号,藉以供使用附加符号拉丁字母 语言使用。曾推出过 ISO 8859-1:1987 版。

此字符集支援部分于欧洲 使用的语言,包括阿尔巴尼亚语巴斯克语布列塔尼语加泰罗尼亚语丹麦语荷兰语法罗语弗里西语加利西亚语德语格陵兰语冰岛语爱尔兰盖尔语意大利语拉丁语卢森堡语挪威语葡萄牙语里托罗曼斯语苏格兰盖尔语西班牙语瑞典语

英语 虽然没有重音字母,但仍会标明为 ISO/IEC8859-1 编码。除此之外,欧洲以外的部分语言,如南非荷兰语斯瓦希里语印尼语马来语 、菲律宾他加洛语 等也可使用 ISO/IEC8859-1 编码。

法语 及芬兰语本来也使用 ISO/IEC8859-1 来表示。但因它没有法语使用的 œ Œ Ÿ 三个字母及芬兰语使用的 Š š Ž ž ,故于 1998 年被 ISO/IEC8859-15 所取代。( ISO8859-15 同时加入了欧元 符号)

ISO 8859-15 Latin-0

正式编号为 ISO/IEC 8859-15:1999 ,又称 Latin-9 ,俗称 Latin-0 ,是国际标准化组织 ISO/IEC8859 的其中一个 8 位字符集。

这个字符集于 1998 年制定,藉以加入在 ISO/IEC8859-1 字符集缺少的法语 Œ œ 字母和 Ÿ 字母,及芬兰语 Š š , Ž ž 字母。同时,它亦把 ¤ (通用货币 符号)换成 €(欧元 符号)。

GB2312

GB2312 编码通行于中国大陆;新加坡等地也采用此编码。中国大陆几乎所有的中文系统和国际化的软件都支持 GB 2312

GB 2312 标准共收录 6763 个汉字,其中一级汉字 3755 个,二级汉字 3008 个;同时, GB 2312 收录了包括 拉丁字母 、希腊字母、 日文 平假名及 片假名 字母、俄语 西里尔字母 在内的 682 个全角字符。

GB 2312 的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆 99.75% 的使用频率。

对于 人名 、古汉语等方面出现的罕用字, GB 2312 不能处理,这导致了后来 GBK GB 18030 汉字字符集的出现

GB 2312 中对所收汉字进行了“ 分区 处理,每区含有 94 个汉字/符号。这种表示方式也称为 区位码, 相当于编码字符集

· 01-09 区为特殊符号。

· 16-55 区为一级汉字,按拼音排序。

· 56-87 区为二级汉字,按部首/笔画排序。

10-15 区及 88-94 区则未有编码。

举例来说,“啊”字是 GB2312 之中的第一个汉字,它的区位码就是 1601

字节结构

在使用 GB2312 的程序中,通常采用 EUC 储存方法,以便兼容于 ASCII 浏览器 编码表上的“ GB2312 ,通常都是指“ EUC-CN 表示法。

每个汉字及符号以两个 字节 来表示。第一个字节称为“高位字节”,第二个字节称为“低位字节”。

高位字节”使用了 0xA1-0xF7 (把 01-87 区的区号加上 0xA0 ),“低位字节”使用了 0xA1-0xFE (把 01-94 加上 0xA0 )。由于一级汉字从 16 区起始,汉字区的“高位字节”的范围是 0xB0-0xF7 ,“低位字节”的范围是 0xA1-0xFE ,占用的码位是 72*94=6768 。其中有 5 个空位是 D7FA-D7FE

例如“啊”字在大多数程序中,会以两个字节, 0xB0 (第一个字节) 0xA1 (第二个字节)储存。(与区位码对比: 0xB0=0xA0+16,0xA1=0xA0+1 )。

EUC-CN (网上下到的编码表就是这个)( gb2312 的字符串截取也是按照该表截取的)

EUC-CN GB 2312 最常用的表示方法。 浏览器 编码表上的“ GB2312lang="EN-US"” ,通常都是指“ EUC-CN 表示法。

GB 2312 字符使用两个字节来表示。

第一位字节”使用 0xA1-0xF7

第二位字节”使用 0xA1-0xFE

举例来说,“啊”字是 GB 2312 之中的第一个汉字,它的区位码是 1601

EUC-CN 之中,它把 0xA0+16=0xB0,0xA0+1=0xA1 ,得出 0xB0A1

GBK

GBK 向下与 GB2312 完全兼容,向上支持 ISO 10646 国际标准,在前者向后者过渡过程中起到的承上启下的作用。

字节结构

GBK 亦采用双字节表示,总体编码范围为 8140-FEFE 之间,

首字节在 81-FE 之间,

尾字节在 40-FE 之间(不包括 7F ,相对 GB2312 有扩充)。

GBK 共收入 21886 个汉字和图形符号,包括:

* GB2312 中的全部汉字、非汉字符号。

* BIG5 中的全部汉字。

* ISO 10646 相应的国家标准 GB13000 中的其它 CJK 汉字,以上合计 20902 个汉字。

* 其它汉字、部首、符号,共计 984 个。

微软公司自 Windows 95 简体中文版开始支持 GBK 代码,但目前的多数搜索引擎都不能很好地支持 GBK 汉字。

GBK 编码区分三部分:

* 汉字区,包括:

GBK/2 OXBOA1-F7FE, 收录 GB2312 汉字 6763 个,按原序排列;

GBK/3 OX8140-AOFE ,收录 CJK 汉字 6080 个;

GBK/4 OXAA40-FEAO ,收录 CJK 汉字和增补的汉字 8160 个。

* 图形符号区,包括:

GBK/1 OXA1A1-A9FE ,除 GB2312 的符号外,还增补了其它符号

GBK/5 OXA840-A9AO ,扩除非汉字区。

* 用户自定义区:即 GBK 区域中的空白区,用户可以自己定义字符。

另外在 Windows 系统操作系统上默认使用的就是 GBK 编码, GBK 是事实上的中文件编码方案标准。

GB18030

GB 2312-1980 完全兼容,与 GBK 基本兼容,支持 GB 13000 Unicode 的全部统一汉字,共收录汉字 70244 个。

GB 18030 主要有以下特点:

· 采用多字节编码,每个字可以由 1 个、 2 个或 4 个字节组成。(变长编码)

· 编码空间庞大,最多可定义 161 万个字符。

· 支持中国国内 少数民族 的文字,不需要动用造字区。

字节结构

· 单字节,其值从 0 0x7F

· 双字节,第一个字节的值从 0x81 0xFE ,第二个字节的值从 0x40 0xFE (不包括 0x7F ,与 GBK 一致)。

· 四字节,第一个字节的值从 0x81 0xFE ,第二个字节的值从 0x30 0x39 ,第三个字节从 0x81 0xFE ,第四个字节从 0x30 0x39

四字节部分覆盖了从 0x0080 开始 , 除去二字节部分已经覆盖的所有 Unicode 3.1 码位。也就是说 , GB18030 编码在码位空间上做到了与 Unicode 标准一一对应 , 这一点与 UTF-8 编码类似。

目前最新的 glibc 2.2.x 系列已经全面支持了 GB18030 Locale GB18030 UCS-4 之间的编码转换 , 也就是说在系统层上 Linux 已经可以支持 GB18030 标准了。 下面问题的关键就是怎样让 XFree86 窗口系统也支持 GB18030 标准。

BIG5

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 个。

上面说的都是按语言和地区分别编码方式,下面说说 Unicode 系列

为容纳全世界各种语言的字符和符号, ISO 的一些会员国于 1984 年发起制定新的国际字符集编码标准。新标准由工作小组 ISO/IEC JTC1/SC2/WG2 (注 1 )负责拟订(以下简称 WG2 ),最后定案的标准命名为“ Universal Multiple-Octet Coded Character Set” (简称 UCS ),其编号则订为 ISO/IEC 10646 。依 WG2 原来的规划, ISO10646 的编码结构系沿袭 ISO2022 八位延伸编码结构以避开 C0 C1 两个句柄区(注 2 ),但打破每个字符 码里的所有字节的 bit-8 (即最左边的位,其值为 28=128 )必须都设为 0 或是都设为 1 的限制,以提高编码空间的使用率。同时,为了能有足够位置以容 纳全世界各种语言的字符和符号,以及为了配合微处理器以 8 16 32 甚或 64 个位为一个运算处理单位的趋势, ISO10646 的字符码长度被规定为定长 的 4 个八位( octet )。

ISO10646 草案初稿一经公布,其编码结构立即遭到美国部份计算机业者的反对。1988 年初,美国Xerox 公司的Joe Becker 倡议以新的编码结构,另外编订世界性字符编码标准:将计算机字符集编码的基本单位由现行的78 个位一举扩充为16 个位,并且充分利用 65,536 个编码位置以容纳全世界各种语言的字符和常用符号。新的字符集编码标准被命名为“Unicode” (注3 )。一群来自Xerox 公司和 Apple 公司的工程师组成工作小组,负责Unicode 的原始设计工作。1991 年元月,十多家计算机硬软件、网络和信息服务业者,包括:IBMDECSunXeroxAppleMicroSoftNovell 名公司,共同出资成立Unicode 协会(The Unicode Consortium ),并由协会设立非营利的Unicode 公司。Unicode 协会成立之后,将原先的工作小组扩编为Unicode 技术委员会 (Unicode Technical Committee ),专责Unicode 的字符搜集、整理、编码等工作。推动Unicode 成为国际标准的工作,则由Unicode 公司负责。 Unicode 草案第一版于19899 月发表,历经多次修订后,分别于199192 年出版了Unicode 标准第一版(The Unicode Standard, version 1.0 )的第一、第二册。

由于Unicode 协会持续的游说和施压,WG2 终于放弃原先选择的ISO2022 八位延伸编码结构,改采Unicode 的编码方式,亦即连续编码 不再避开C0C1 句柄区。199110 月,历经几个月的协商之后,WG2Unicode 协会达成协议,将Unicode 并入ISO10646 成为第 0 字面。之后各国语言字元的搜集、整理和编码等工作转由WG2 主导,而Unicode 协会则积极协助WG2 ,但双方仍然各自出版自己的编码标准。由于双方 标准的整合是在Unicode 标准第一版第一册出版之后才展开的,因此该版次标准的第二册非凡在第一章里说明了为因应合并工作所做的编码区和字符集修订项 目。ISO1993 年出版ISO10646-1 (注4 )的第一版,而第二版则经过多年修订之后于2000 年出版。介于ISO10646-1 第一、二版之间的 Unicode3.019999 月出版,而对应于ISO10646-2 (注5 )的Unicode3.12001 年出版。

二、编码结构与字符集

ISO10646 字符码的正规形式(可简称为UCS-4 )为32 个位,划分成4 个八位,如【图一】所示。这4 个八位,由左而右命名为群八位(G- octet )、面八位(P-octet )、列八位(R-octet )和格八位(C-octet ),分别代表编码结构中的群组(group )、字面 (plane )、列(row )与格(cell )。ISO10646 规定其字符 码的b32 必须为0 ,因而整个编码空间可区分为128 个群组(群八位的值为 007Fh (注6 )),每一群组由256 个字面所组成(面八位元为00FFh ),每一个字面由256 列所组成(列八位为00FFh ),每一列则包含 256 格(格八位为00FFh ),为一个编码位置。除此之外,ISO10646 还规定每一个字面的最后两个编码位置FFFEhFFFFh ,保留不用。 所以,ISO10646 整个编码空间总共256×12832,768 个字面,每个字面为256×256265,534 个编码位置,合计 65534×327682,147,418,112 个编码位置。

ISO10646 的第0 群组第0 字面(群八位和面八位的值都为00h )称为「基本多语文字面」(Basic Multi-lingual Plane, BMP ),其编码

你可能感兴趣的:(apple,互联网,教育,资讯,出版)