我写了个函数,想将iso8859-1转换成gb2321显示出来,如“健力士”,转换结果是:“健力士”,但是不成功,出来的还是iso8859-1代码如下:
C88592GB(C8859Char: String): AnsiString;
var
Len: Integer;
p8859Char: PChar;
pGBCHSChar: PChar;
pUniCodeChar: PWideChar;
begin
//String -> PChar
p8859Char:= PChar(C8859Char);
Len := MultiByteToWideChar(28591,0,p8859Char,-1,nil,0);
GetMem(pUniCodeChar,Len*2);
ZeroMemory(pUniCodeChar,Len*2);
//8859 -> UniCode
MultiByteToWideChar(28591,0,p8859Char,-1,pUniCodeChar,Len);
Len := WideCharToMultiByte(936,0,pUniCodeChar,-1,nil,0,nil,nil);
GetMem(pGBCHSChar,Len*2);
ZeroMemory(pGBCHSChar,Len*2);
//UniCode->GB CHS
WideCharToMultiByte(936,0,pUniCodeChar,-1,pGBCHSChar,Len,nil,nil);
Result := String(pGBCHSChar);
FreeMem(pGBCHSChar);
FreeMem(pUniCodeChar);
end;不知道错在哪里,望指教。
C88592GB(C8859Char: String): AnsiString;
var
Len: Integer;
p8859Char: PChar;
pGBCHSChar: PChar;
pUniCodeChar: PWideChar;
begin
//String -> PChar
p8859Char:= PChar(C8859Char);
Len := MultiByteToWideChar(28591,0,p8859Char,-1,nil,0);
GetMem(pUniCodeChar,Len*2);
ZeroMemory(pUniCodeChar,Len*2);
//8859 -> UniCode
MultiByteToWideChar(28591,0,p8859Char,-1,pUniCodeChar,Len);
Len := WideCharToMultiByte(936,0,pUniCodeChar,-1,nil,0,nil,nil);
GetMem(pGBCHSChar,Len*2);
ZeroMemory(pGBCHSChar,Len*2);
//UniCode->GB CHS
WideCharToMultiByte(936,0,pUniCodeChar,-1,pGBCHSChar,Len,nil,nil);
Result := String(pGBCHSChar);
FreeMem(pGBCHSChar);
FreeMem(pUniCodeChar);
end;不知道错在哪里,望指教。
mCodePage: UINT; //对照表页码
mUnicode: WideString //Unicode编码字符串
): string; //返回处理后的字符串
var
L: Integer;
begin
L := WideCharToMultiByte(
mCodePage, 0, PWideChar(mUnicode), -1, nil, 0, nil, nil);
SetLength(Result, L);
if L <= 0 then Exit;
WideCharToMultiByte(mCodePage, 0,
PWideChar(mUnicode), -1, @Result[1], L, nil, nil);
end; { UnicodeToMBCS }function MBCSToUnicode( //将多字节字符串转换成Unicode编码字符串
mCodePage: UINT; //对照表页码
mMBCS: string //多字节字符串
): WideString; //返回处理后的字符串
var
L: Integer;
begin
L := MultiByteToWideChar(mCodePage, 0, PChar(mMBCS), -1, nil, 0);
SetLength(Result, L);
if L <= 0 then Exit;
MultiByteToWideChar(mCodePage, 0, PChar(mMBCS), -1, @Result[1], L);
end; { MBCSToUnicode }function iso8859_1ToUnicode(
miso8859_1: string
): WideString;
begin
Result := MBCSToUnicode(28591, miso8859_1);
end; function UnicodeToiso8859_1(
mMBCS: string
): WideString;
begin
Result := UnicodeToMBCS(28591, mMBCS);
end;
所以折中方案就是转译,比如C语言中的转译符“\”,这里利用了“&#xxx;”做转译符,其中的xxx就是所要描述字符的unicode编码。20581就是汉字“健”的unicode编码。
因此,你只需要定义一个WideString变量,然后用SetLenght设置字符串长度,然后将unicode编码写进去就是了。