Unicode字符编码标准
1. 编码知识
1.1 文本和字符
在计算机程序中或者数据文件里,文本(text)是作为数字序列存储的。序列中的数字是具有不同大小、取值和解释的整数。如何解释这些整数是由字符集(character set)、编码(encoding)决定的。
文本主要是由字符(character)组成。在格式文本(fancy text, or rich text)中包括显示属性,如颜、斜体字、上标等,但仍然是以字符组成的纯文本(plain text)为基础的。有时,格式文本与纯文本之间的区别很复杂,依赖于具体的应用。
unicode汉字什么是字符?典型地,是字母。也可以是数字、句点、连字号、标点符号和数学符号,对于中文,也可以是汉字。还包括定义行尾和段落等的控制字符(一般不可见)。
有了字符,就可以为它们分配数字编码。为字符分配什么数字值,依赖于具体情况。一个简单的字符,如字母"a",在不同的程序或者数据文件中可能具有不同的整数值。
1.2 字符集:具有数字编码的字符
在信息处理中,所使用的整数总有上限,依赖于存储整数的位的数目。这也决定了可以同时区分的字符的数量。
在设计字符集时,首先要决定所需字符的数目,并确定所需字符的清单。根据字符的数目,可以设定整数值的上限,这个整数范围称为编码空间(code space),其中的一个特定整数称为一个码点(code point)。
然后,为字符清单中的每个字符指定一个整数值,也就是一个码点。这样就得到一个字符集,称作编码字符集(Coded Character Set)。
1.3 编码单元、字节和编码
在计算机系统的实现中,整数以特定大小的单元表示,通常为8位(1字节),16位,或32位。在字符编码中,这样的单元称为编码单元(code unit)。根据编码空间的大小和具体要求,来选择合适的编码单元。通常,所选择编码单元对应的整数范围要大于编码空间的整数范围,这样每个码点就只需一个编码单元表示,并且在字符码点与编码单元间的转换
非常简便,因为字符码点对应的整数值与相应编码单元的整数值相同。如果编码单元对应的整数范围小于编码空间的整数范围,就需要多个编码单元表示一个码点。
字节是计算机系统中最基本的表示单元,无论是存储在内存中,还是将文本写入文件或通过网络发送,总是要读写若干字节。因此,在实际应用中,还需要将编码单元进一步表示为字节序列。
将字符表示为字节序列的过程就称为编码(encoding),更重要的是,还包括如何对字节序列进行解释以取得字符。
1.4 不同的字符集
在一些常用的编码中,每个字符只使用一个字节表示,称单字节字符集(single-byte character set, SBCS)。这些字符集都仅限于256个字符。
在ASCII之后,目前应用最广泛的单字节字符集是ISO-8859-1。它是ASCII的一个8位超集,并且提供西欧语言所需的大多数字符。它的一个改进的版本,ISO-8859-15,还包括新的欧元符号和更多的一些法语和芬兰语字母。
    双字节字符集(double-byte character set, DBCS)用于为东亚书写系统中所使用成千上万个表意字符提供足够空间。这里的编码仍是基于字节的,不过是两个字节一起表示一个单一的字符。
    即使在东亚,文本中也会包含小字母表中的字母,如拉丁字母表。这些字母使用单字节表示的效率会更高。因此,提出了多字节字符集(multi-byte character set, MBDC),使用可变数目的字节来表示字符。多字节字符集通常与ASCII兼容,也就是说,在这种编码中,拉丁字母使用与ASCII中相同的字节来表示。一些不常用的字符可能会使用三个甚至四个字节编码。
1.4 常见字符集
1.4.1 ASCII: The American Standard Code form Information Interchange
    ASCII是一个使用7位单元的字符集,及针对7位字节的简单编码方式。尽管局限于很少的一些字符,ASCII是最重要的一种字符集,因为它是目前大多数字符集的基础。
    ASCII只提供了128个数字值(也可称作码点,code point),其中33个被保留用作特殊
