简繁体转换问题

                            问题:简繁体转换问题? ( 积分:30, 回复:62, 阅读:878 )
分类:控件 - 使用 ( 版主:amo, cAkk )  
来自:siaosa, 时间:2006-8-3 16:02:00, ID:3524443 [显示:小字体 | 大字体]  

我用GBToBig5函数转换ShowMessage(GBToBigt('简体字'))能够正常将简体转换成繁体显示,但转换Label1.Caption乱码,转换过程如下
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(GBToBigt('这是一测试')               //在繁体系统中正常显示繁体字
  Label1.Caption:=GBToBig5(Label1.Caption);        //Label1在繁体系统中乱码
end;
这是为什么?


简体转换繁体函数
function GBToBig5(GBStr : String): AnsiString;
{进行GB转BIG5内码}
var
  Len: Integer;
  pGBCHTChar: PChar;
  pGBCHSChar: PChar;
  pUniCodeChar: PWideChar;
  pBIG5Char: PChar;
begin
  pGBCHSChar := PChar(GBStr);
  Len := MultiByteToWideChar(936,0,pGBCHSChar,-1,nil,0);
  GetMem(pGBCHTChar,Len*2+1);
  ZeroMemory(pGBCHTChar,Len*2+1);
  //GB CHS -> GB CHT
  LCMapString($804,LCMAP_TRADITIONAL_CHINESE,pGBCHSChar,-1,pGBCHTChar,Len*2);
  GetMem(pUniCodeChar,Len*2);
  ZeroMemory(pUniCodeChar,Len*2);
  //GB CHT -> UniCode
  MultiByteToWideChar(936,0,pGBCHTChar,-1,pUniCodeChar,Len*2);
  Len := WideCharToMultiByte(950,0,pUniCodeChar,-1,nil,0,nil,nil);
  GetMem(pBIG5Char,Len);
  ZeroMemory(pBIG5Char,Len);
  //UniCode -> Big5
  WideCharToMultiByte(950,0,pUniCodeChar,-1,pBIG5Char,Len,nil,nil);
  Result := String(pBIG5Char);
  FreeMem(pBIG5Char);
  FreeMem(pGBCHTChar);
  FreeMem(pUniCodeChar);
end;  


来自:weiliu, 时间:2006-8-3 16:35:53, ID:3524514
不要用什么控件了,自己在INI文件里分别对简繁进行定义吧。
实在要用控件,试试TsiLang Components Suite   


来自:cqwty, 时间:2006-8-4 16:51:20, ID:3525552
weiliu:自己在ini文件里面怎么定义啊,说一下撒,不要只是提个头撒,嘿嘿  


来自:siaosa, 时间:2006-8-6 23:21:04, ID:3525576
procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text:='这是一个简体字';
  Edit1.Text:=GBToBig5(Edit1.Text);                //在繁体系统中正常显示繁体字
  ShowMessage(GBToBigt('这是简体字'));             //在繁体中能够正确显示

  Label1.Caption:=GBToBig5(Label1.Caption);        //在繁体系统中乱码
  Edit2.Text:=GBToBig5(Edit2.Text);                //在繁体系统中乱码
end;
这是为什么?


找不到控件自己找了个简体转换繁体函数
function GBToBig5(GBStr : String): AnsiString;
{进行GB转BIG5内码}
var
  Len: Integer;
  pGBCHTChar: PChar;
  pGBCHSChar: PChar;
  pUniCodeChar: PWideChar;
  pBIG5Char: PChar;
begin
  pGBCHSChar := PChar(GBStr);
  Len := MultiByteToWideChar(936,0,pGBCHSChar,-1,nil,0);
  GetMem(pGBCHTChar,Len*2+1);
  ZeroMemory(pGBCHTChar,Len*2+1);
  //GB CHS -> GB CHT
  LCMapString($804,LCMAP_TRADITIONAL_CHINESE,pGBCHSChar,-1,pGBCHTChar,Len*2);
  GetMem(pUniCodeChar,Len*2);
  ZeroMemory(pUniCodeChar,Len*2);
  //GB CHT -> UniCode
  MultiByteToWideChar(936,0,pGBCHTChar,-1,pUniCodeChar,Len*2);
  Len := WideCharToMultiByte(950,0,pUniCodeChar,-1,nil,0,nil,nil);
  GetMem(pBIG5Char,Len);
  ZeroMemory(pBIG5Char,Len);
  //UniCode -> Big5
  WideCharToMultiByte(950,0,pUniCodeChar,-1,pBIG5Char,Len,nil,nil);
  Result := String(pBIG5Char);
  FreeMem(pBIG5Char);
  FreeMem(pGBCHTChar);
  FreeMem(pUniCodeChar);
end;  


来自:dcs_dcs, 时间:2006-8-4 17:24:32, ID:3525603
搞什么繁简转换..
搞点中英文转换还有点意思  


来自:siaosa, 时间:2006-8-4 18:22:20, ID:3525684
To:dcs_dcs
  程序需要运行在简繁体系统中才有这样的要求的  


来自:鳄鱼先生, 时间:2006-8-4 18:42:50, ID:3525708
最好使用外部的语言包,因为用GB2Big5等,不能把一些本地语言转化.  


来自:siaosa, 时间:2006-8-4 18:50:25, ID:3525716
To:鳄鱼先生
  只要将Label.Caption转换成Big5码就行了,问题是转换后,在繁体系统中Label.Caption还是显示乱码  


来自:鳄鱼先生, 时间:2006-8-4 18:57:50, ID:3525732
把Font 的Script 改为繁体的.  


来自:siaosa, 时间:2006-8-4 20:38:25, ID:3525797
Font 没有Script属性  


来自:paulcross, 时间:2006-8-4 21:49:29, ID:3525825
用delphi 2006   


来自:sdssoft, 时间:2006-8-4 23:54:41, ID:3525873
这个应该是delphi得问题,它在存储窗口得时候是采用ansi码存储得!当在繁体环境下面读取label.caption得时候就已经错误了!所以你翻译出来同样是乱码!所以你可以采用TNtware得控件(支持unicode),它存储得时候是以unicode存储得!所以它不会乱码!!!  


来自:siaosa, 时间:2006-8-5 7:31:57, ID:3525928
To:  paulcross
D2006一样会乱码  


来自:siaosa, 时间:2006-8-5 8:26:57, ID:3525941
To:sdssoft
  不想用TNtWare,要将程序中所有的VCL的Label控件都要换成TNtWare的,太多了,有没有其它的办法可以解决?  例如直接将Caption属性的值转码?  


来自:sdssoft, 时间:2006-8-5 14:48:14, ID:3526224
我也不想换,但最后还是换了,否则你就到繁体得环境下面去编译吧!!!  


来自:郭玉梁, 时间:2006-8-6 16:25:57, ID:3526830
明天安装一个繁体的系统测试一下,我也要碰到这个问题,肯定不会用其它方法,就用你那个方法了,肯定有办法[:D]  


来自:冰力不足, 时间:2006-8-6 23:51:37, ID:3527007
思路 
const UNI: array[,] of word
($0000,$0000),
($0000,$0000),
($0000,$0000),
($0000,$0000),
($0000,$0000),
($0000,$0000),
($0000,$0000),
($842C,$0000),
($0000,$0000),
($0000,$0000),
($0000,$0000),
($0000,$0000),

............


function 简转繁;
function 繁转简;  


来自:鳄鱼先生, 时间:2006-8-7 8:04:20, ID:3527037
Font 的字符集,那天用的是英文的系统,看到的是Script  


来自:siaosa, 时间:2006-8-7 10:48:09, ID:3527253
To:郭玉梁
    谢谢啦!另外如果有这样的简繁自动转换功能则更好:不论用户用简体还是繁体系统,系统能够自动显示简繁体,并且连数据感知控件也能够自动转换并正确存储.

To:鳄鱼先生
  试了不行的  


来自:郭玉梁, 时间:2006-8-7 13:17:30, ID:3527426
这个问题我也要解决的,感觉应该可以解决
数据感知控件就要不要管他们了,那个不太好做,或者效率太低了
只要静态数据能支持简繁就可以了  


来自:siaosa, 时间:2006-8-7 16:04:43, ID:3527685
To:郭玉梁
  解决了告诉我一下.
  现在许多的软件都可以实现:不论是简繁体操作系统,用户存储在数据库中的数据都可以正确的显示并且正确存储.我想可能是他们修改了DataSet的什么方法或者数据感知控件  


来自:WickedladII, 时间:2006-8-7 18:03:51, ID:3527832
--------------------------------------------------------------------------------
 谢谢啦!另外如果有这样的简繁自动转换功能则更好:不论用户用简体还是繁体系统,系统能够自动显示简繁体,并且连数据感知控件也能够自动转换并正确存储.
--------------------------------------------------------------------------------

当然可以,用delphi本身的多语言支持就够了,甚至可以做到在程序中随时切换所使用语言(如简体、繁体、英文等)而不用重新启动程序或机器,也不管当前处于何种操作系统。

根本无需额外编程,你要做的就是打字,打字。。。  


来自:siaosa, 时间:2006-8-7 20:15:36, ID:3527921
To:WickedladII
  能说说具体怎么做吗?  


来自:boldfake, 时间:2006-8-9 7:10:49, ID:3529133
label.fint.charset要設置成繁體,然後再轉換成繁體才能正確顯示,
或者使用tnt控件,unicode的,可以顯示多語言,不會亂碼的  


来自:siaosa, 时间:2006-8-9 7:28:14, ID:3529136
To:boldfake
  将charset要設置成繁體也一样会乱码的
  程序太多了,如果再一个一个的更换控件不知道要搞到什么时候  


来自:samy_ywj, 时间:2006-8-9 11:55:30, ID:3529531
function GB_BIG5(Value: string; bFull: Boolean = True): string;
var
  Len: Integer;
  s1, s2: string;
  ws: WideString;
begin
  Result := '';
  Len := MultiByteToWideChar(936, 0, PChar(Value), -1, nil, 0);
  SetLength(s1, Len * 2 + 1);
  Len := LCMapString($0804, LCMAP_TRADITIONAL_CHINESE, PChar(Value), -1,
    PChar(s1), Len * 2);
  if bFull then
  begin
    SetLength(ws, Len);
    MultiByteToWideChar(936, 0, PChar(s1), -1, PWideChar(ws), Len);
    Len := WideCharToMultiByte(950, 0, PWideChar(ws), -1, nil, 0, nil, nil);
    SetLength(s2, Len);
    Len := WideCharToMultiByte(950, 0, PWideChar(ws), -1, PChar(s2),
      Len, nil, nil);
    Result := Copy(s2, 1, Len);
  end
  else
    Result := Copy(s1, 1, Len);
  Result := Trim(Result);
end;

function BIG5_GB(Value: string; bFull: Boolean = True): string;
var
  Len: Integer;
  s1, s2: string;
  ws: WideString;
begin
  if bFull then
  begin
    Len := MultiByteToWideChar(950, 0, PChar(Value), -1, nil, 0);
    SetLength(ws, Len + 1);
    MultiByteToWideChar(950, 0, PChar(Value), -1, PWideChar(ws), Len);
    Len := WideCharToMultiByte(936, 0, PWideChar(ws), -1, nil, 0, nil, nil);
    SetLength(s1, Len + 1);
    SetLength(s2, Len + 1);
    WideCharToMultiByte(936, 0, PWideChar(ws), -1, PChar(s1), Len, nil, nil);
    Len := LCMapString($0804, LCMAP_SIMPLIFIED_CHINESE, PChar(s1), -1, PChar(s2), Len);
    Result := Copy(s2, 1, Len);
  end
  else
  begin
    Len := MultiByteToWideChar(936, 0, PChar(Value), -1, nil, 0);
    SetLength(s1, Len * 2 + 1);
    Len := LCMapString($0804, LCMAP_SIMPLIFIED_CHINESE, PChar(Value), -1, PChar(s1), Len * 2);
    Result := Copy(s1, 1, Len);
  end;
  Result := Trim(Result);
end;
  


来自:siaosa, 时间:2006-8-9 14:30:08, ID:3529764
To:samy_ywj  还是不行,一样的乱码  
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(GB_Bigt('这是一测试'));             //在繁体系统中正常显示繁体字
  Label1.Caption:=GB_Big5(Label1.Caption);        //Label1在繁体系统中乱码
end;
  


来自:samy_ywj, 时间:2006-8-9 17:26:27, ID:3530124
如果你是繁体系统中,bFull=True,简体系统中bFull=False
我在繁体系统中已经试过的,没有问题我用的是Win2000Pro繁体版
Label没有设置相应的繁体字体。
所以才会出现你上面所说的情况  


来自:samy_ywj, 时间:2006-8-9 17:27:49, ID:3530126
procedure TfrmCBaseForm.FormCreate(Sender: TObject);
begin
  if SysLocale.DefaultLCID=2052 then
  begin
    Font.Name := '宋体';
    Font.Size := 9;
    Font.Charset := GB2312_CHARSET;
  end
  else if SysLocale.DefaultLCID=1028 then
  begin
    Font.Name := '細明體';
    Font.Size := 9;
    Font.Charset := CHINESEBIG5_CHARSET;
  end
  else
  begin
    Font.Name := 'Tahoma';
    Font.Size := 9;
    Font.Charset := ANSI_CHARSET;
  end;
end;
  


来自:冰力不足, 时间:2006-8-9 17:30:50, ID:3530135
很简单的问题 动手做一做 搜一搜 就出来了 不行的话到台湾那些垃圾论坛找找 N年前早就有了  


来自:samy_ywj, 时间:2006-8-9 17:33:02, ID:3530138
to siaosa
http://idc.9e3.com/web/samy_ywj
看看在你的繁体系统中行不行  


来自:siaosa, 时间:2006-8-9 22:43:08, ID:3530331
To:samy_ywj
  你是在简体环境下建好工程,编译完成,然后再到繁体下使用吗?我使用的是XP系统,按理说XP系统对文字的支持应该比W2K更好才对
  
    


来自:samy_ywj, 时间:2006-8-10 11:07:38, ID:3530731
对的。我在简体2003的系统下也编译过,没有问题  


来自:willing66, 时间:2006-8-10 12:48:13, ID:3530882
我用是samy_ywj提供的程序,要简体Win2K下也没问题。  


来自:农民工, 时间:2006-8-10 13:43:05, ID:3530940
俺也遇到和siaosa一样的问题,
to samy_ywj我下了您的系统在繁体Win2000pro下装起来,有2个地方是乱码的。
其余的地方都是对的,不知道您是怎么做到的?  


来自:samy_ywj, 时间:2006-8-10 17:18:00, ID:3531314
哪些地方是错的呢?  


来自:samy_ywj, 时间:2006-8-10 17:20:36, ID:3531317
QQ:330154262  


来自:农民工, 时间:2006-8-11 13:29:35, ID:3532177
to siaosa 其实你的问题已经解决了
你只需在转换前再加一句Label1.Caption:='这是一测试'就解决了,这得感谢samy_ywj兄,
samy_ywj兄,到非技术区来领分  


来自:siaosa, 时间:2006-8-11 16:39:39, ID:3532498
To:农民工
  没有解决

  如果在简体系统设计时已经指定了Caption的值,它的值为任一中文
  那么你在繁体系统再执行Label1.Caption:=GB_BIG5(Label1.Caption) 会乱码的  


来自:农民工, 时间:2006-8-11 17:21:40, ID:3532587
'如果在简体系统设计时已经指定了Caption的值,它的值为任一中文'
Caption的值应该在代码中指定,
Label1.Caption:='这是一测试'-----简体代码中的简体字
Label1.Caption:=GB_BIG5(Label1.Caption,true) 
你看你上面的代码,其实你已经解决了  


来自:siaosa, 时间:2006-8-13 10:45:17, ID:3533547
To:农民工
  我现在很多表单上的Label控件的Caption属性,都是在设计期间在Object Inspector窗口中设定的,不是在代码中设定的,如果一个个重新在代码窗口中指定要花很多时间, 我现在想找一个程序能够用代码将在Object Inspector窗口中设定的Caption转换为繁体字.  


来自:zhangyunkk, 时间:2006-8-14 17:49:47, ID:3534809
我现在也遇到了  siaosa  一样的问题啊  也是简体XP转到 繁体 2000 时  Label.Caption出现乱码,急切的想知道解决的方法
    


来自:lzgui, 时间:2006-8-14 19:14:57, ID:3534864
一般來說caption 比較很處理,簡繁字可能內碼不一樣,不過你如注意一下你的font 有意想不到的驚喜。  


来自:zhangyunkk, 时间:2006-8-14 20:15:29, ID:3534908
To:lzgui
  可不可以说清楚点啊!把Font设为什么 可以在简体系统中是显示简体字,繁体系统中显示的为繁体字?  


来自:WickedladII, 时间:2006-8-16 22:11:03, ID:3535553
子曾经曰过,可以不编程实现。。。为什么放着现成的东西不用,自己去瞎折腾。。。真白瞎了Delphi的那些设计师。。。  


来自:郭玉梁, 时间:2006-8-16 11:55:49, ID:3536524
因为现成的并不好用  


来自:WickedladII, 时间:2006-8-16 22:07:08, ID:3537059
Delphi自带的国际语言支持功能其实已相当完善,不被人了解偶想可能是由于它的帮助系统实在过于简陋,偶曾经用它实现了一个软件(主语言为简体)到澳洲(英文操作系统)与台湾(繁体操作系统)的发布,无论用户使用何种操作系统,程序启动时都可以自动给出相对应的语言界面,而在程序运行时亦可以动态切换使用的语言(不必重新启动)。

至于制作的过程,除了下拉框等特殊控件中的文本需要做一些额外处理,其它的就是填填空,点点鼠标,而无需在代码窗口中重写代码。另外,即使两种语言对译产生的文本长度略有不同(比如说汉语与英文),你也可以很方便的对相应的语言界面分别修改,因为它们所对应的窗体是独立的。

简繁内码转换,偶用的是东方网神GB2BIG.EXE,支持对剪贴板操作,挺方便的。偶是在《深度历险》一书的代码光盘中发现的。  


来自:郭玉梁, 时间:2006-8-16 20:08:06, ID:3537101
楼上的方法地球人都知道,
不过这个对于方法对于我们一锅两制下的情况并不是个好的解决方案,只需要转换内码就可以了,没必要那么麻烦。我这没有繁体windows哪位给个iso?  


来自:农民工, 时间:2006-8-17 14:15:50, ID:3537787
呵呵,郭同志,俺有,要怎么给你?  


来自:郭玉梁, 时间:2006-8-17 15:18:28, ID:3537875
qq传给俺吧,20341547  


来自:zhangyunkk, 时间:2006-8-17 17:05:32, ID:3538065
To 农民工:
  可以傳一個給我嗎?  Email:zhang_yunkk@163.com  謝謝﹗  


来自:zhangyunkk, 时间:2006-8-19 10:28:31, ID:3539479
To 农民工:
 有沒有傳給我﹐如果傳過來了﹐可以在這通知我下啊﹗?謝謝[:)]  


