当前位置: 首页 > 图文教程 > 网络编程 > ASP > GB码和BIG5码的互换技术

ASP
ASP正则表达式技巧
ASP Access实现网站计数器(访问量)
ASP新闻分页,将一篇过长的文章分页,生成静态页面
一些关于asp 购物车的想法
一个sql查询器,自动画表格填字段
ASP实现文件直接下载的代码
把网页中的(电话,qq等数字)生成图片的ASP程序
asp长文章用分页符来分页显示
Asp函数介紹(37个常用函数)
ASP中的面向对象类
分页实现方法的性能比较
asp ajax跨域提交数据
asp修改文件和文件夹的名字的代码
ASP 多关键词查询实例代码
asp被杀毒软件误删的解决方法
asp 多关键词搜索的简单实现方法
asp 根据IP地址自动判断转向分站的代码
asp dictionary对象的用法
ASP 千万级数据分页的存储过程
ASP隐藏真实文件的下载功能实现代码

ASP 中的 GB码和BIG5码的互换技术


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-03   浏览: 127 ::
收藏到网摘: n/a

     中文与英文用ASCII码一个字节表示不同,它使用两个字节来表示。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。
    汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。
    GB码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0XA1-0XFE,共96种。第二个字节的范围分别为0XA1-0XFE,共96种。利用这两个字节共可定义出 96 * 96=8836种汉字。实际共有6763个汉字。
    BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。
    制作码表文件的原理是这样的:首先将所有的GB编码写入一个文件,然后,使用具有GB码到BIG5码转换功能的软件,如UCDOS下的CONVERT.EXE,将文件转换为BIG5码文件,即得到码表文件。
    下面的程序可将全部国标码写入文件gb.txt(以下全部程序用foxpro书写,可很容易的转换成其他语言)

    fp = fopen("gb.txt",2)
    for i=161 to 247
      for j=161 to 254
        =fwrite(fp,chr(i)+chr(j))
      next
      =fwrite(fp,chr(13)+chr(10))
    next
    =fwrite(fp,chr(26))
    =fclose(fp)

    文件的组织形式:行对应编码的第一字节,列对应编码的第二字节。使用时请注意编码的偏移量,如汉字“啊”GB编码0xb1a1第一字节0xb1(177)第二字节0xa1(161)所以他应该在文件的第(177-161=16)行第((161-161)*2=0)列。
    运行CONVERT.EXE将gb.txt转换成BIG5码的文件,这样就可得到按GB码组织的BIG5码表文件big5.txt。反之亦可得到按BIG5码组织的GB码表文件。

    转换的思路是这样的:(用foxpro书写)
    首先将码表文件装入数组
    fp = fopen("big5.txt")
    i = 0
    do while feof(fp)
      i = i+1
      dime dict[i]
      dict[i] = fgets(fp)
    enddo
    =fclose(fp)
    其次将待转换的文本装入变量
    create cursor temp (mm m)
    append blank
    append memo mm from textfilename
    text = mm
    然后扫描文本,替换所有的GB编码
    temp = ""
    i = 1
    do while i < len(text)
      ch = substr(text,i,1)
      if isascii(ch)   && 若是ASCII码
        temp = temp+ch
        i = i+1
      else
        ch1 = substr(text,i+1,1)
        big5 = substr(dict[asc(ch)-161+1],(asc(ch1)-161)*2+1,2)
        temp = temp+big5
        i = i+2
      endif
    enddo
    最后将在temp中得到转换后的文本

    需要注意的是,在foxpro中数组指针是以1开始,substr函数的起始位>=1。
    foxpro大家应该都会,看得懂的。转换好的big5.txt(17