百万火急,求简繁转换的实现,做了好久都没有成功!(10分)

  • 主题发起人 zpselect
  • 开始时间
这样啊!
我改为:
Font.Name := 'Ш蔨';
Font.Charset := CHINESEBIG5_CHARSET;
试一下!
 
改为:
我改为:
Font.Name := 'Ш蔨';
Font.Charset := CHINESEBIG5_CHARSET;
Label2.Caption := GBChs2Cht(Label2.Caption);
显示还是乱码!
真的好急啊,没有人成功做过这样的程序么?
 
我们公司都是多语言环境的,留下Email,我给你个例子
 
那太谢谢你了!
zpselect@126.com
 
超级牛X:
你给的东东没有源码啊!可不可以给转换的源码啊!
 
此已实现,可联系QQ 16187001,可发示例给你
实现的功能:
1.繁简体转换功能
在简体下编译的程序不用任何修改,就可以在繁体下运行, 不用附加的INI或语言资源文件,只要一个EXE程序就可以了(在下是在DELPHI读取EXE中的控件属性时将之转换,这一点是其它繁简转换技术所不能及的,目前所知只此一家,哈哈)
当然在繁体下编译的程序不用任何修改也可在简体上来运行
2.多语言功能
可在程序运行时动态增加语言,切换语言.
 
我的程序是一个附加程序,即用的是:DLL
 
这个问题,真的好难!那么多的方法没有一个可以!
 
我发给你的程序就是用的我回复的代码,你仔细看,繁体有2种内码,你都试过了吗?
还有,翻译的时候要以big5作为基本语言,因为big5字库字数多,明白吗?
 
你给发了两个附件:一个是Floyd Chen.vcf文件,一个是bin.rar文件,bin.rar文件,我也不知道是什么文件,不是Pas文件,delphi打不开!
 
我刚才用GBToBig5这一函数在繁体系统下面进行测试,代码如下:
procedure TForm1.FormCreate(Sender: TObject);
var
i: integer;
begin
self.Font.Name := '新細明體';
self.Font.Charset := CHINESEBIG5_CHARSET;
self.Font.Size := 10;
self.Font.Color := clRed;
Memo1.Text := GBToBig5(Memo1.Text);
Label1.Caption := GBToBig5(Label1.Caption);

GroupBox1.Caption := GBToBig5(GroupBox1.Caption);
BitBtn1.Caption := GBToBig5(BitBtn1.Caption);
for i := 0 to TreeView1.Items.Count - 1do
TreeView1.Items.Text := GBToBig5(TreeView1.Items.Text);
TreeView1.FullExpand;
Label2.Caption:=GBChs2Cht(Label2.Caption);
end;
结果如下:
TreeView1.Items.text可以转为繁体字,Lable1.caption ,Lable2.caption ,GroupBox1.caption,
BitBtn1.Caption这个的值为乱码!
请问有什么方法解决没有?
 
如果bitbtn1的為亂碼,你檢查一下該partfont是否為true.也就是是否跟窗體的一樣,如果他的還是bg的,那當然是不行的啦!
 
默认就是true啊,没有改过!
 
还有别的什么方法没有?
 
都急挺久了,最好的方法就是找个对照表替换。
 
楼主的问题:
1、楼上 超级牛X 说的对,繁体系统是用Big5内码,要用GbToBig5和Big5ToGb转换。
2、至于为什么Caption转换为乱码的原因我开头就写出代码了,楼主还执迷不悟。
var
tmpCap: string;
Len: Integer;
begin
Len := Label1.GetTextLen;
SetString(tmpCap, PChar(nil), Len);
Label1.GetTextBuf(Pointer(tmpCap), Len + 1);
Label1.SetTextBuf(PChar(GB2Big5(tmpCap)));
 
给出我在一个项目中使用的代码,在简体、繁体环境下均测试过,楼主仔细参考。
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 sFormdo
begin
for i := 0 to ComponentCount - 1do
begin
TmpComp := Components;
//控件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 TComboBoxdo
begin
Index := ItemIndex;
for j := 0 to Items.Count - 1do
Items[j] := TranLanguage(Items[j], SrcLan, DesLan);
ItemIndex := Index;
end;
end;

if TmpComp is TLabeledEdit then
begin
with TmpComp as TLabeledEditdo
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.
 
TO:nicai_wgl:
你给的
var
tmpCap: string;
Len: Integer;
begin
Len := Label1.GetTextLen;
SetString(tmpCap, PChar(nil), Len);
Label1.GetTextBuf(Pointer(tmpCap), Len + 1);
Label1.SetTextBuf(PChar(GB2Big5(tmpCap)));
我也在繁体下测试过,也是乱码!
 
LZ为什么还不醒悟呢
繁体有两种内码BIG5和GBK
简体是GB2312
其中,BIG5字库字数多,GB2312字数少,因此可能一个GB2312的字对应2个以上BIG5的字,但是反过来一个BIG5字转换成GB2312却是唯一的
所以,我们应该以BIG5为基础语言,需要在GB2312下面看的时候,将BIG5翻译成GB2312
这样,就不会出现“中?人民共和?”这样的现象了
 
超级牛X:
我求你了,你到底有没有明白我的意思啊,
var
tmpCap: string;
Len: Integer;
begin
Len := Label1.GetTextLen;
SetString(tmpCap, PChar(nil), Len);
Label1.GetTextBuf(Pointer(tmpCap), Len + 1);
Label1.SetTextBuf(PChar(GB2Big5(tmpCap)));
上面的代码,是运行在繁体操作系统下测试为乱码!不是在简体操作系统下面测试的!
再问超级牛X一句,上面这几名代码是这么写么?GB2Big5
 
顶部