来自:siaosa, 时间:2006-8-19 11:07:34, ID:3539500
'  


来自:lsglishiguang, 时间:2006-8-19 11:18:45, ID:3539530
1、在设计FORM时,记得将所有控件的font.Chatset属性设为Default_Chatset。
2、将所以原代码COPY一份出来,准备做繁体软件的原代码。此步是为安全着想。
3、将所有dcu文件删除。
4、用一个字体转换工具,如地球村等,将pas文件由简体转为繁体。Pas文件的格式等同于TXT文件,所以在转换的过程中不会出现任何错误。如果你写的pascal语言中,未用到中文字,则无需转换。
5、在繁体WINDOWS操作系统下,用Delphi6对你的软件完全重新编译一次,生成的新软件就是繁体的软件了,没有一点运行上的问题。    


来自:zhangyunkk, 时间:2006-8-19 11:29:15, ID:3539549
To:lsglishiguang
  我就是不想在簡體系統編譯﹐又要在繁體系統編譯
  我想就在簡體下編譯﹐用戶可以在簡體和繁體上用啊﹗  


来自:农民工, 时间:2006-8-21 10:28:20, ID:3540476
to zhangyunkk
这几天俺这里的网络老是断线,发邮箱恐怕吃不消啊,好几百兆.  


来自:WickedladII, 时间:2006-8-21 15:29:41, ID:3540786
------------------------------------------------------------------------
To:lsglishiguang
  我就是不想在簡體系統編譯﹐又要在繁體系統編譯
  我想就在簡體下編譯﹐用戶可以在簡體和繁體上用啊﹗
