1、Delphi 的 Utf-8 转换 - findumars - 博客园.html
新版的 Delphi 應該不用這麼麻煩, 據說只要直接在 AnsiString, WideString, UTF8String 之間 assign 時就會自動幫你做轉換 (沒用過, 不知道是不是真的這樣就可以).
不過... 還在用 Delphi 3/5, 所以... 只好自己來轉:
unit util_utf8; interface uses Windows; type UTF8String = AnsiString; function AnsiToWide(const S: AnsiString): WideString; function WideToUTF8(const WS: WideString): UTF8String; function AnsiToUTF8(const S: AnsiString): UTF8String; function UTF8ToWide(const US: UTF8String): WideString; function WideToAnsi(const WS: WideString): AnsiString; function UTF8ToAnsi(const S: UTF8String): AnsiString; implementation function AnsiToWide(const S: AnsiString): WideString;var len: integer; ws: WideString;beginResult:='';if (Length(S) = 0) then exit;len:=MultiByteToWideChar(CP_ACP, 0, PChar(s), -1, nil, 0);SetLength(ws, len);MultiByteToWideChar(CP_ACP, 0, PChar(s), -1, PWideChar(ws), len);Result:=ws;end; function WideToUTF8(const WS: WideString): UTF8String;var len: integer; us: UTF8String;beginResult:='';if (Length(WS) = 0) then exit;len:=WideCharToMultiByte(CP_UTF8, 0, PWideChar(WS), -1, nil, 0, nil, nil);SetLength(us, len);WideCharToMultiByte(CP_UTF8, 0, PWideChar(WS), -1, PChar(us), len, nil, nil);Result:=us;end; function AnsiToUTF8(const S: AnsiString): UTF8String;beginResult:=WideToUTF8(AnsiToWide(S));end; function UTF8ToWide(const US: UTF8String): WideString;var len: integer; ws: WideString;beginResult:='';if (Length(US) = 0) then exit;len:=MultiByteToWideChar(CP_UTF8, 0, PChar(US), -1, nil, 0);SetLength(ws, len);MultiByteToWideChar(CP_UTF8, 0, PChar(US), -1, PWideChar(ws), len);Result:=ws;end; function WideToAnsi(const WS: WideString): AnsiString;var len: integer; s: AnsiString;beginResult:='';if (Length(WS) = 0) then exit;len:=WideCharToMultiByte(CP_ACP, 0, PWideChar(WS), -1, nil, 0, nil, nil);SetLength(s, len);WideCharToMultiByte(CP_ACP, 0, PWideChar(WS), -1, PChar(s), len, nil, nil);Result:=s;end; function UTF8ToAnsi(const S: UTF8String): AnsiString;beginResult:=WideToAnsi(UTF8ToWide(S));end; end.
就是直接使用 win32 的 API 來處理.
PS. 舊的 VCL 只支援 Ansi, 所以... WideString 與 UTF8String (定義與 AnsiString 相同) 並沒有辦法正確的在 VCL 中顯示.原文:
2、
3、