基本概念
字符
计算机科学和信息科学中字符(character,或译为字元)是一个信息单位,通常来说就是一个字母、一个汉字、一个数字、一个标点符号。另外,还存在着一些控制字符,通常是不可打印的(不可见的,或称为是功能性的),有特定用途,以及emoji(绘文字)之类特殊的符号。字符集
字符集(character set)指的是指定若干字符组成的一个集合,通常这个集合具有一定的规模和合理性,比如囊括一个国家或地区日常使用的文字字符、数字、标点符号和控制字符等。不同的国家和地区由于历史和文化的原因,使用不同的语言文字,因此存在各种不同的字符集。字符编码
字符编码(character encoding)是把字符集中的字符映射为指定集合中某一对象(例如数字系统中表示为某个特定的二进制数),以便文本在计算机中存储和在通信网络传递。乱码
有字符的编码,就有相应的解码,解码出错就会导致乱码问题。乱码指的是由于使用不同的字符集或字符编码方式,导致显示的部分或全部字符无法被正常的阅读,如常见的文本、网页、邮件乱码。更多,可以参见cenalulus’s tech blog
字符集和字符编码的关系
字符集是书写系统字母与符号的集合,而字符编码则是将字符映射为一特定的字节或字节序列,是一种规则。通常特定的字符集采用特定的编码方式(即一种字符集对应一种字符编码,但Unicode不是,它采用现代的模型),因此基本上可以将两者视为同义词。
下面是关于常见字符集(字符编码)的介绍。
字符集很多,我们可以参见一下表格:
早期:计算机时代之前
密码学中加密,可以认为是一种广义的字符编码,但它的目的与本文所阐释的有所不同,因此不予展开。早期字符编码的一个最好的例子是在通信领域(无线电)存在的摩尔斯电码。
摩尔斯电码(又译为摩斯密码,Morse code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。它发明于1837年,以美国人塞缪尔·莫尔斯(Samuel F. B. Morse,1791年4月27日 – 1872年4月2日)命名。 摩尔斯电码代码包括五种: 点(dots或dits)、划(dashes或dashs)、点和划之间的停顿、每个字符间短的停顿(在点和划之间)、每个词之间中等的停顿以及句子之间长的停顿。
有意思的是摩尔斯电码也存在不同的编码方式,有美式编码,德式和现在国际通行的ITU标准。下图是ITU标准的摩尔斯电码:
补充:
在电报的发展和传播是中,中国也出现了中文电码,最早是法国驻华人员威基杰(S.A. Viguer)于1873年参照《康熙字典》的部首排列方法,挑选了常用汉字6800多个,编成了第一部汉字电码本《电报新书》。它采用由四个阿拉伯数字代表一个汉字的方法,常称为“四码电报”。
单字节:ASCII和它的继承者们
ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是 ANSI(American National Standard Institute,美国国家标准学会)为英语设计的单字节字符编码方案,主要包括英文字母、阿拉伯数字、英文标点符号和一些控制符号(来自早期的打字机),用于基于文本的数据。ASCII标准的工作由ASA( American Standards Association,美国标准联合会;即现在的ANSI)的下属部门于1960年开始,1963首版,1967经过重新修订,1986年是最新版本。ASCII总共包括128个字符,所以在只需要7位二进制数表示即可。由于计算机中1个字节是8位二进制数,一般表示时最高位设置为0。
它起始于50年代后期,在1967年定案。最初是美国国家标准,供不同计算机在相互通信时用作共同遵守的西文字符编码标准,它已被ISO(International Organization for Standardization, 国际标准化组织)和IEC(International Electrotechnical Commission,国际电工委员会)定为国际标准,称为ISO/IEC 646标准。参见下图: