標籤:中文亂碼 imagefttext php參數
闡述
最近幾天與公司的PHP開發人員測試即將上線的WEB網站(致難忘的青春歲月:http://hd.gfan.com),在內網測試環境沒有任何問題,但線上上測試時,發現通過PHP的GD函數 imagefttext()引用FreeType字型將文本資訊寫入映像時,出現中文亂碼;對此問題,我們在整個排查過程中,總結了三個能引起中文亂碼的原因,如下:
1、Linux系統字元集是否支援中文?
[email protected]:~#localeLANG=en_US.UTF-8LANGUAGE=en_US.UTF-8LC_CTYPE="en_US.UTF-8" [email protected]:~#echo $LANGen_US.UTF-8
##提示
在Linux系統中,支援中文的字元集有Unicode、GB1232、UTF-8、GBK、GB18030,通過命令locale,echo $LANG可以查詢系統預設使用的字元集是否支援中文,如果你的系統預設字元集不支援中文,請瀏覽擴充閱讀,瞭解相關中文字元集的資訊,在根據你架構的實際需求選擇字元集。
擴充閱讀:
http://zh.wikipedia.org/wiki/GB18030
http://zh.wikipedia.org/wiki/GB2312
http://zh.wikipedia.org/wiki/UTF8
http://zh.wikipedia.org/wiki/GBK
http://zh.wikipedia.org/wiki/Unicode
2、Linux是否支援Windows字型(黑體、宋體)?
在測試之前,整個WEB網站的PHP代碼是通過SVN更新至線上的伺服器,其中有一點需要說明的是,在使用PHP的GD函數imagefttext()將文本寫入圖片時,引用了Windows端的字型庫(simhei.ttf黑體、simsun.ttc宋體、simfang.ttf仿宋),所以我們懷疑是否因為Linux系統不支援Windows系統的字型而引起的,為此在Linux系統下添加了Windows系統的字型庫,不幸的是問題並沒有解決;引用Linux字型庫也是如此;
##擴充閱讀:
如何向Linux添加Windows字型
http://www.cnblogs.com/hiflex/archive/2012/08/12/2634532.htmlhttp://os.51cto.com/art/201402/429516.htm
3、是否由PHP編譯參數引發中文亂碼問題?
通過phpinfo()函數輸出測試環境與線上環境的PHP編譯參數,相互對比發現線上環境比測試環境多了個--enable-gd-jis-conv參數,對此,我們在PHP官方文檔中查的如下資訊:
*雖然 imagettftext()文檔標明只接受UTF-8編碼,但如果PHP編譯時間啟用–enable-gd-jis-conv選項的話,那麼非ASCII字元(例如漢字、拼音、希臘文和箭頭) 會被當成EUC-JP編碼(phpinfo中美其名曰“支援JIS編碼的字型”), 從而導致亂碼(由於西文字型沒有假名或漢字,一般表現為全部是方框)。
Although imagettftext()documentation indicates it only accepts UTF-8 encoding, but if–enable-gd-jis-conv is specified when compiling PHP, then non-ASCII characters(like Chinese, accented characters, Greek and arrows) will be (mis-)treated asEUC-JP encoding (referred to as “JIS-mapped Japanese Font Support” in phpinfo)leading to mojibake (this usually shows up as hollow rectangles, as most fontsfor western text lacks glyphs for kanji or kana).
3、1 啟用PHP參數–enable-gd-jis-conv,測試結果如下:
Firefox瀏覽器附加web調試工具firebug
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/2F/41/wKioL1OevHWjgDyfAAI6xuoGo04679.jpg" title="3.png" alt="wKioL1OevHWjgDyfAAI6xuoGo04679.jpg" />
#提示:輸出的結果,我們可以得知伺服器端是支援中文字元集,問題發生在GD函數imagefttext()將文本資訊寫入圖片時,發生了亂碼的情況,附加測試圖片如下:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/2F/41/wKiom1OevL-A4jJoAAIQqSD_d-U915.jpg" title="4.png" alt="wKiom1OevL-A4jJoAAIQqSD_d-U915.jpg" />
3、2 禁用PHP參數–enable-gd-jis-conv,測試結果如下:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/2F/41/wKiom1OevN7ACrj2AAH5DC2PIOQ158.jpg" title="5.png" alt="wKiom1OevN7ACrj2AAH5DC2PIOQ158.jpg" />
我想說,調試bug是一個非常細心,講究團隊協作的事情,首先,我們先不管問題是不是由開發人員、營運人員造成的,但是你需要明白的是兩個部門它是一個團隊,彼此間需要相互協作,爭取在最短的時間內解決問題,因為在沒有得到最終的結論之前,我們都無法確定問題是誰導致的,該由誰去負責,希望這篇文檔能協助到大家;
擴充閱讀:
http://nekotoba.nfshost.com/b/2011/04/267/a-workaround-for-imagettftext-garbage-chracters-due-to-enable-gd-jis-conv
本文出自 “一步一腳印,從營運到DBA” 部落格,請務必保留此出處http://cfwlxf.blog.51cto.com/3966339/1427020