我写了个函数,想将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;不知道错在哪里,望指教。

解决方案 »

  1.   

    //参考如下代码function UnicodeToMBCS( //将Unicode编码字符串转换成多字节字符串
      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;
      

  2.   

    iso8859-1 属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。比如,字母a的编码为0x61=97。 很明显,iso8859-1编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用iso8859-1编码来表示。而且在很多协议上,默认使用该编码。比如,虽然"中文"两个字不存在iso8859-1编码,以gb2312编码为例,应该是"d6d0 cec4"两个字符,使用iso8859-1编码的时候则将它拆开为4个字节来表示:"d6 d0 ce c4"(事实上,在进行存储的时候,也是以字节为单位处理的)。而如果是UTF编码,则是6个字节"e4 b8 ad e6 96 87"。很明显,这种表示方法还需要以另一种编码为基础。 也就是说,理论上iso8859-1 是不可能表示256个字符以外得东西,包括汉字。
    所以折中方案就是转译,比如C语言中的转译符“\”,这里利用了“&#xxx;”做转译符,其中的xxx就是所要描述字符的unicode编码。20581就是汉字“健”的unicode编码。
    因此,你只需要定义一个WideString变量,然后用SetLenght设置字符串长度,然后将unicode编码写进去就是了。