請問如何從Delphi5產生以utf-8編碼的中文網頁 |
答題得分者是:RootKit
|
gordonliao
一般會員 發表:1 回覆:5 積分:1 註冊:2002-04-16 發送簡訊給我 |
我有一個用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>
</form><br /> form1.mysubmit.click; 我想在delphi程式中讀入該html檔,再以stringreplace的方式將"x1"和"x2"替換成欲填入的中文資料 但存入後卻變亂碼(原html檔中的中文正常). 請問我該如何作? 謝謝! | ||||||
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
|
||||||
gordonliao
一般會員 發表:1 回覆:5 積分:1 註冊:2002-04-16 發送簡訊給我 |
謝謝GrandRURU的回答
看了GrandRURU指引的網站內容我試了好久還是試不出來 我用以下的方式不知哪裡錯了 s:=StringToWideString('烹飪',cp_utf8); s:=WideStringToString('晶華',cp_utf8); |
||||||
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
[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 發送簡訊給我 |
|||||||
RootKit
資深會員 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
|||||||
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
以下代碼含出處,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 發送簡訊給我 |
謝謝大哥大大們的熱心提供資料.
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 發送簡訊給我 |
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 發送簡訊給我 |
沒玩過Delphi,有被玩到就是了 XD
以下有FOR D5的 UTF-8 <-> Unicode的互轉程式 發現…咦!跟Rookit大所提供的D7 Source code 一樣!哈! gnugettextD5.pas |
||||||
gordonliao
一般會員 發表:1 回覆:5 積分:1 註冊:2002-04-16 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |