IdHTTP 讀取的網頁資料儲存到資料庫有些字會變亂碼 |
缺席
|
bestlong
站務副站長 發表:126 回覆:734 積分:512 註冊:2002-10-19 發送簡訊給我 |
在 Delphi6 使用 Indy 的 IdHTTP 元件來讀取網頁, 該網頁的編碼是 charset=iso-8859-1 未經處理就直接存到 MSSQL 的資料庫裡. 可是在從資料庫讀出來顯示, 有一些特別的字就會變成亂碼了. 圖中第二個與第三個字是原來的樣子
從資料庫讀取後未經處理就顯示的結果
要怎麼處理才能避免這樣內容被破壞的狀況呢? 雪龍
http://bestlong.no-ip.com/
學海無涯覺無盡,勤做筆記防失憶 發表人 - bestlong 於 2005/04/02 22:16:23
------
http://blog.bestlong.idv.tw/ http://www.bestlong.idv.tw/ http://delphi-ktop.bestlong.idv.tw/ |
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
bestlong 您好: 看您的截圖顯示,應該是在中文環境中 "直接" 顯示出來的,看起來像是未設對語系字集所致,如果在瀏覽器顯示,只要設定 Charset 為原來的 iso-8859-1,應該可以正常顯示的,但如果是要在 Delphi 的元件裡顯示,那麼可能就麻煩了,因為我做過測試,在中文環境裡似乎無法直接用設定元件 Font 的 Charset 屬性來顯示某些語系的某些字元 (編碼大於 127 的 ASCII Code)。 我以您做為範例的字樣 "Bj顤ling" (Björling) 配合 TEdit 物件作測試的結果,使用 "Times New Roman"、"Courier New" 或 "Arial" 字型,並將 "字集" 設為 "中歐" (EASTEUROPE_CHARSET),是可以正常顯示的,但是您得留意點,並非每種字型都有 "中歐" 字集可選擇,試試看吧。 附註:
iso-8859-1 好像是指 "西歐",而 EASTEUROPE_CHARSET 指的又是 "東歐",但是在 Design mode 直接設定元件字型時,在字型對話框裡則必須要設成 "中歐",這真的是有點奇怪....。 發表人 - RedSnow 於 2005/04/05 22:25:14 發表人 - RedSnow 於 2005/04/05 22:29:31
|
bestlong
站務副站長 發表:126 回覆:734 積分:512 註冊:2002-10-19 發送簡訊給我 |
RedSnow 你好: 這樣就需要在所有具有 Font 屬性的元件都要將 Charset Type 調整成 EASTEUROPE_CHARSET . 這樣在顯示時才不會有問題. 不過因為我是將 IdHttp 讀取的網頁資料直接丟給 TStringList 型態的物件, 然後再作後續分析. 只是不知道這樣是否就會破壞了其中的特殊字元. 雪龍
http://bestlong.no-ip.com/
學海無涯覺無盡,勤做筆記防失憶
------
http://blog.bestlong.idv.tw/ http://www.bestlong.idv.tw/ http://delphi-ktop.bestlong.idv.tw/ |
bestlong
站務副站長 發表:126 回覆:734 積分:512 註冊:2002-10-19 發送簡訊給我 |
RedSnow 你好: 關於你的測試過程想確認一下, 是否只是單純的用輸入法在 TEdit 下輸入中歐字集的特定字?
引言: 我以您做為範例的字樣 "Bj顤ling" (Björling) 配合 TEdit 物件作測試的結果,使用 "Times New Roman"、"Courier New" 或 "Arial" 字型,並將 "字集" 設為 "中歐" (EASTEUROPE_CHARSET),是可以正常顯示的,但是您得留意點,並非每種字型都有 "中歐" 字集可選擇,試試看吧。雪龍 http://bestlong.no-ip.com/ 學海無涯覺無盡,勤做筆記防失憶
------
http://blog.bestlong.idv.tw/ http://www.bestlong.idv.tw/ http://delphi-ktop.bestlong.idv.tw/ |
bestlong
站務副站長 發表:126 回覆:734 積分:512 註冊:2002-10-19 發送簡訊給我 |
我的程式資料流 IdHTTP 元件讀取網頁 > TStrings 做分析 > ADOQuery > MSSQL2K 之後讀取 MSSQL2K 的資料時, 中歐的特殊字就會有很多部分變亂碼.
用了 SQL Profiler 觀察發現, 透過 ADO 連接資料庫時設定了下列的屬性
-- network protocol: TCP/IP
set quoted_identifier on
set implicit_transactions off
set cursor_close_on_commit off
set ansi_warnings on
set ansi_padding on
set ansi_nulls on
set concat_null_yields_null on
set language 繁體中文
set dateformat ymd
set datefirst 7 可能其中的 set language 繁體中文 屬性設定不適當而造成亂碼. 雪龍
http://bestlong.no-ip.com/
學海無涯覺無盡,勤做筆記防失憶 發表人 - bestlong 於 2005/05/04 23:14:18
------
http://blog.bestlong.idv.tw/ http://www.bestlong.idv.tw/ http://delphi-ktop.bestlong.idv.tw/ |
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
bestlong 您好:
引言:關於你的測試過程想確認一下, 是否只是單純的用輸入法在 TEdit 下輸入中歐字集的特定字?是的,我是直接在 TEdit 元件中輸入測試的字樣,然後設定 TEdit 元件屬性表的字型與字集,然後執行程式來測試的。 引言:我的程式資料流 IdHTTP 元件讀取網頁 > TStrings 做分析 > ADOQuery > MSSQL2K 之後讀取 MSSQL2K 的資料時, 中歐的特殊字就會有很多部分變亂碼. 用了 SQL Profiler 觀察發現, 透過 ADO 連接資料庫時設定了下列的屬性 -- network protocol: TCP/IP ....... set language 繁體中文 ....... 可能其中的 set language 繁體中文 屬性設定不適當而造成亂碼.站上有數篇與您類似的問題,好像都是經過資料庫的存取後產生的結果,我沒有安裝類似的環境,否則我會設法做進一步的相關測試,儘管如此;但我並不覺得是資料庫的問題,因為資料庫儲存的是資料的 "字碼" 而不是 "字型",中文雖是雙位元組的資料,但紀錄時仍是是使用 8bit 的 ASCII Code 紀錄的,您列舉的那些字樣,之所以會在顯示時變成 "亂碼" 就是因為那些字元的內碼超過 127 (0x7F),所以才會被抓來當成中文字顯示。 要正確紀錄那些 "非英文" 字元時,因為它們的編碼範圍也是在 127 (0x7F) 之後 (我記得以前在 DOS 時代時,大於 127 之後的 ASCII 字元好像叫做 semi-graphics character 吧?),所以也要使用到 8 個 bit,因此我推論那些字元碼 (內碼) 在存取於資料庫時並未變動 (否則不會有顯示成亂碼的現象),取出後之所以無法正確顯示成歐語字型,應該是在您由資料庫取出顯示時,某個步驟未設定好正確的字型或字集 (Charset),或是字型、字集被 "重設" 所致,因為您只有列出存入資料庫的步驟,而未列出由資料庫取出到顯示的步驟,所以我無法推測問題出在那裡?您再試試看吧。 發表人 - RedSnow 於 2005/05/05 02:13:11 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |