字符编码
字符编码(Character encoding)、字集碼或字符集由编码组成,代码使得某一字符序列匹配于一指定集合中某一东西,例如可能显示为一种自然数序列,交流所用的字母表或者字音表)到一个给定的集合中的其它东西,如一个自然数序列、8位字节或者电脉冲,以便于文本在计算机中存储和通过通信网络的发送。常见的例子包括将拉丁字母表编码成一些列长短发报电键的摩斯电码和ASCII,ASCII将字母、数字和其它符号编码成整数和用7位二进制表示的这个整数,通常使用另外一个扩充的0位以便于用8位字节存储。
在计算机技术发展的早期,诸如ASCII(1963年)和EBCDIC(1964年)这样字符集的引入开始成为标准化的过程。这些字符集的局限很快就变得很明显,于是人们开发了许多临时的方法来扩展它们。对于支持包括东亚CJK字符家族在内的多用写作系统的需求要求支持更大量的字符,并且需要一种系统而不是临时的方法实现这些字符的编码。
简单字符集
按照惯例人们认为字符集和字符编码是同义词,因为使用同样的标准来定义提供什么字符并且这些字符如何编码到一系列的代码单元(通常一个字符一个单元)。由于历史的原因,MIME和使用这种编码的系统使用术语字符集来表示用于将一组字符编码成一系列八位字节数据的整个系统。
现代编码模型
一起构成多数现代字符编码模型的Unicode和它的对应标准ISO/IEC 10646 通用字符集没有遵从这种观点,相反它们将字符编码思想分为:有什么字符、它们的编号、这些编号如何编码成一系列的“码元”(有限大小的数字)以及最后这些单元如何编码位8位字节流。这个分解所用的思想是建立一个能够用不同方法编码的一个通用字符集。为了正确地表示这个模型需要更多比“字符集”和“字符编码”更为精确的术语表示。现代模型中所用的术语列在下面:
字符表(Character Set)是一个系统支持的所有抽象字符的总和。字符表可以是封闭的,也就是说不允许添加新的符号,除非创建一个新的标准(ASCII和多数ISO/IEC 8859系列都是这样的例子);字符表也可以是开放的,允许添加新的符号(Unicode和一定程度上视窗代码页是这方面的例子)。特定字符表中的字符反映了如何将书写系统分解成线性信息单元的决定。例如拉丁、希腊和斯拉夫字母表自然分为字母、数字、变音符号、标点和如空格这样一些少数特殊字符,它们都能按照一种简单的线性序列排列(尽管对它们的处理需要另外的规则,如带有变音符号的字母这样的特定序列如何解释——但这不属于字符表的范畴)。为方便起见,这样的字符表可以包括预先编号的字母和变音符号的组合。其它的书写系统,如阿拉伯语和希伯莱语,由于要适应双向文字和在不同情形下按照不同方式交叉在一起的字形,就使用更为复杂的符号表表示。
编码字符集(CCS:Coded Character Set)定义了如何使用称为码点的非负整数表示一个字符表。例如,在一个给定的字符表中,表示大写拉丁字母“A”的字符被赋予整数65、字符“B”是66,如此继续下去。一个完整的字符集和对应的整数一起称为“编码字符集”。多个编码字符集可以表示同样的字符表,例如ISO-8859-1和IBM的代码页037和500覆盖同样的字符表但是将它们映射为不同的代码。在一个编码字符集中,每个码点仅仅表示一个字符。
字符编码形式(CEF:Character Encoding Form)定义将编码字符集的整数代码转换成有限大小整数代码值以有利于使用固定位的二进制表示数字的形式(比如,几乎任何的计算机系统)的系统存储。例如,使用16位单元存储数字信息的系统每个单元只能够直接表示从0到65,536的数值,但是如果使用多个16位单元就能够表示更大的整数。这就是CEF的作用:它定义一种从0到140万的范围的单个 码点映射到一些列列的范围在0到65,5356的单个或多个 码值的方法。
最简单的CEF系统就是简单地选择足够大的单位以保证编码字符集中的所有数值能够直接编码(一个码点对应一个码值)。这对于能够用8位表示的编码字符集(如多数传统的非CJK编码所作的那样)是合理的,对于能够使用16位表示的编码字符集(如早期的Unicode版本)来说也足够合理。但是,随着编码字符集的大小增加(例如,现代Unicode每个字符至少需要21位),这变得越来越没有效率,并且很难让现有系统适应更大的码值。因此,许多使用Unicode后来新近版本的系统或者使用将Unicode码点映射位变长8位字节序列的UTF-8,或者使用将码点映射为变长16位字的UTF-16。
字符编码机制(CES:Character Encoding Scheme)定义固定大小的整数代码如何映射到适合基于8位字节数据的文件系统存储或者基于8位字节网络传输。在多数使用Unicode的场合,一个简单的字符编码机制用来指定每个整数的字节顺序是大字节在先排列顺序或者小字节在先排列顺序(即使对于UTF-8来说并不需要这些)。然而,有些复杂的字符编码机制使用转义序列在几种简单编码机制(如ISO/IEC 2022)和用于减小每个单元所用字节数的压缩机制(如SCSU、BOCU和Punycode)之间切换。
字符编码历史
流行的字符编码
- ISO/IEC 646
- EBCDIC
- ISO/IEC 8859:
- DOS 字符集,也被称作IBM 代码页:
- Windows 字符集:
- Windows-1250
- Windows-1251 用于西里尔字母表
- Windows-1252
- Windows-1253
- Windows-1254
- Windows-1255 用于希伯莱语
- Windows-1256 用于阿拉伯语
- Windows-1257
- Windows-1258 用于越南语
- KOI8-R, KOI8-U, KOI7
- MIK
- ISCII
- VISCII
- Big5
- 国标
- ISO/IEC 2022, Shift_JIS, EUC
- Unicode (以及其子集,如16位的 'Basic Multilingual Plane')。 参见 UTF-8
字符转换工具
linux:
- utrac - 将整个文件内容从一种字符编码转换到另外一种 (http://utrac.sourceforge.net/)
- convmv - 将文件名从一种字符编码转到另外一种 (http://j3e.de/linux/convmv/man/)
参见
- Category:字符编码 — 关于通用字符编码的文章
- Category:字符集 — 关于特殊字符编码的文章
- 亂碼 — 非映射字符集
- 字符集
外部连接
- Character sets registered by Internet Assigned Numbers Authority
- Unicode Technical Report #17: Character Encoding Model
- SIL's freeware fonts, editors and documentation See SIL
- ICU Converter Explorer
- The Cyrillic Charset soup
- Early history of character set standardization
- Character Sets And Code Pages At The Push Of A Button
- A complete introduction to Japanese character encodings
- A tutorial on character code issues
- Online Char (ASCII), HEX, Binary, Base64, etc... Encoder/Decoder with MD2, MD4, MD5, SHA1+2, etc. hashing algorithms
- Universal Cyrillic decoder, 一个用来帮助恢复由于错误字符编码产生的不可读的西里尔字母的在线程序(以及其它的一些程序).
- Introduction to i18n,请参阅 Chapter 3 - Important Concepts for Character Coding Systems