向高手请教:璁㈠崟缂栧彿 怎么转换为 GB2312(50分)

  • 主题发起人 主题发起人 kaida
  • 开始时间 开始时间
K

kaida

Unregistered / Unconfirmed
GUEST, unregistred user!
有人说 璁㈠崟缂栧彿 是 UTF8 编码。但是网上提供的 UTF8<->GB2312 均不能正常转换。
请问该如何将其转换为正常可阅读的编码呢?提供工具或 Delphi 代码进行转换或告知如何对系统(xp)进行设置均可。
 
如果你确定是utf8的, 就肯定可以转化。 试试下面的代码。 我觉得它是big5的。
unit CVCode;

interface
function GBtoBIG5(value: string): string;
function BIG5toGB(value: string): string;

implementation

var
BIG5Order: array[0..14757] of Word;
GBOrder : array[0..8177] of Word;

function GBOffset(value: string): integer;
begin
if length(value) >= 2 then
Result := (Ord(value[1]) - 161) * 94 + (Ord(value[2]) - 161)
else
Result := -1;
end;

function BIG5Offset(value: string): integer;
begin
Result := -1;
if length(value) >= 2 then
begin
if (Ord(value[2]) >= 64) and (Ord(value[2]) <= 126) then
Result := (Ord(value[1]) - 161) * 157 + (Ord(value[2]) - 64);
if (Ord(value[2]) >= 161) and (Ord(value[2]) <= 254) then
Result := (Ord(value[1]) - 161) * 157 + 63 + (Ord(value[2]) - 161);
end
end;

function WordToString(value: Word): string;
begin
Result := Chr(Hi(value)) + Chr(Lo(Value));
end;

function isBIG5(value: string): Boolean;
begin
if (length(value)>=2) then
begin
if (value[1] < #161) then
Result := false
else
if ((value[2] >= #64) and (value[2] <= #126)) or ((value[2] >= #161) and (value[2] <= #254)) then
Result := true
else
Result := false
end
else
Result := false
end;

function isGB(value: string): Boolean;
begin
if (length(value)>=2) then
begin
if (value[1] <= #161) and (value[1] >= #247) then
Result := false
else
if (value[2] <= #161) and (value[2] >= #254) then
Result := false
else
Result := true
end
else
Result := true;
end;

function GBtoBIG5(value: string): string;
var
leng, idx : integer;
tmpStr : string[2];
Offset : integer;
output : string;
begin
output := '';
leng := length(value);
idx := 1;
while idx <= leng do
begin
tmpStr := value[idx]+ value[idx + 1];
if isGB(tmpStr) then
begin
offset:=GBOffset(tmpStr);
if (offset >= 0) and (offset <= 8177) then
begin
output := output + WordToString(GBOrder[offset]);
inc(idx);
end
else
output := output + value[idx] ;
end
else
output := output + value[idx] ;

inc(idx, 1);
end;
Result := output;
end;

function BIG5toGB(value: string): string;
var
leng, idx : integer;
tmpStr : string[2];
output : string;
offset : integer;
begin
output := '';
leng := length(value);
idx := 1;
while idx <= leng do
begin
tmpStr := value[idx]+ value[idx + 1];
if isBIG5(tmpStr) then
begin
offset:=BIG5Offset(tmpStr);
if (offset >= 0) and (offset <= 14757) then
begin
output := output + WordToString(BIG5Order[offset]);
inc(idx);
end
else
output := output + value[idx];
end
else
output := output + value[idx];

inc(idx);
end;
Result := output;
end;

initialization

BIG5Order[0] := $2020;
BIG5Order[1] := $A3AC;
BIG5Order[2] := $A1A2;
BIG5Order[3] := $A1A3;
BIG5Order[4] := $2020;
BIG5Order[5] := $A1A4;
..
..
..
..
BIG5Order[14753] := $2020;
BIG5Order[14754] := $2020;
BIG5Order[14755] := $2020;
BIG5Order[14756] := $2020;
BIG5Order[14757] := $2020;

GBOrder[0] := $2020;
GBOrder[1] := $A142;
GBOrder[2] := $A143;
GBOrder[3] := $A145;
GBOrder[4] := $A1C2;
GBOrder[5] := $A3BE;
..
..
..
GBOrder[8175] := $ECB8;
GBOrder[8176] := $C24D;
GBOrder[8177] := $2020;
GBOrder[8177] := $2020;
end.
 
谢谢 duhai_lee 应答。
我也怀疑是 BG5, 但是用 BG5->GB2312 转换后仍然是乱码,变成:霈W□蝻□□
 
procedure TForm1.Button1Click(Sender: TObject);
var
UTF8Str:string;
UnicodeStr:WideString;
GBStr:string;
size:integer;
begin
UTF8Str:='璁㈠崟缂栧彿';
UnicodeStr:=UTF8Decode(UTF8Str);
size:=WideCharToMultiByte(936,0,Pointer(UnicodeStr),-1,nil,0,nil,nil);
if size>0 then
begin
SetLength(GBStr,size);
if size=WideCharToMultiByte(936,0,Pointer(UnicodeStr),-1,Pointer(GBStr),
size,nil,nil)
then
begin
showmessage('UTF8Str:'+UTF8Str);
showmessage('GBStr:'+GBStr)
end
end
end;
 
答案接受了。
 

Similar threads

回复
0
查看
866
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部