線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:6934
推到 Plurk!
推到 Facebook!

請問如何從Delphi5產生以utf-8編碼的中文網頁

答題得分者是:RootKit
gordonliao
一般會員


發表:1
回覆:5
積分:1
註冊:2002-04-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-12-15 21:20:13 IP:59.124.xxx.xxx 訂閱
我有一個用notepad編輯,以UTF-8編碼存檔(配合後端資料庫)的中文樣版網頁,
例如:
<form method=post action="<a href="http://abc.ddd.com.tw/add_new_data.jsp">http://abc.ddd.com.tw/add_new_data.jsp" name=form1>










專長<textarea cols=40 rows=2 name=specialty value=>"x1"</textarea><br />
經歷<textarea cols=40 rows=2 name=experience value=>"x2"</textarea><br />

<input type=submit value='送出' name="mysubmit2"><br />

</form><br />
form1.mysubmit.click;

我想在delphi程式中讀入該html檔,再以stringreplace的方式將"x1"和"x2"替換成欲填入的中文資料
但存入後卻變亂碼(原html檔中的中文正常).
請問我該如何作?

謝謝!
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-12-15 21:51:48 IP:118.167.xxx.xxx 未訂閱
應該與delphi不支援unicode有關

如何將UTF8轉成BIG5碼

裡面有寫到轉碼的資訊

gordonliao
一般會員


發表:1
回覆:5
積分:1
註冊:2002-04-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-12-21 05:23:21 IP:60.251.xxx.xxx 訂閱
謝謝GrandRURU的回答
看了GrandRURU指引的網站內容我試了好久還是試不出來
我用以下的方式不知哪裡錯了

s:=StringToWideString('烹飪',cp_utf8);
s:=WideStringToString('晶華',cp_utf8);
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-12-21 11:39:36 IP:61.222.xxx.xxx 訂閱

[code delphi]
function Utf8Encode(const WS: WideString): String;
var
L: Integer;
Temp: String;
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;

[/code]

gordonliao
一般會員


發表:1
回覆:5
積分:1
註冊:2002-04-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-12-22 20:22:14 IP:125.226.xxx.xxx 訂閱
謝謝樓上的回答.

程式中有用到UnicodeToUtf8是不是D7以上才會有?
我用的是D5.

先前我也試了
function WideStringToString(const ws: WideString; codePage: Word): AnsiString;
function StringToWideString(const s: AnsiString; codePage: Word): WideString;
不過工夫不好都沒成功.

是不是一定要找D7以上版本?
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-12-22 21:25:40 IP:122.126.xxx.xxx 訂閱
如果要用 MultiByteToWideChar 方式
應該 BIG5 -> 轉成 Unicode 再由 Unicode -> UTF -8

PS . UnicodeToUtf8 d7 才有 d6?
編輯記錄
RootKit 重新編輯於 2009-12-22 21:26:36, 註解 無‧
GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-12-23 09:26:33 IP:203.75.xxx.xxx 未訂閱
以下代碼含出處,2001年,D5應該也能適用吧?
[code delphi]
//江雪 2001.06.11 http://asnowcn.at.china.com
//將UTF-8字符串轉為代碼頁為CodePage的AnsiString。
function UTF8ToAnsiString(utf8str:string; CodePage:integer):AnsiString;
var
i:integer;
buffer:widestring;
ch,c1,c2:byte;
begin
result:='''''''';
i:=1;
while i<=Length(utf8str) do begin
ch:=byte(utf8str[i]);
setlength(buffer,length(buffer) 1);
if (ch and $80)=0 then //1-byte
buffer[length(buffer)]:=widechar(ch)
else begin
if (ch AND $E0) = $C0 then begin // 2-byte
inc(i);
c1 := byte(utf8str[i]);
buffer[length(buffer)]:=widechar((word(ch AND $1F) SHL 6) OR (c1 AND $3F));
end
else begin // 3-byte
inc(i); c1 := byte(utf8str[i]);
inc(i); c2 := byte(utf8str[i]);
buffer[length(buffer)]:=widechar( (word(ch AND $0F) SHL 12)
OR (word(c1 AND $3F) SHL 6)
OR (c2 AND $3F));
end;
end;
inc(i);
end; //while
i := WideCharToMultiByte(codePage,
WC_COMPOSITECHECK or
WC_DISCARDNS or
WC_SEPCHARS or
WC_DEFAULTCHAR, @buffer[1], -1, nil, 0, nil, nil);
if i>1 then begin
SetLength(Result, i-1);
WideCharToMultiByte(codePage, WC_COMPOSITECHECK or
WC_DISCARDNS or
WC_SEPCHARS or
WC_DEFAULTCHAR, @buffer[1], -1, @Result[1], i-1, nil, nil);
end;
end;

[/code]
gordonliao
一般會員


發表:1
回覆:5
積分:1
註冊:2002-04-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-12-24 09:31:41 IP:125.226.xxx.xxx 訂閱
謝謝大哥大大們的熱心提供資料.

GrandRURU提供的utf8toansistring跟我的問題正好相反,
在D5應用程式中輸入的中文是unicode編碼吧
我想將unicode編碼的中文字串存入以utf8編碼的檔案中.
我也到http://www.abc188.com/info/html/chengxusheji/delphi/list_161_1.html~http://www.abc188.com/info/html/chengxusheji/delphi/list_161_264.html
中去找可惜沒有unicodetoutf8.

我是不是該升級新版Delphi了?
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-12-24 10:36:53 IP:61.222.xxx.xxx 訂閱
D7 Source

[code delphi]
function UnicodeToUtf8(Dest: PChar; MaxDestBytes: Cardinal; Source: PWideChar; SourceChars: Cardinal): Cardinal;
var
i, count: Cardinal;
c: Cardinal;
begin
Result := 0;
if Source = nil then Exit;
count := 0;
i := 0;
if Dest <> nil then
begin
while (i < SourceChars) and (count < MaxDestBytes) do
begin
c := Cardinal(Source[i]);
Inc(i);
if c <= $7F then
begin
Dest[count] := Char(c);
Inc(count);
end
else if c > $7FF then
begin
if count 3 > MaxDestBytes then
break;
Dest[count] := Char($E0 or (c shr 12));
Dest[count 1] := Char($80 or ((c shr 6) and $3F));
Dest[count 2] := Char($80 or (c and $3F));
Inc(count,3);
end
else // $7F < Source[i] <= $7FF
begin
if count 2 > MaxDestBytes then
break;
Dest[count] := Char($C0 or (c shr 6));
Dest[count 1] := Char($80 or (c and $3F));
Inc(count,2);
end;
end;
if count >= MaxDestBytes then count := MaxDestBytes-1;
Dest[count] := #0;
end
else
begin
while i < SourceChars do
begin
c := Integer(Source[i]);
Inc(i);
if c > $7F then
begin
if c > $7FF then
Inc(count);
Inc(count);
end;
Inc(count);
end;
end;
Result := count 1; // convert zero based index to byte count
end;

[/code]

GrandRURU
站務副站長


發表:240
回覆:1680
積分:1874
註冊:2005-06-21

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-12-24 11:36:48 IP:203.75.xxx.xxx 未訂閱
沒玩過Delphi,有被玩到就是了 XD

以下有FOR D5的 UTF-8 <-> Unicode的互轉程式

發現…咦!跟Rookit大所提供的D7 Source code 一樣!哈!

gnugettextD5.pas
gordonliao
一般會員


發表:1
回覆:5
積分:1
註冊:2002-04-16

發送簡訊給我
#11 引用回覆 回覆 發表時間:2010-01-03 12:37:08 IP:59.124.xxx.xxx 訂閱
到山上9天終於下山了.
上山前就知道有兩篇po文,但因為網頁無法開啟以致無法回覆,實在對不起.

經RootKit大大和GrandRURU大大的指導,程式已測試ok,真的非常感謝!

幾次天人交戰,請GrandRURU大人大量,得分的是RootKit.

再次感謝各位大大.

系統時間:2024-03-29 3:53:28
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!