什么是字符编码?
计算机只能存储0,1之类2进制数字,怎么样让它表示那么多各种各样的字符呢?就需要对各种字符指定一个数值的编码代号它就是字符编码。如:a这个字符,在ascii字符集编码表中对应的编号是97,而“中”在gb2312字符集中对应的编号是:16进制是D6D0 10进制是54992 。通过编号就可以找到计算机对应字符。不用将那么复杂的字符保存在计算机中,只需要保存它代号就好。字符集只是指定了一个集合中有哪些字符,而字符编码,是为这个集合中所有字符定义个编号,这就是字符集与编码区别所在。
如果我告诉别人,我这个字符是:gb2312字符集中编号是:54992或者是D6D0 ,无论那个程序都知道是”中”,如果有人听错了,把它弄成日文JIS字符集,然后他也去找编号是:54992对应的字符,却找到的是:”面“。
打了这个比方,相信大家找到原因了,同样如果把54992拿到ascii 码表找,就会得到对应:�� 两个不能打印字符了。
从上面看,当你拿到本来是gb2312编号,在不是它的字符集里面找就出现这样问题了。 其它,程序出现乱码也都是这个原因,找错了字符集表了.
字符在计算机是怎么样存储的呢?
看了上面介绍,我想大家一定会说,如果所有文本的字符,都用它的符号存储在计算机里面,不就什么问题都么有吗? 以前也这么想,后来一想啊,如果都存在计算机中,各种各样,怎么样表示呢?计算机处理01之类数字该多方便呢。
我们可以通过winhex实际来检查下,下面在简体中文下,将”中按照gb2312字符集编码保存。
以gb2312编码保存中文“中”,实际存储在计算机中是:D6D0,是“中”在字符集gb2312中的编号啦!
计算机中只保存字符在某字符集中对应的字符编号值,计算机只需要维持一份字符集清单,当读到这种编号值(编码),就在对应字符清单中找出该字符显示出来即可。字符大小颜色都是程序按照字符样式绘制而成的。
看个图:
计算机中只保存该字符在某字符集中对应的字符编号(也叫字符编码)
怎么样读取文件并正确显示文件内容?
从上面例子知道字符实际以该字符在某字符集中字符编码存储与计算机磁盘中。
下面以“中国”为例(中文简体windows):
以下以:“abc”为例
从上面可以得到几点:
1、以某字符集存储字符时,它会在该字符集中搜索这个字符的位置(编号或编码),以这个编号(编码)保存在文件,如果所搜找不到该字符,一般会以:3F 3F保存(一定会出错)
2、当需要显示字符,从取文件中字符编码,如果没有指定字符集,会通过文件头(主要unicode字符集有特殊头标记)判断字符集,如果不是unicode字符集,默认都以ANSI字符集读取,用字符编码在该字符集中寻找对应字符,如果搜索到就正常显示,搜索不到就会显示乱码.