关键词:
问题来源
我们经常会遇到中文乱码问题,也时常要绞尽脑汁去解决它。那么,当我们把不同的字符输入到电脑后,电脑程序到底怎么来理解它呢?电脑又是怎样进行的‘’字符的翻译‘’,乱码问题到底出现在哪?为了解释这些问题,我们引入几个例子来帮助理解。
示例一:用户输入的人机理解过程
用户输入的人机理解过程:
输入——>键盘码——>交换码——>内部码——>地址码——>字形码——>输出键盘码:输入设备(键盘,鼠标等)对应的系统键值或者经过编码后的acsii码
交换码:将接收的字符做计算机可支持的字符编码,例如我们常用的utf-8,assii等。
内部码:将对应已编码的字符存储为二进制形式。
地址码:实际的存储地址,为二进制形式。
字形码:根据相应原理或算法生成对应输入接受类型字符
示例二:查找不认识的单词的过程
从上面过程我们可以看出,乱码出现在已接收字符进行交换码与内部码转化的过程中,那我们想想英语小白在实际生活中遇到一个不认识的单词会怎么办呢?
- 查找不认识的单词的过程
不认识的单词——>使用双语字典查询——>根据查询规则获得单词位置——>根据位置找到该单词实际示意
我们归纳上面的例子可以理解实际转码的要点,即:
- 字库表(character repertoire):可读或者可显示字符的集合,字库表表示了整个字符集能够展现表示的所有字符的范围,例如中-英双语所包含的字。
- 编码字符集(coded character set):即用一个编码值来表示一个字符在字库中的位置,例如单词在字典中的位置。
- 字符编码(character encoding form):编码字符集和实际存储数值之间的转换关系,例如不同字典规定的规则,按字母、词性排序等。
示例三:字符编码存在的意义
通过三要点归纳,大家有可能会发现,字库表对应着字符的值,编码字符集对应着表中的的位置,这种键-值形式已经能满足电脑查询的功能了,那么字符编码存在的意义在哪呢?这其实很好理解,如果我们想要用一本字典查询所有我们不知道的字符,这就要求我们的字典必须包含的范围足够大,内容足够多。可是对于我们上文提到的新单词问题而言,我仅仅需要解决一个很小的麻烦,仅仅需要一本中英双语词典就能搞定了。对于计算机和程序的使用也是类似,我只需要存储我需要且常用的字典,而不需要将偌大的字典存进来消耗我的内存和查询时间。而字符编码就解决词典切分和其他规则定义的需求。
常用的字符集与字符编码
通过上面的举例,相信大家对两者一有了明确的认识,那我就列举出常见的字符表与字符编码。
- 字符集/字符编码:ASCII字符集/ASCII编码、GBxxxx字符集/GBxxxx编码、BIG5字符集/BIG5编码、Unicode字符集/UTF-32 UTF-16 UTF-8编码等。
乱码出现的原因
用了不相对应的编码与解码方式,导致对同一字符进行不同的翻译解释。所以,在实际操作过程中,尽量先弄明白输入与输出的编码方式,同时检查你编码文件的默认打开编码方式,这样能一定程度上帮你解决乱码问题。