⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 20000806006.htm

📁 C++Builder教学大全
💻 HTM
字号:
<HTML>

<HEAD>



<TITLE>BCB3.0中让TRichEdit支持BIG5内码</TITLE>



<META content="MSHTML 5.00.2314.1000" name=GENERATOR>

</HEAD>

<BODY aLink=#FF0000 bgColor=#ffffff leftMargin=0 link=#187800 topMargin=0 

vLink=#990099>



<div align="center">

  <table width="744" border="0" cellspacing="0" cellpadding="0" height="76">

    <tr> 

      <td> 

        <p align="center"><strong><font size="3"><br>

          BCB3.0中让TRichEdit支持BIG5内码</font></strong></p>

        <p>大家好,现在的软件如:Foxmail等软件,都有显示GB内码和BIG5内码的功能。我经过一段时间的摸索,发现了实现这种功能的方法。现在就来介绍给大家。首先,要给大家介绍一下这两种内码:大家都知道英文的ASCII码是用一个字节来表示的,但中文因为文字数量太多,所以只能用两个字节来表示。实际上我们常见的文本文件中保存的就是每个汉字对应的内码,而汉字的内码就是该汉字在中文字库中的逻辑位置。在中文字库中,该逻辑位置存放了这个汉字的图像信息,有了这些图像信息,就可以显示该汉字了,当然在现在的Windows中这个显示的过程是由操作系统自动来完成的,我们不必去关心它。但是由于一些历史上的原因,汉字的内码方案有两种,我们大陆地区使用的是GB码,而台湾省却使用的是BIG5码。GB码文件中保存的是汉字相应的GB编码,BIG5码文件中保存的是汉字相应的BIG5编码。而两种内码又都对应于各自的字库文件,所以当我们使用GB内码的简体中文Windows来看BIG5内码的文件时,就会产生常说的乱码现象。<br>

          &nbsp;&nbsp;&nbsp; 由于我们是要显示BIG5码的汉字,所以再介绍一下BIG5码的编码方案:每个汉字由两个字节构成,第一字节的范围从0X81-0XFE,第二个字节的范围分别为0X40-0X7E,0XA1-0XFE。好了,知道了汉字显示的原理和BIG5码的编码方案,就可以很容易让TRichEdit支持BIG5码了。<br>

          &nbsp;&nbsp;&nbsp; 第一步:找一个用于内码转换的码表文件。<br>

          &nbsp;&nbsp;&nbsp; 我用的是CCDOS97里带的CCDOS.TAB,这个文件的大小为45840个字节。如果你没有这个文件,可以给我来信(<a href>cnprogram@netease.com</a>)我会寄一个给你。当然你还可以根据BIG5码的编码方案自己做一个,这里就不多说了。<br>

          &nbsp;&nbsp;&nbsp; 第二步:把码表文件转换成数组文件。见下面的程序。<br>

          &nbsp;&nbsp;&nbsp; 用BCB建立一个控制台应用程序。把它存为TABTOHEX.BPR和TABTOHEX.CPP。然后在TABTOHEX.cpp中添加以下代码:<br>

          #pragma hdrstop<br>

          #include &lt;condefs.h&gt;<br>

          #include&quot;stdio.h&quot;<br>

          #include&quot;stdlib.h&quot;<br>

          #pragma argsused<br>

          int main(int argc, char **argv)<br>

          {<br>

          &nbsp;&nbsp;&nbsp; FILE *tab;<br>

          &nbsp;&nbsp;&nbsp; FILE *hex;<br>

          &nbsp;&nbsp;&nbsp; int i=0;<br>

          &nbsp;&nbsp;&nbsp; unsigned int ch;<br>

          &nbsp;&nbsp;&nbsp; tab=fopen(&quot;ccdos.tab&quot;,&quot;rb&quot;);//打开CCDOS.TAB文件<br>

          &nbsp;&nbsp;&nbsp; hex=fopen(&quot;tab.h&quot;,&quot;wb&quot;);<br>

          &nbsp;&nbsp;&nbsp; fputs(&quot;unsigned char tab[45840]={&quot;,hex);<br>

          &nbsp;&nbsp;&nbsp; fprintf(hex,&quot;\n&quot;);<br>

          &nbsp;&nbsp;&nbsp; for(i=0;i&lt;45840;i++)<br>

          &nbsp;&nbsp;&nbsp; {<br>

          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(i%20==0)<br>

          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>

          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(hex,&quot;\n&quot;);<br>

          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>

          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch=fgetc(tab);<br>

          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(hex,&quot;0x%x\x2c&quot;,ch);//把码表文件转换为数组文件<br>

          &nbsp;&nbsp;&nbsp; }<br>

          &nbsp;&nbsp;&nbsp; fputs(&quot;0xff};&quot;,hex);<br>

          &nbsp;&nbsp;&nbsp; fcloseall();<br>

          &nbsp;&nbsp;&nbsp; return 0;<br>

          }<br>

          然后编译并执行这个程序,得到TAB.H文件。<br>

          &nbsp;&nbsp;&nbsp; 第三步:在BCB3.0中新建一个标准的应用程序。添加一个TButton组件:Button1添加一个TRichEdit组件:RichEdit1适当调整它们的大小与位置。然后在Unit1.cpp中添加下面的代码:<br>

          #include &lt;vcl.h&gt;<br>

          #pragma hdrstop<br>

          #include &quot;Unit1.h&quot;<br>

          #include&quot;tab.h&quot;//把头文件TAB.H包含在内<br>

          //---------------------------------------------------------------------------<br>

          #pragma package(smart_init)<br>

          #pragma resource &quot;*.dfm&quot;<br>

          TForm1 *Form1;<br>

          //---------------------------------------------------------------------------<br>

          __fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner)<br>

          {<br>

          }<br>

          //---------------------------------------------------------------------------<br>

          void __fastcall TForm1::FormCreate(TObject *Sender)<br>

          {<br>

          &nbsp;&nbsp;&nbsp; RichEdit1-&gt;Lines-&gt;LoadFromFile(&quot;c:\\BIG5.TXT&quot;);//读取一个BIG5码的文件,可自己的情况设定<br>

          }<br>

          //---------------------------------------------------------------------------<br>

          void __fastcall TForm1::Button1Click(TObject *Sender)<br>

          {<br>

          &nbsp;&nbsp;&nbsp; unsigned long i,address;//把BIG5码转换为GB码<br>

          &nbsp;&nbsp;&nbsp; unsigned char ch1,ch2;<br>

          &nbsp;&nbsp;&nbsp; char *x;<br>

          &nbsp;&nbsp;&nbsp; x=RichEdit1-&gt;Lines-&gt;GetText();<br>

          &nbsp;&nbsp;&nbsp; i=0;<br>

          &nbsp;&nbsp;&nbsp; while(x[i]!='\0')<br>

          &nbsp;&nbsp;&nbsp; {<br>

          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch1=x[i];<br>

          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ch1&gt;=0xa1)<br>

          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>

          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ch2=x[i+1];<br>

          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ch2&gt;=0x40&amp;&amp;ch2&lt;=0x7e)<br>

          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>

          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

          address=ch1*314+ch2*2-33010;<br>

          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

          x[i]=tab[address];<br>

          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

          x[i+1]=tab[address+1];<br>

          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>

          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(ch2&gt;=0xa1&amp;&amp;ch2&lt;=0xfe)<br>

          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>

          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

          address=ch1*314+ch2*2-33078;<br>

          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

          x[i]=tab[address];<br>

          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 

          x[i+1]=tab[address+1];<br>

          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>

          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i+=2;<br>

          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>

          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>

          &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i++;<br>

          &nbsp;&nbsp;&nbsp; }<br>

          &nbsp;&nbsp;&nbsp; RichEdit1-&gt;Lines-&gt;Text=x;<br>

          &nbsp;&nbsp;&nbsp; RichEdit1-&gt;SetFocus();<br>

          &nbsp;&nbsp;&nbsp; RichEdit1-&gt;SelStart = 0;<br>

          }<br>

          &nbsp;&nbsp;&nbsp; 编译并执行它,首先你会看到RichEdit1中的BIG5码文件显示为乱码。按一下Button1,这时,你就会看到RichEdit1中的乱码变成了正常的汉字。好了,现在你自己编的软件也可以支持BIG5码了,是不是感觉更专业一些。GB-&gt;BIG5的转换方法也是类似的,有兴趣的朋友可以给我来信。最后,祝大家龙年愉快。本程序在WIN97,BCB3.0下编译通过。</p>

    </td>

    </tr>

  </table>

 

</div>

</BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -