function UnicodeEncode(Str:string;CodePage:integer):WideString; var Len:integer; begin Len:=Length(Str)+1; SetLength(Result,Len); Len:=MultiByteToWideChar(CodePage,0,PChar(Str),-1,PWideChar(Result),Len); SetLength(Result,Len-1); //end is #0 end;
function UnicodeDecode(Str:WideString;CodePage:integer):string; var Len:integer; begin Len:=Length(Str)*2+1; //one for #0 SetLength(Result,Len); Len:=WideCharToMultiByte(CodePage,0,PWideChar(Str),-1,PChar(Result),Len,nil,nil); SetLength(Result,Len-1); end;
function Gb2Big5(Str:string):string; begin SetLength(Result,Length(Str)); LCMapString(GetUserDefaultLCID,LCMAP_TRADITIONAL_CHINESE, PChar(Str),Length(Str), PChar(Result),Length(Result)); Result:=UnicodeDecode(UnicodeEncode(Result,936),950); end;
function Big52Gb(Str:string):string; begin Str:=UnicodeDecode(UnicodeEncode(Str,950),936); SetLength(Result,Length(Str)); LCMapString(GetUserDefaultLCID,LCMAP_SIMPLIFIED_CHINESE, PChar(Str),Length(Str), PChar(Result),Length(Result)); end;
关键使用了UnicodeToUtf8这个函数 function Utf8Encode(const WS: WideString): UTF8String; var L: Integer; Temp: UTF8String; begin Result := ''; if WS = '' then Exit; SetLength(Temp, Length(WS) * 3); // SetLength includes space for null terminator L := UnicodeToUtf8(PChar(Temp), Length(Temp)+1, PWideChar(WS), Length(WS)); if L > 0 then SetLength(Temp, L-1) else Temp := ''; Result := Temp; end;