文字是怎么显示的:字符集的秘密
 
和字符集打交道最多的莫过于程序员了,尤其是Java程序员,常常发现“乱码”,要搞懂这些问题,必须挖到根上,揭开字符集的秘密看个究竟。
 
首先应该明白几个概念:
 
字符:是最基本的语言符号。比如a、b、c、d.....以及各种标点符号等等,这是字符最原始的概念。但是世界上的语言符号很多很多,尤其是中日韩的亚洲国家文字,这些也是字符,包括一些计算机中为识别操作等所作的一些“不可见”的字符,比如回车、换行等等也是字符,这是对字符概念的广义解释。
 
抽象字符集:为了统一,每个语种都包含自己一套语言符号,这些符号的集合组成了抽象字符集。比如中文字符集,藏文藏文字符集,英文字符集等等,但是这些字符集中的字符怎么排序等都不知道,是一种概念上的抽象,称这种字符集为抽象字符集。
 
编码字符集:编码字符集是对抽象字符集中每个字符,做一个先后次序的编号,以便于查找。可见,编号只有与特定字符集绑定后,才能唯一确定一个特定语言的字符。比如中文里的第1001个字与韩文的第1001的字就不是一个字符,
 
字符集编码:字符集编码是为存储而设计的,是特定编码字符集与所存储二进制数据(也可以转换为8、10、16进制等)的映射。
 
实际上,编码字符集对编程没有意义,通常,一般的编程语言比如Java也没提供字符集编码到字符序号查询的API,因此就把它当做一个概念来理解就是了。
 
平常口头上所讲的字符集一般都指编码字符集,编码字符集仅仅是一种编码而已,下面是一个概念图,看了此图就明白了:
 
 
常见的字符集有Unicode、GB18030、GBK、GB2312等等,但是,对于字符集的概念主要体现在编码上,因此实际上很少说什么字符集,因为字符集编码已经确定了该编码可以存储多少字符,都有哪些。因此在中文上、字符集和字符集编码是一个概念,你可以说我用的是GBK字符集,也可以说用的GBK编码,都没有问题,并且很多都是字符集这两个概念的名字都是一样的。但是对于Unicode字符集来说,编码分三种,分别是UTF-8、UTF-16、UTF-32三种。
 
另外,对于字符集的编码,有标准名称,还有很多别名,两者是通用的。比如latin1那就是ISO-8859-1的代名词。
 
扯远了,以上几个概念搞明白了,怎么显示就很好讲了。
 
比如打开一个记事本文档,操作系统会读取记事本文档的二进制数据,并根据特定结束标志,解析出二进制数据的分界,并将两个分界见的字节序列(可能有多个)按照存储的数据在对应字符集中找到字符的编号,并根据编号和语言到字库中查找显示字符的字体数据,然后将文字逐个画到记事本窗口中,这就是文字的显示过程。
 
也许你还有跟多的疑问,那就看下回的常见字符集吧,没看一节会更明白点。