我利用<<function GBtoBIG5(value: string): string;>>實現了將GB>>BIG5的過程,可轉換後確是顯示出亂碼.例   label1.Caption := BIG5toGB(label1.Caption ) ;.在label1.Caption 中顯示亂碼.該如何讓他正常怯換到繁體呢?求教.

解决方案 »

  1.   

    应该是正确转换了,但是你的label1 font charSet是不是仍然使用的是GB_3213??
      

  2.   

    問題解決,感謝.我想請教有沒辦法辨別Caption 中的值是繁體還是簡體以保証我利用何函數轉換?
      

  3.   

    这个,可不好判断,如果你的 font charSet设置的和实际的不符合,就没有办法了
    看微软记事本中'联通'bug(空白记事本,输入简体'联通',保存,打开就乱掉。)就知道,但看字符串就想判断出来是gb/big5就很不容易。
    '联通'的bug就是因为这两个字处于不好判断的区段,导致不能正确显示。
      

  4.   

    如果保证字符和设置font charSet相同,就通过charSet判断吧
      

  5.   

    可是font charSet也是通過字符來判斷的.倒.應為我是要取數據庫的字段值,該字段中有簡體也有繁體.有棒法嗎?
      

  6.   

    font charSet也是通過字符來判斷的
    ------------------
    不是的,他只不过根据你的机器设置,初始个默认值
    //
    给你找了点资料,不一定能行
    ------------------
    编码的定位 
    那么如何定位一个GBK码呢?当我们拿到一个编码时,如何判断是不是一个GBK码,如果是GBK码如何定位它的位置呢? 判断一个GBK码应该比较简单,我们只要根据它的有效范围进行判定即可。如: if 0x81<=ch1<=0xFE and (0x40<=ch2<=0x7E or 0x7E<=ch2<=0xFE): #is gb char 
    这里ch1和ch2分别是一个字符的高字节和低字节。 如何定位(为什么要定位我们在后面讲)?首先介绍一下码表。码表是所有编码放在一起形成的,你可以将其放在文件中(这里讲述的是将编码放在文件中)。我们在存放编码时是将有实际意义的编码放在了一起(因为有一些组合是不存在的),而且是按字节大小的顺序放的。根据GBK的编码范围,我们可以设想一个二维坐标,纵坐标是高字节,横坐标是低字节,每一个交叉点上是一个汉字,占两个字节。这样一行上的汉字个数应该为0xFE-0x40+1-1=190(加1是因为要把0x40也算进去。减1是因为要把7F去掉)。定位时,我们先用高字节减去0x81,得到纵坐标偏移量。用低字节减去0x40得到横坐标偏移量。用纵坐标偏移量乘以每个汉字个数,加上横坐标偏移量就得到汉字的偏移量。再乘以2得到字节的偏移量。那么定位算法为: index=((ch1-0x81)*190+(ch2-0x40)-(ch2/128))*2 
    上面的算法中有-(ch2/128)。这是因为GBK中没有7F码,因此当ch2小于7F时,ch2/128=0,则表示7F没有计算在内。而当ch2大于7F时,ch2/128=1,则表示多算了7F一值,因此要去掉。由于一个汉字有两个字节,故要乘以2。这样我们就得到一个GBK汉字在码表中的字节位置了。 BIG5是香港和台湾地区使用的编码集。它的范围为:高字节从0xA0到0xFE,低字节从0x40到0x7E,和0xA1到0xFE两部分。判断一个汉字是否是BIG5编码,可以如上对字符的编码范围判断即可。如何定位呢?那么也想象所有编码排列为一个二维坐标,纵坐标是高字节,横坐标是低字节。这样一行上的汉字个数:(0x7E-0x40+1)+(0xFE-0xA1+1)=157。那么定位算法分两块,为: if 0x40<=ch2<=0x7E: #is big5 char 
    index=((ch1-0xA1)*157+(ch2-0x40))*2 
    elif 0xA1<=ch2<=0xFE: #is big5 char 
    index=((ch1-0xA1)*157+(ch2-0xA1+63))*2
      

  7.   

    一般是这样辨别的: 1、GBcode的内码的两个字节都是从A0H-FEH之间的; 2、BIGcode的内码的第一个字节是80H-FFH,第二个字节是00H-FFH; 你要浏览全文,看看是否有第二个字节是小于7FH的汉字,如果有的话,一般是BIGcode的。当然也有特殊情况,不过非常少见的。
      

  8.   

    又给你写一段
    //判断big5实现如下
    procedure TForm1.Button1Click(Sender: TObject);
    var i:Integer;
     str:string;
    begin
    str:='該如何讓他正常怯換到繁體呢';
    //str:='能支持互转的软件并不多';
    for i := 1 to length(str) do
      if Not odd(i) then
        if Byte(str[i])<127 then
          showmessage(inttostr(Byte(str[i]))+' 有Big5包含');
    end;