字符编码
字符编码(Character encoding)、字集碼是字符集由编码组成。編碼是指將某一字符序列對應到一指定集合中某一东西(例如可能显示为一种自然数序列,交流所用的字母表或者字音表),再將其對應到另一个给定的集合中的其它东西,如一个自然数序列、8位字节或者电脉冲,以便于文本在计算机中存储和通过通信网络的发送。常见的例子包括将拉丁字母表编码成摩斯电码和ASCII。其中,ASCII将字母、数字和其它符号編號,並用7位元的二进制來表示这个整数。通常會額外使用一个扩充的位元,以便于以8位字节的方式存储。
在计算机技术发展的早期,如ASCII(1963年)和EBCDIC(1964年)这样的字符集逐漸成為標準。但这些字符集的局限很快就变得明显,于是人们开发了許多方法来扩展它们。对于支持包括东亚CJK字符家族在内的写作系统的要求能支持更大量的字符,并且需要一种系统而不是临时的方法实现这些字符的编码。
目录 |
[编辑] 简单字符集
按照惯例,人们认为字符集和字符编码是同义词,因为使用同样的标准来定义提供什么字符并且这些字符如何编码到一系列的代码单元(通常一个字符一个单元)。由于历史的原因,MIME和使用这种编码的系统使用术语字符集来表示用于将一组字符编码成一系列八位字节数据的整个系统。
[编辑] 现代编码模型
由統一碼和通用字符集所構成的现代字符编码模型則没有跟从简单字符集的观点。它们将字符编码的概念分为:有哪些字符、它们的编号、这些编号如何编码成一系列的“码元”(有限大小的数字)以及最后这些单元如何組成八位字节流。區分這些概念的核心思想是建立一个能够用不同方法來编码的一个通用字符集。为了正确地表示这个模型需要更多比“字符集”和“字符编码”更为精确的术语表示。现代模型中所用的术语列在下面:
字符集(Character Set)是一个系统支持的所有抽象字符的集合。字符表可以是封闭的,即除非创建一个新的标准(ASCII和多数ISO/IEC 8859系列都是这样的例子),否則不允许添加新的符号,;字符表也可以是开放的,即允许添加新的符号(統一碼和一定程度上代碼頁是这方面的例子)。特定字符表中的字符反映了如何将书写系统分解成线性信息单元的决定。例如拉丁、希腊和斯拉夫字母表分为字母、数字、变音符号、标点和如空格这样的一些少数特殊字符,它们都能按照一种简单的线性序列排列(尽管对它们的处理需要另外的规则,如带有变音符号的字母这样的特定序列如何解释——但这不属于字符表的范畴)。为了方便起见,这样的字符表可以包括预先编号的字母和变音符号的组合。其它的书写系统,如阿拉伯语和希伯莱语,由于要适应双向文字和在不同情形下按照不同方式交叉在一起的字形,就使用更为复杂的符号表表示。
编码字符集(CCS:Coded Character Set)是一个将字符集
映射到非负整数
的函数。(函数是特殊的集合)
是一个有限的集合,其中的每个数字叫做码点,但某些码点可能没有被对应的字符。例如,在一个给定的字符表中,表示大写拉丁字母“A”的字符被赋予整数65、字符“B”是66,如此继续下去。多个编码字符集可以表示同样的字符表,例如ISO-8859-1和IBM的代码页037和500含蓋同样的字符表但是将它们映射为不同的代码。
字符编码表(CEF:Character Encoding Form)定义将编码字符集的整数代码转换成有限大小整数代码值以利于使用固定位的二进制表示数字的形式(比如,几乎任何的计算机系统)的系统存储。例如,使用16位单元存储数字信息的系统每个单元只能够直接表示从0到65,535的数值,但是如果使用多个16位单元就能够表示更大的整数。这就是CEF的作用:它定义一种从0到140万的范围的单个 码点映射到一些列列的范围在0到65,5356的单个或多个 码值的方法。
最简单的字符编码表就是單純地选择足够大的单位,以保证编码字符集中的所有数值能够直接编码(一个码点对应一个码值)。这对于能够用使用八位元來表示的编码字符集(如多数传统的非CJK编码所作的那样)是合理的,对于能够使用十六位元來表示的编码字符集(如早期版本的統一碼)来说也足够合理。但是,随着编码字符集的大小增加(例如,现代統一碼每个字符至少需要21位),这变得越来越没有效率,并且很难让现有系统适应更大的码值。因此,许多使用新近統一碼版本的系统或者使用将統一碼码点對應為可变长度8位字节序列的UTF-8,或者使用将码点對應为可变长16位字的UTF-16。
字符编码方案(CES:Character Encoding Scheme)定义如何將整数代码對應到适合基于8位字节数据的文件系统存储或用於网络传输。在多数使用統一碼的场合,使用一个简单的字符来指定字节顺序是大端序或者小端序(即使对于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
- 印度文字資訊交換碼
- 越南資訊交換標準代碼
- 大五碼
- 國家標準代碼
- 中文資訊交換碼
- 中文標準交換碼
- ISO/IEC 2022, Shift JIS, EUC
- 統一碼 (以及其子集,如16位的基本多文種平面)。 参见 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
- 汉字字符编码查询
- 精确解释Unicode