骂掏粪男孩的话:谈谈汉字的内码

来源:百度文库 编辑:九乡新闻网 时间:2024/05/03 14:35:14
我在UNIX平台编写程序的时候,经常遇到字符终端显示汉字出现乱码的情况,例如,我在字符终端显示长篇汉字的摘要(长篇汉字的头部分汉字)时,通过strncpy函数复制一些字符时由于存在英文字符的原因,就出现了目标字符串的乱码。当然界面显示的时候就会出现乱七八糟的情况。

      其实,解决这些问题很简单,这需要了解汉字的编码情况。 
  计算机上使用的汉字有两类代码,一类叫外码,用来输入汉字,如拼音码、郑码、五笔字型码等。由于人们不断寻求更佳的汉字输入法,因此外码也就层出不穷。不同的外码规则也不同,如果计算机内部存储汉字时,也采用这些五花八门的编码,势必使汉字系统过于复杂。因此,不论用什么输入法输入的汉字,在存入存储器时,都将它的外码转换成一种统一的代码,这就是汉字内码。
  一个汉字的内码由两个字节组成。汉字内码与区位码之间有一个简单的关系:
      内码第一字节=区码+160
      内码第二字节=位码+160
  比如,查区位码表知道,“啊”字在16区01位,它的内码为:
  第一字节=16+160=176
  第二字节=1+160=161
  英文字符的代码ASCII只用一个字节表示。为什么一个汉字要用两个字节来表示呢?原来一个字节(8位二进制数)能表示的最大整数范围是0~255,也就是说最多能表示256种不同的状态,这用于表示几十个英文字符足够了。但是汉字有成千上万个,所以至少要用两个字节(16位二进制数)来编码。两个字节最多可有65536种不同的编码。
  由于大多英文软件只处理单字节对象,而汉字内码又是双字节的,这就会带来一些问题。比如我们用vi编辑一个文本文件,要删掉其中的一个汉字时,要敲两次删除键才能删掉。若是只删了一下,后面的汉字就变得面目全非了。道理很简单:删一下,只删掉了汉字内码的一个字节,剩下的一个字节和下一个汉字的头一个节就构成了另一个汉字或符号的内码,于是就显示出和这个内码对应的汉字或符号。依次错位,后面的汉字就全变了。
  因此,我对strncpy进行了改造,编写了一个支持汉字的情况的函数,前提要求是传入的字符序列不出现乱码情况,否则,我也没有办法了