2006年11月11日 星期六

第一次編寫UTF-8

自己以SOHO從事程式編寫五年,  對程式編寫仲算有些經驗, 今天開始開多一個文章分類, 和大家分享程式編寫的事. 今天要寫的, 就是 UTF-8.

(這類文章對像是有程式編寫知識的人, 如果沒有這經驗, 就可能無法理解了)




編寫網誌管理系統系統的一個目的, 就是讓我去了解 UTF-8.

我之前有寫個網頁和網上的應用系統, 都是用BIG5, 但發現越來越多人使用UTF-8, 包括 SinaBlog, 所以有興趣去了解一番.

UTF-8 的一個好處, 就是可以在同一篇文章輸入繁體和 "简体", 不過, 原來對程式編寫來說, 內有很多東西要去處理.

例如我編寫的網誌管理系統, 所有系統的STRING, 我會先用繁體, 在pass給Browser前, 我要用UTF8Encode把所有字串轉為UTF-8.

當收到Browser的Request時, 我又要把input用UTF8Decode轉回繁體, 然後儲存在資料庫. 到要取回資料時, 我又要把資料轉回UTF-8. 就這樣, 問題出現了.

例如要把 "浅谈" 這兩個UTF-8的简体字轉為繁體, 用String儲存, 會出現 ?? 的. 就必須用WideString儲存起, 但要資料庫儲存WideString又會遇到問題, 這個真令我煩惱.

另一個處理的方法, 就是把Browser取得的UTF-8字串直接儲存在資料庫,   但在我編寫系統時, 我要先將系統內的字串, 例如 "網誌管理系統" Encode 為 UTF-8 先, 加埋資料庫的UTF-8資料, 傳給 Browser 嗎?

最慘的是, 外國沒有繁簡字的麻煩, 想問也不知到那裡問, 想學也不知在那裡學, 在Google尋找了很久, 也找不到想要的答案. 不知大家有沒有編寫這類系統的經驗, 可以分享一下嗎?

14 則留言:

  1. 我覺得直接儲存UTF-8資料可能是最好的解決辦法.

    回覆刪除
  2. Shirlun :
    我覺得直接儲存UTF-8資料可能是最好的解決辦法.
    這樣, 例如 utf8Value 是一個資料庫的資料 (e.g. 浅谈), 你要輸出
    會員名稱: 浅谈
    是否要寫成;
    UTF8Encode("會員名稱: ")+utf8Value
    呢? 咁多幾麻煩呀, 或或可以把成Source Code做了UTF8Encode, 再Compile, 這個可行嗎?

    回覆刪除
  3. 要看看compiler是否支持UTF8,最直接就是試一試.如果compiler可以,再找個支持UTF8的editor就更方便了.

    回覆刪除
  4. Shirlun :
    要看看compiler是否支持UTF8,最直接就是試一試.如果compiler可以,再找個支持UTF8的editor就更方便了.
    我是Borland C++ 6.0, 不知是否支援UTF8, 要找找看.

    回覆刪除
  5. 以下是我寫 PHP 的經驗,因為大多要同時處理中文及日文,所以必定選用 utf8 編碼。 utf8 雖然方便,但所佔的系統資源比 big5 及 gb 更多,但以目前的電腦能力應不成問題。

    回覆刪除
  6. C++ 應該用 string table 好過 hardcode string 係 source code 度喎

    回覆刪除
  7. 馮友 :
    以下是我寫 PHP 的經驗,因為大多要同時處理中文及日文,所以必定選用 utf8 編碼。 utf8 雖然方便,但所佔的系統資源比 big5 及 gb 更多,但以目前的電腦能力應不成問題。
    那你如何處理資料儲存在資料庫, 把utf-8直接儲存嗎?
    另外, 你是用支援utf-8的editor嗎?

    回覆刪除
  8. angus :
    C++ 應該用 string table 好過 hardcode string 係 source code 度喎
    給我的感覺是, 要用 string table 比較麻煩, 例如如果有GUI, 是否也用 string table呢?
    不個用string table有個好處, 就要容易就multi-language的系統. Run-time 改語言.
    有沒有多言關於使用 string table 的資料呢?

    回覆刪除
  9. Enoch :
    馮友 :
    以下是我寫 PHP 的經驗,因為大多要同時處理中文及日文,所以必定選用 utf8 編碼。 utf8 雖然方便,但所佔的系統資源比 big5 及 gb 更多,但以目前的電腦能力應不成問題。
    那你如何處理資料儲存在資料庫, 把utf-8直接儲存嗎?
    另外, 你是用支援utf-8的editor嗎?
    對,新版的 mysql 已支援 utf8 文字儲存。如果是舊的便要把欄位由 big5 改成 utf8 ,可是如此一來舊的資料也會讀取成亂碼。
    存成 utf8 的字串也只可以經由 utf8 編碼的網頁顯示出來。

    回覆刪除
  10. Enoch
    我是Borland C++ 6.0, 不知是否支援UTF8, 要找找看.
    C++ Builder 6? 試了 BDS 2006/Turbo C++ Explorer 嗎? 如要用 unicode 的話那什麼 BDE, dbExpress, BDP 想也不用想,VCL 也不能用 unicode (GUI 用 TNT 吧),只能用 M$ 的 ADO, ADO .NET.

    回覆刪除
  11. 這是看你對 coding time 和 maintenance time 的分配問題,如果做 group project 一定要用 string table
    Enoch :
    angus :
    C++ 應該用 string table 好過 hardcode string 係 source code 度喎
    給我的感覺是, 要用 string table 比較麻煩, 例如如果有GUI, 是否也用 string table呢?
    不個用string table有個好處, 就要容易就multi-language的系統. Run-time 改語言.
    有沒有多言關於使用 string table 的資料呢?

    回覆刪除
  12. william :
    C++ Builder 6? 試了 BDS 2006/Turbo C++ Explorer 嗎? 如要用 unicode 的話那什麼 BDE, dbExpress, BDP 想也不用想,VCL 也不能用 unicode (GUI 用 TNT 吧),只能用 M$ 的 ADO, ADO .NET.
    未試, 你試過嗎? 可以支援 utf-8 editor?

    回覆刪除
  13. angus :
    這是看你對 coding time 和 maintenance time 的分配問題,如果做 group project 一定要用 string table

    可否講下為何group projct要用string table呢? 因為現在只是一個人寫系統, 不用string table會寫得快D, maintenance也不會有甚麼問題.

    回覆刪除
  14. 亞宏 :
    我想問online-game係咪都係一d人寫出嚟嘅程式呢?噤係咪都可以寫返一d程式去破解?please(請解答)
    是, 但如其花時間破解, 不如花多些時間寫個 online-game 吧.

    回覆刪除