Delphi 的 Utf-8 转换

新版的 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;

begin

Result:='';

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;

begin

Result:='';

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;

begin

Result:=WideToUTF8(AnsiToWide(S));

end;

function UTF8ToWide(const US: UTF8String): WideString;

var len: integer;

ws: WideString;

begin

Result:='';

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;

begin

Result:='';

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;

begin

Result:=WideToAnsi(UTF8ToWide(S));

end;

end.

就是直接使用 win32 的 API 來處理.

PS. 舊的 VCL 只支援 Ansi, 所以... WideString 與 UTF8String (定義與 AnsiString 相同) 並沒有辦法正確的在 VCL 中顯示.

原文:

http://blog.teatime.com.tw/1/post/419

DelphiXE下String转PAnsiChar

很多资料只提到升迁到xe,而我们调用底版本c++开发的程序,是只能按Ansi操作的,所以需要反向转换。

var s:PansiChar;

s:=PansiChar(AnsiString('我我我我我'));//这样就能转换过来了,如果没有AnsiString转换一下,那就只能取到第一个字符