【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 2787|回复: 0

BIG5到GB的转换技术

[复制链接]
发表于 2006-11-24 17:23:55 | 显示全部楼层 |阅读模式
中文因为数量太多,所以与英文用ASCII码一个字节表示不同,它使用两个字节来表示。通过计算这两个字节,我们可以得到其表示的汉字在中文字库中的位置。读取该位置的若干字节,以获得表示这个汉字的点阵信息。有了这些信息,就可以分别在DOS或WINDOWS中显示该汉字。事实上,在文本文件中保存的就是每个汉字对应的两个字节编码,而显示问题由中文操作系统自动解决。

  汉字编码并不统一,我们使用的是GB码,而台湾地区使用的是BIG5码。BIG5码文件中保存的是汉字相应的BIG5编码,GB码文件中保存的是汉字相应的GB编码(这也就是“乱码现象”的来由)。所以转换工作的关键是有一个记录每个BIG5编码对应GB编码的码表文件。

  第一步 制作码表文件

  BIG5码编码规则是这样的:每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE,共126种。第二个字节的范围分别为0X40-0X7E,0XA1-0XFE,共157种。也就是说,利用这两个字节共可定义出 126 * 157=19782种汉字。这些汉字的一部分是我们常用到的,如一、丁,这些字我们称为常用字,其BIG5码的范围为0XA440-0XC671,共5401个。较不常用的字,如滥、调,我们称为次常用字,范围为 0XC940-0XF9FE,共7652个,剩下的便是一些特殊字符。

  制作码表文件的原理是这样的:首先将所有的BIG5编码写入一个文件,然后,使用具有BIG5码到GB码转换功能的软件,如地球村、东方快车、四通利方,将文件转换为GB码文件,即得到码表文件。

  下面的源程序将所有可能的BIG5编码(0XA100-0XFEFF)写入文件“Table.TXT”。

  //TURBO C++ 3.0
  #include <Stdio.h>
  #include <stdlib.h>

  void main()
  {
  FILE * codefile;
  int i,j,k;
  codefile = fopen("table.txt","w+b");
  for (i=0xa1;i<=0xfe;I++)
  {
  for(j=0x00;j<=0xff;j++)
  {
  fwrite(& i,1,1,codefile);
  fwrite(& j,1,1,codefile);
  }
  }
  fclose(codefile);
  return;
  }

  运行地球村、东方快车或四通利方,将“Table.txt”从BIG5码转换为GB码,即获得码表文件。

  第二步 转换

  下面的源程序,将BIG5码文件转换为GB码文件。

  //TURBO C++3.0
  #include <stdio.h>
  #include <stdlib.h>

  void main()
  {
  int que, wei;
  FILE * sourcefile;
  FILE * tabfile;
  FILE * destfile;
  sourcefile = fopen("big.txt', "r+b");

  //BIG5 码文件
  tabfile = fopen("table.txt", 'r+b");
  //码表文件
  destfile = fopen("gb.txt","w+b");
  //转换生成的GB码文件
  while (!feof(sourcefile))
  {
  fread(& que,1,1,sourcefile);
  if (feof(sourcefile))
  {
  break;
  }
  if (que> =0xa1 && que <=0xfe)
  //叛断是否汉字(BIG5编码)
  {
  fread(& wei,1,1,sourcefile);
  if (wei<0xa1) wei = wei - 0x40;
  if (wei>=0xa1) wei = wei - 0xa1 + 0x7e - 0x40 + 1;
  fseek(tabfile, 2 * ((que -0xa1) * (0xfe - 0xa1 + 1 + 0x7e - 0x40 + 1 ) + wei), SEEK_SET);
  fread(& que,1,1,tabfile);
  fread(& wei,1,1,tabfile);
  fwrite(& que,1,1,destfile);
  fwrite(& wei,1,1,destfile);
  }
  else
  fwrite(& que,1,1,destfile); //处理英文
  }

  fclose(sourcefile);
  fclose(tabfile);
  fclose(destfile);
  return;
  }

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-2-6 03:56

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表