------------------------------------------------------------------------

可以的,偶就是在一个操作系统下作业,所有的编写、调试、编译都在一个语言系统中进行,即使后面的测试(多语种分别测试),也是在本机进行,一直到最后分发程序,整个开发过程无需安装另外的操作系统或使用其他机子(相对)。  


来自:rogue, 时间:2006-8-21 15:02:28, ID:3540798
    Font.Charset := CHINESEBIG5_CHARSET;
----------->

Charset 和字体的关系,
讨论得好复杂喔  


来自:siasa, 时间:2006-8-21 16:00:53, ID:3540886
上面已经有人正解了,ansi和unicode的问题。  


来自:qis2000, 时间:2006-8-21 16:05:53, ID:3540894
参考看看
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3185897  


来自:boyinsky, 时间:2006-8-22 16:22:25, ID:3541912
貌似如果只要lable.capation需要转换的话,可以用图片吧.很简单哦,呵呵  


来自:nicai_wgl, 时间:2006-8-24 15:41:48, ID:3544200
我以前也遇到这个问题,已解决,以下是代码供楼主参考:
unit Cm_Language;

interface

uses
  Windows, Forms, Classes, StdCtrls, Menus, Controls, ExtCtrls;

type
  TLanguage = (
    tNone,
    tEnglish,
    tGBChs,
    tBig5,
    tGBCht
    );
    
  TCaptionControl = class(TControl)
  public
    property Caption;
  end;

  function GetSysDefaultLg: TLanguage;
  function Big5ToGB(BIG5Str: string): AnsiString;
  function GBToBig5(GBStr: string): AnsiString;
  function GBChtToChs(GBStr: string): AnsiString;
  function GBChsToCht(GBStr: string): AnsiString;

  function TranLanguage(SrcStr: string; SrcLan, DesLan: TLanguage): string;
  procedure SetFormLanguage(sForm: TForm; SrcLan, DesLan: TLanguage);

