字符集&编码方式
在继续向下之前,我们需要区分下字符集和编码方式两个概念。
字符集(Charset)是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
而字符编码(Character Encoding)是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对。
具体来说,对于ASCII字符集,是指包括控制字符(回车键、退格、换行键等);可显示字符(英文大小写字符、阿拉伯数字和西文符号)。
而ASCII编码则是将ASCII字符集转换为计算机可以接受的数字系统的数的规则。使用7位(bits)表示一个字符,共128字符。
因此,实际上,同一个字符集其实可以有多种编码方式,例如我们熟悉的Unicode,实际上应该称之为一个字符集,而它的具体编码实现方式则有UTF-8,UTF-16等多种。(当然这个表述方式同样存在问题,这是源于字符编码(character encoding), 字符映射(character map), 字符集(character set)或者代码页,在历史上往往是同义概念,关于Unicode更详细的一些说明请参加Unicode)
在后面的表述中,如无特殊需要,我们对字符集,编码方式,编码实现方式等几个概念也不加以特殊区分使用。
欧洲语言
随着计算机的发展,计算机所要处理的语言已经不只是英语,像法语德语西班牙语这些语言也产生了编解码的需求。这个时候标准ASCII显然已经不够用了,所以各种语言产生了扩充ASCII的需求。
幸运的是,西方整体基于拉丁语的拼写规则,使得他们每种语言也并没有太多的字母,而ASCII富余出来的128个字符空位显然已经足够,因此各国纷纷开始扩充ASCII编码。这样,大家依然可以只使用一个字节来完整的表示自己国家的语言,同时还可以兼容ASCII编码。(这也就是为什么英语在几乎所有的编码规则中都没有乱码问题的原因,当然UTF-16有些特殊,有兴趣可以了解下UTF-16)
但是,这里又出现了新的问题。不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母 ג。