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

  • 主题发起人 zpselect
  • 开始时间
建议你做一个简单的测试程序,先写成手工的按一下按钮才翻译,看看效果
 
超级牛X:
你给一个邮箱给我,我把我做的程序发给你,你看一下就明白了!
 
.......无语了
用GBToBig5测试
var
tmpCap: string;
Len: Integer;
begin
Len := Label1.GetTextLen;
SetString(tmpCap, PChar(nil), Len);
Label1.GetTextBuf(Pointer(tmpCap), Len + 1);
Label1.SetTextBuf(PChar(GBToBig5(tmpCap)));
<<----
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;
 
TO:nicai_wgl:
我一直都用function GBToBig5(GBStr: string): AnsiString;这个函数在测试的!
 
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ComCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
BitBtn1: TBitBtn;
GroupBox1: TGroupBox;
Memo1: TMemo;
TV: TTreeView;
procedure FormCreate(Sender: TObject);
private
function GBToBig5(GBStr: string): AnsiString;
function Big5ToGB(BIG5Str: string): AnsiString;
function GBCht2Chs(GBStr: string): AnsiString;
function GBChs2Cht(GBStr: string): AnsiString;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.dfm}
function TForm1.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 TForm1.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 TForm1.GBCht2Chs(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(pGBCHSChar);
end;

function TForm1.GBChs2Cht(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);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
Len, i: integer;
tmpCap: String;
begin
self.Font.Name := '新細明體';
self.Font.Charset := CHINESEBIG5_CHARSET;
self.Font.Size := 10;
self.Font.Color := clRed;
Len := Label1.GetTextLen;
SetString(tmpCap, PChar(nil), Len);
Label1.GetTextBuf(Pointer(tmpCap), Len + 1);
Label1.SetTextBuf(PChar(GBToBig5(tmpCap)));
Memo1.Text := GBToBig5(Memo1.Text);

GroupBox1.Caption := GBToBig5(GroupBox1.Caption);
BitBtn1.Caption := GBToBig5(BitBtn1.Caption);
for i := 0 to TV.Items.Count - 1do
TV.Items.Text := GBToBig5(TV.Items.Text);
TV.FullExpand;
end;

end.

我的代码是不是和你的是一样的?
 
留个邮箱发你代码。
 
zpselect@126.com
 
TO:nicai_wgl:
  我将给发的unit Cm_Language代码,在繁体系统下测试也为乱码!
procedure TForm1.FormCreate(Sender: TObject);
begin
SetFormLanguage(Form1, tGBCht, tBig5);
end;
另外,你可否把你可以在繁体下实现转换的project代码发给我?
zpselect@126.com
 
TO:nicai_wgl:
我刚才用你给我发的那个[Test(繁体系统)]程序在繁体系统下面进行测试,因为程序中的Lable1.caption本身就是繁体字,即:Label1.caption:='中華人民共和國',所以在繁体下面不会出现乱码,不知你没有试用将Label1.caption改为:'中华人民共和国'进行测试过!
即:在窗体的OnGreate事件里就对Lable1.catpion进行转换?
我在[Test(繁体系统)]程序中,放了一个Label6,其caption为:'数据测试',然后在OnCreate事件里写了如下代码:
procedure TForm1.FormCreate(Sender: TObject);
begin
SetFormLanguage(Self, tGBChs, tBig5);
end;
程序在繁体系统下运行为乱码!,敬请指点,速急!
 
我刚才分别在[Test(繁体系统)]和[Test(简体系统)]两个程序的OnGreate里加了
procedure TForm1.FormCreate(Sender: TObject);
begin
SetFormLanguage(Self, tGBChs, tBig5);
end;
然后将程序在繁体程序下面进行测试,结果是两个程序界面上的Label1.caption:='中华人民共国'显示出来都为乱码!!
不知你明白我的意思没有?
我的意思是:Label1.caption:='中华人民共国'在繁体操作系统下面显示为:'中華人民共和國',即:在程序界面一打开时,自动将简体字转为繁体字!
 
我刚才在繁体下测试了,加不加下面这几行代码,结果都是一样的
self.Font.Name := '新細明體';
self.Font.Charset := CHINESEBIG5_CHARSET;
self.Font.Size := 10;
self.Font.Color := clRed;
 
没有办法了,只有这么做了
Label1.catpion:=GBTOBIG5('中华人民共和国');
这种方法在繁体操作系统下运行显示为正常的繁体字!
这是迫不得已的方法了!
 
难道是字符宽度的问题? 不要用string搞个pchar?
 
pchar也用过啊!
procedure TForm1.FormCreate(Sender: TObject);
var
Len, i: integer;
tmpCap: String;
begin
Len := Label1.GetTextLen;
SetString(tmpCap, PChar(nil), Len);
Label1.GetTextBuf(Pointer(tmpCap), Len + 1);
Label1.SetTextBuf(PChar(GBToBig5(tmpCap)));
end;
 
欢迎各位前来研讨,以解决这个问题!
 
你出错的原因是用了string类型的变量,必须全内存操作才行,我提供的函数你可以采用文件的方式,把简体字放到文件里,直接通过内存读取出来,然后转换,保证没有错误
 
除了把Caption放在ini文件里之外,还有没有别的方法?
 
可以找一些编码表来转换
 
编码表与API方式一样!在进行转换时是乱码!我都试过了!
 
兄弟可能有些没有搞清楚的地方:
汉字内码,具体的说,有如下编码形式:
hz (原来dos下面汉字系统)
gb2312(大陆简体汉字编码,只有简化字)
gbk (windows 系列支持的 汉字,包含部分繁体)
GB18030 (大陆新标准,windows系列必须安装支持包,支持许多繁体字)
Unicode 编码( windows 2000 以上版本)
2000年的GB18030是取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。从汉字字汇上说,GB18030在GB13000.1的20902个汉字的基础上增加了CJK扩展A的6582个汉字(Unicode码0x3400-0x4db5),一共收录了27484个汉字。
CJK就是中日韩的意思。Unicode为了节省码位,将中日韩三国语言中的文字统一编码。GB13000.1就是ISO/IEC 10646-1的中文版,相当于Unicode 1.1。
GB18030的编码采用单字节、双字节和4字节方案。其中单字节、双字节和GBK是完全兼容的。4字节编码的码位就是收录了CJK扩展A的6582个汉字。 例如:UCS的0x3400在GB18030中的编码应该是8139EF30,UCS的0x3401在GB18030中的编码应该是8139EF31。
微软提供了GB18030的升级包,但这个升级包只是提供了一套支持CJK扩展A的6582个汉字的新字体:新宋体-18030,并不改变内码。Windows 的内码仍然是GBK。
big5 (windows 在香港 台湾 澳门 的版本)
实际上目前使用的windows系列内码都是unicode 的,那么所谓简体,繁体的转换,主要是指
同码制之间的转换和不同码制之间的转换,比如同是unicode 的数据中的繁体转换成简体,
还有不同码制之间的转换,比如所谓gbk2big 这样的函数.
windows 本身是 unicode 的,怎么表示 gbk ,big5 这写所谓本地化 代码呢?
稍微有点软 提供的解决方案就是 codepage 即代码页, 所以以前的代码表转换方式,只是将转换的多个步骤简化提高速度,你所给出的是将输入的数据(gbk/big5),通过MultiByteToWideChar转换成为unicode ,再通过unicode 转为 需要的.
你这个程序可能的问题没有问题,问题出在你的两个 label 需要采用不同的字体,比如
label1.fonts.fontname := '宋体';
label2.fonts.fontname := '繁体字体';//
label2.fonts.charset := big5;//字符集,内码,我也没有繁体字库 大概意思吧
label2.caption := gbk2big5(label1.caption);
虽然操作系统支持unicode,但delphi只支持相关代码页的字符集,
明白了吗?
 
顶部