implementation

//获取操作系统默认语言
// -1、无效 0、英语 1、简体中文 3、繁体中文
function GetSysDefaultLg: TLanguage;
var
  LangID: Integer;
begin
  Result := tNone;
  LangID := GetSystemDefaultLangID;
  if LangID = ((SUBLANG_ENGLISH_US shl 10) or LANG_ENGLISH) then
    Result := tEnglish //美国英语
  else if LangID = ((SUBLANG_CHINESE_SIMPLIFIED shl 10) or LANG_CHINESE) then
    Result := tGBChs //简体中文
  else if LangID = ((SUBLANG_CHINESE_TRADITIONAL shl 10) or LANG_CHINESE) then
    Result := tBig5; //繁体中文
end;

function Big5ToGB(BIG5Str: string): AnsiString;
{进行big5转GB内码}
var
  Len: Integer;
  pBIG5Char: PChar;
  pGBCHSChar: PChar;
  pGBCHTChar: PChar;
  pUniCodeChar: PWideChar;
begin
  //String -> PChar
  pBIG5Char := PChar(BIG5Str);
  Len := MultiByteToWideChar(950, 0, pBIG5Char, -1, nil, 0);
  GetMem(pUniCodeChar, Len * 2);
  ZeroMemory(pUniCodeChar, Len * 2);
  //Big5 -> UniCode
  MultiByteToWideChar(950, 0, pBIG5Char, -1, pUniCodeChar, Len);
  Len := WideCharToMultiByte(936, 0, pUniCodeChar, -1, nil, 0, nil, nil);
  GetMem(pGBCHTChar, Len * 2);
  GetMem(pGBCHSChar, Len * 2);
  ZeroMemory(pGBCHTChar, Len * 2);
  ZeroMemory(pGBCHSChar, Len * 2);
  //UniCode->GB CHT
  WideCharToMultiByte(936, 0, pUniCodeChar, -1, pGBCHTChar, Len, nil, nil);
  //GB CHT -> GB CHS
  LCMapString($804, LCMAP_SIMPLIFIED_CHINESE, pGBCHTChar, -1, pGBCHSChar, Len);
  Result := string(pGBCHSChar);
  FreeMem(pGBCHTChar);
  FreeMem(pGBCHSChar);
  FreeMem(pUniCodeChar);
