PHP函數imagefttext( )因--enable-gd-jis-conv引發中文亂碼解決方案

來源:互聯網
上載者:User

標籤:中文亂碼   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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.