使用Delphi6以上版本有AnsiToUTF8可用
Delphi5以下可使用
http://blog.teatime.com.tw/1/post/419
提供的方案轉編碼
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.
該方案有一個小小的bug
就是WideToUTF8 回傳的結果最後會加上一個換行符號
造成轉碼後的結果可能會跟預期不一樣。
最後可使用 S:= copy(S,0,Length(S)-1);
以修正預期產出之結果。
2013年8月16日 星期五
2009年4月27日 星期一
解決Delphi 7在win2003出現0012F88F和0012F9DB的錯誤訊息
當在Delphi7中點選 Project > Options會出現
Access violation at address 0012F88F. Write of address 0012F88F.
點選確定後,再出現
Access violation at address 0012F9DB. Write of address 0012F9DB.
處理方式如下…
我的電腦右鍵內容 > 進階 > 效能點選設定 > 資料執行防止
選取為「為所有的Windows程式和服務開啟DEP,除了我選擇的這些」
並點選下方新增C:\Program Files\Borland\Delphi7\Bin\delphi32.exe (預設路徑) 後確定。
重啟Delphi7後 點選 Project > Options 即可正常。
Access violation at address 0012F88F. Write of address 0012F88F.
點選確定後,再出現
Access violation at address 0012F9DB. Write of address 0012F9DB.
處理方式如下…
我的電腦右鍵內容 > 進階 > 效能點選設定 > 資料執行防止
選取為「為所有的Windows程式和服務開啟DEP,除了我選擇的這些」
並點選下方新增C:\Program Files\Borland\Delphi7\Bin\delphi32.exe (預設路徑) 後確定。
重啟Delphi7後 點選 Project > Options 即可正常。
訂閱:
文章 (Atom)