end;

function GBToBig5(GBStr: string): AnsiString;
{进行GB转BIG5内码}
var
  Len: Integer;
  pGBCHTChar: PChar;
  pGBCHSChar: PChar;
  pUniCodeChar: PWideChar;
  pBIG5Char: PChar;
begin
  pGBCHSChar := PChar(GBStr);
  Len := MultiByteToWideChar(936, 0, pGBCHSChar, -1, nil, 0);
  GetMem(pGBCHTChar, Len * 2 + 1);
  ZeroMemory(pGBCHTChar, Len * 2 + 1);
  //GB CHS -> GB CHT
  LCMapString($804, LCMAP_TRADITIONAL_CHINESE, pGBCHSChar, -1, pGBCHTChar, Len * 2);
  GetMem(pUniCodeChar, Len * 2);
  ZeroMemory(pUniCodeChar, Len * 2);
  //GB CHT -> UniCode
  MultiByteToWideChar(936, 0, pGBCHTChar, -1, pUniCodeChar, Len * 2);
  Len := WideCharToMultiByte(950, 0, pUniCodeChar, -1, nil, 0, nil, nil);
  GetMem(pBIG5Char, Len);
  ZeroMemory(pBIG5Char, Len);
  //UniCode -> Big5
  WideCharToMultiByte(950, 0, pUniCodeChar, -1, pBIG5Char, Len, nil, nil);
  Result := string(pBIG5Char);
  FreeMem(pBIG5Char);
  FreeMem(pGBCHTChar);
  FreeMem(pUniCodeChar);
