March 11,2008 10:37

[PHP] 編碼轉換函數mb_convert_encoding()

一般正常在處理Big5<->UTF-8編碼上的轉換,第一個想到的就是iconv()函數;雖然需要額外安裝iconv函式庫,不過因為大部分人都有這種需求,虛擬主機商一般都會安裝,如果是自己的主機就更沒有這種問題了~

在Big5轉換成UTF-8方面,完全沒有問題;不過在UTF-8轉換成Big5方面,可就出現問題啦!因為UTF-8編碼對應的字遠比Big5編碼多,所以在一些特殊中文字的轉換上,如:堃、犇等字,iconv()函數就會出現錯誤啦!本來一直都沒有發現到這方面的問題,不過最近在公司專案管理系統上的Excel表轉出時,遇到有對方公司有「犇」這個字,讓iconv()函數發生錯誤而導致轉出的Excel檔案整個損壞的情況發生...Excel在正常輸入時是對應UTF-8編碼的,不過在轉出檔案時必須改為Big5編碼,不然UTF-8編碼的中文字會變成亂碼~無法自動判斷真是傷腦筋耶!

後來上網找了很久,都沒有令人滿意的答案;大家在轉出Excel檔時,幾乎都還是利用iconv()函數先轉成Big5編碼再轉出。後來我發現到另外一個函數:mb_convert_encoding(),似乎也是在處理編碼轉換的函數。試用之後雖然不存在的字還是不會自己生出來(如:堃、犇這些Big5編碼本來就沒有的字),但是轉不出來的字它會以「?」顯示,不會發生錯誤訊息,自然也就能正確的開啟轉出的Excel檔囉!雖然這並不是治本的方法,不過算是有稍微解決一些問題啦!

編碼真的是我目前最深的痛,轉來轉去真的很麻煩;目前我寫的PHP已經一律採用UTF-8編碼了~在網頁上是沒什麼問題,不過需要配合其他程式(如:Excel)時就必須轉來轉去...還蠻麻煩的哩!希望以後開發的軟體都能支援Unicode,畢竟萬國碼才是未來的趨勢吧!

  • taikobo0 發表於樂多回應(6)引用(0)PHP編輯本文
    樂多分類:日記/一般切換閱讀版型 │昨日人次:1 │累計人次:6111
     

    引用URL

    http://cgi.blog.roodo.com/trackback/5677701
    回應文章

    大大..我看到你的文章
    不知您是怎麼轉成excel

    我mysql是utf8,寫一支程式只要user按下載,就可以從mysql撈資料存成csv
    但用excel開啟來是亂碼
    不知大大怎麼解決這程問題??
    | 檢舉 | Posted by 不眠飛行 at March 24,2009 22:34

    你好~關於轉出 Excel 的方式,可以參考:
    http://blog.roodo.com/taikobo0/archives/5625521.html

    因為 MySQL 是 UTF8,所以在轉存 csv 時應該要先轉成 BIG5;建議使用 mb_convert_encoding() 囉~
    | 檢舉 | Posted by 台扣啵 at March 26,2009 00:11

    我現在還是個新手謝謝大大指點
    我現在在研究你的文章
    | 檢舉 | Posted by 不眠飛行 at March 26,2009 21:33

    大大
    我後來照你講的指令下去

    結果出現Fatal error: Call to undefined function: mb_convert_encoding()

    我也試過iconv..也是出現相同的Call to undefined function

    我知道我們啟動iconv,我找過一些方式,也是無效~
    不知大大能否解題
    小妹不材還需要大大指點
    | 檢舉 | Posted by 不眠飛行 at March 26,2009 23:11

    你好~如果是使用 Windows 系統的話,只要修改 php.ini 中,將 extension=php_mbstring.dll 前面的分號去除,再重啟 Apache 就可以了。

    詳細的安裝與設定,可以參考 Jace 前輩的文章
    http://www.jaceju.net/blog/?p=271
    | 檢舉 | Posted by 台扣啵 at March 26,2009 23:53
    格主您好,謝謝您的文章,請問我可以引用嗎?
    另外,linux也有php.ini是在/etc/php5/apache2下。
    ---------------------------------------------
    版主回覆:
    沒有問題
    linux 的 php.ini 其實不太一定,但還是感謝告知^^
    | 檢舉 | Posted by KJ at November 11,2010 10:39