功能。只有95个码点用作"真正的"文本字符。这些图形字符大多时大写和小写拉丁字母,数字和标点符号,外加一些特殊的括号、下划线和重音符号。
1.4.2 EBCDIC: The Extended Binary-Coded Decimal Interchange Code
EBCDIC是由IBM设计的编码格式,使用8位字节,被一些字符集用于大型机。EBCDIC在与ASCII相近的时期开发的,具有一些相似的特性。
1.4.3 Unicode
Unicode标准定义了一个字符集和几种编码。
Unicode最有吸引力的特点是它涵盖了几乎世界上的所有字符,可以只通过一个唯一的数字(Unicode码点)来访问和操作字符。
2. Unicode介绍
2.1 为什么使用Unicode?
在创造Unicode之前,有数百种编码系统。但是,没有任何一个编码可以包含足够的字符。例如,仅欧州共同体就需要好几种不同的编码来包括所有的语言。即使是单一的一种语言,如英语,也没有哪一个编码可以适用于所有的字母,标点符号,和常用的技术符号。
这些编码系统也会互相冲突。也就是说,两种编码可能使用相同的数字代表两个不同的字符,或使用不同的数字代表相同的字符。任何一台特定的计算机(特别是服务器)都需要支持许多不同的编码,但是,不论什么时候数据通过不同的编码或平台之间,那些数据总会有损坏的危险。
而Unicode正在改变所有这一切!
在Unicode标准中,提供了1,114,112个码点,不仅可以包含当今世界使用的所有语言文字和其他符号,也足够容纳绝大多数具有历史意义的古文字和符号。并且,Unicode给每个字符提供了一个唯一的数字,不论是什么平台,不论是什么程序,不论什么语言。
Unicode 标准已经被工业界的领导们所采用,例如:Apple, HP, IBM, JustSystem, Microsoft, Oracle, SAP, Sun, Sybase, Unisys等等。最新的标准都需要Unicode,例如XML,
Java, ECMAScript , LDAP, CORBA 3.0, WML等等,并且,Unicode是实现ISO/IEC 10646的正规方式。许多操作系统,所有最新的浏览器和许多其他产品都支持它。Unicode标准的出现和支持它工具的存在,是近来全球软件技术最重要的发展趋势。
2.2 Unicode与国际化
直到最近,国际化的常用方法是,假定任何给定的可执行程序同时只和一种语言工作。如果在英文环境下安装,它就只处理英文文本;如果在中文环境下安装,就只处理中文文本。
在这种模型下,针对不同的书写系统和语言,使用的字符集和字符编码不同。在Windows和大型机环境下,术语"代码页"(Code Page)用于描述如何将二进制值映射到人类可读得字符(字形)。一个运行的程序处在单一的代码页,该代码页确定二进制值如和与字形关联。
简便的国际化是Unicode的另一项优势。在内部使用Unicode的应用程序,能够同时存储和处理世界上所有的字符,这消除了传统的国际化方法所面临的一些困难。
当然,成功的国际化不仅仅是在应用程序中采用Unicode,还需要谨慎的屏幕布局设计(不同的语言具有不同的书写习惯)、翻译和文化理解。
2.3 设计原则
Unicode的设计反映了十大基本原则,但这些原则并不是可以同时满足。整个设计是在保证简便高效和保持与已有编码标准兼容之间的平衡。
(1)广泛性(Universality)
Unicode标准对一个单一的大字符集进行编码,包括满足世界范围需求的所有字符。
(2)高效(Efficiency)
在Unicode的字符编码模型中没有换码符(escape character),每个字符编码与其它字符编码具有相同的状态。使高效率的实现成为可能。
所有Unicode编码方式都是自同步的,并且相互不重叠。使在字符流中随机访问和查操作高效。
同一书写字母体系中的字符被放置在一起,不仅方便字符的查,并且使实现更紧凑压缩方法更高效。
(3)针对字符编码,而不是字形(Character, Not Glyph)
字符是书写语言中具有语义的最小组件的抽象表示。字符是以驻留在内存中的码点表示。
字形是字符被显示时具有的形状。与字符相比,字形出现在屏幕或纸张上作为一个或多个字符的特定表示。字形的集合构成一种字体。
字符和字形间存在多种关系:一个字形可以对应一个字符;一个字形也可以对应几个字符;多个字形也可能出自一个字符。
(4)语义(Semantic)
在Unicode中,字符都有明确定义的语义。字符属性表可用于解析、排序等需要有关码点语义知识的算法中。Unicode中定义的属性包括数字、间隔、组合和方向属性。
(5)纯文本(Plain Text)
纯文本或无格式文本,仅仅是字符编码的序列。纯Unicode文本就是Unicode编码的序列。而格式文本(styled text, or rich text)是由纯文本添加一些附加信息(如语言标识、字体大小、颜等)组成的文本表示。
Unicode标准针对的是纯文本。
(6)逻辑顺序(Logical Order)
Unicode文本在内存表示中以逻辑顺序存储,大致对应于借助键盘输入文本的顺序。在一些情况下,当显示或打印文本时,字符顺序与逻辑顺序不同。
(7)统一(Unification)
Unicode标准为避免对字符重复编码,对不同语言书写方式中的字符进行统一,相同的字符分配唯一的一个编码。普通字母、标点符号、标记,和变音符都只分配一个编码,而不管语言;同样的还有中日韩使用的表意字符。
(8)动态组合(Dynamic Composition)
Unicode标准允许加重音符好的形式和Hangul音节的动态组合。
(9)等价序列(Equivalent Sequences)
一些文本元素即可以使用静态的预先组合好的形式,也可使用动态组合的形式。Unicode字符的不同表示序列被认为是等价的。
如果两个或多个序列被认为是等价的,Unicode标准不规定哪一种特定的序列是正确的,而认为每一个序列只不过与其它序列等价。
如果需要一种单一的单一的表示方式,可以使用一种规范化的Unicode文本形式来减少不想要区别。Unicode标准定义了四种规范化形式: Normalization Form D (NFD),Normalization Form KD (NFKD),Normalization Form C (NFC),和Normalization Form KC (NFKC)。大约来说,NFD和NFKD将可能的字符进行分解,而NFC和NFKC将可能的字符进行组合。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。