end;

function GBChtToChs(GBStr: string): AnsiString;
{进行GBK繁体转简体}
var
  Len: Integer;
  pGBCHTChar: PChar;
  pGBCHSChar: PChar;
begin
  pGBCHTChar := PChar(GBStr);
  Len := MultiByteToWideChar(936, 0, pGBCHTChar, -1, nil, 0);
  GetMem(pGBCHSChar, Len * 2 + 1);
  ZeroMemory(pGBCHSChar, Len * 2 + 1);
  //GB CHS -> GB CHT
  LCMapString($804, LCMAP_SIMPLIFIED_CHINESE, pGBCHTChar, -1, pGBCHSChar, Len * 2);
  Result := string(pGBChsChar);
  //FreeMem(pGBCHTChar);
  FreeMem(pGBCHSChar);
end;

function GBChsToCht(GBStr: string): AnsiString;
{进行GBK简体转繁体}
var
  Len: Integer;
  pGBCHTChar: PChar;
  pGBCHSChar: PChar;
begin
  pGBCHSChar := PChar(GBStr);
  Len := MultiByteToWideChar(936, 0, pGBCHSChar, -1, nil, 0);
  GetMem(pGBCHTChar, Len * 2 + 1);
  ZeroMemory(pGBCHTChar, Len * 2 + 1);
  //GB CHS -> GB CHT
  LCMapString($804, LCMAP_TRADITIONAL_CHINESE, pGBCHSChar, -1, pGBCHTChar, Len * 2);
  Result := string(pGBCHTChar);
  FreeMem(pGBCHTChar);
  //FreeMem(pGBCHSChar);
end;

procedure SetFormLanguage(sForm: TForm; SrcLan, DesLan: TLanguage);
var
  TmpComp: TComponent;
  TmpControl: TControl;
  i, j, Len, Index: Integer;
  TmpCap: string;
begin
  with sForm do
  begin
    for i := 0 to ComponentCount - 1 do
    begin
      TmpComp := Components[i];
      //控件Caption
      if TmpComp is TControl then
      begin
        TmpControl := TmpComp as TControl;
        Len := TmpControl.GetTextLen;
        if Len <> 0 then
        begin
         //-------------------问题所在-----------------------//
          SetString(TmpCap, PChar(nil), Len);
          TmpControl.GetTextBuf(Pointer(TmpCap), Len + 1);
          TmpControl.SetTextBuf(PChar(TranLanguage(TmpCap, SrcLan, DesLan)));
        end;
      end;
      //其他情况
      if TmpComp is TComboBox then
      begin
        with TmpComp as TComboBox do
        begin
          Index := ItemIndex;
          for j := 0 to Items.Count - 1 do
            Items[j] := TranLanguage(Items[j], SrcLan, DesLan);
          ItemIndex := Index;
        end;
      end;

      if TmpComp is TLabeledEdit then
      begin
        with TmpComp as TLabeledEdit do
          EditLabel.Caption := TranLanguage(EditLabel.Caption, SrcLan, DesLan);
      end;
    end;
  end;
end;

function TranLanguage(SrcStr: string; SrcLan, DesLan: TLanguage): string;
begin
  Result := '';
  if SrcLan = DesLan then
  begin
    Result := SrcStr;
    exit;
  end;

  case SrcLan of
    tNone, tEnglish:
      exit;
    tGBChs:
      case DesLan of
        tGBCht:
          Result := GBChsToCht(SrcStr);
        tBig5:
          Result := GBToBig5(SrcStr);
      end;
    tGBCht:
      case DesLan of
        tGBChs:
          Result := GBChtToChs(SrcStr);
        tBig5:
          Result := GBToBig5(SrcStr);
      end;
    tBig5:
      case DesLan of
        tGBChs:
          Result := Big5ToGB(SrcStr);
        tGBCht:
          Result := GBChsToCht(Big5ToGB(SrcStr));
      end;
  end;
end;

end.  


来自:rogue, 时间:2006-8-24 17:09:53, ID:3544371
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3542522

是否可行:奇思异想的简繁双语程序的实现方式,是否可行,如何办到 [300+]

看看我的想法是否能简单实现,是否可行  

 

                                

查看回复