PHP的GD函數imagettftext()要注意預設字元編碼
作者:Eve Cole
更新時間:2009-06-07 15:15:31
這陣子在開發一個小功能,就是類似論壇個性簽名的東西,根據會員資料自動產生一張圖片上面還有文字的那種。圖片的拼合用imagecopy()和imagecopyresampled()等函數就可以搞定,到了畫文字的時候遇到了一個難題。文字的模板是保存在一個文字檔案中,程式先讀取這個檔案然後用資料替換掉裡面的變量,再使用imagettftext()函數畫到圖片上,不幸的是畫出來的圖片居然是亂碼@_@ ……於是上Google搜尋相關的問題,發現大部分人都是在說imagettftext()函數中傳遞的字符串要UTF-8編碼,而PHP官方手冊中也明確寫著「UTF-8編碼的字符串可以直接傳遞”,可問題是模板檔案的編碼本來就是UTF-8的,這就有點莫名其妙了。無奈之下我用EmEditor打開原來的模板文件,嘗試轉換成不同的編碼後和GD輸出的亂碼做對比,結果發現轉換到EUC-JP編碼的時候居然和GD輸出的亂碼吻合了……也就是說,這裡伺服器上GD的預設編碼是EUC-JP,而那是一種日文編碼。查找了一下php.ini的設定沒有發現相關選項,於是又一個問題來了,這個預設編碼是在哪裡設定的呢?還是史文大哥牛,發現了PHP 編譯參數裡面有一個「–enable-gd-jis-conv」的參數十分可疑,Google一下果然發現了很多亂碼問題與這個編譯參數有關…官方給出的參數說明是“GD: Enable JIS-mapped Japanese font support.”,也就是讓GD支援日文編碼的字庫(可惡,為什麼沒有支援中文編碼字庫的編譯選項…PHP也國籍歧視麼= =b),說白了開啟了這個選項的話GD就會把TTF字庫中大於127的部分(即不屬於標準拉丁文字庫的部分)按照日文JIS的順序來映射,那麼用來映射中文字體的時候自然就變成亂碼了。二話不說,去掉這個選項重新編譯,問題解決。去掉這個選項之後,imagettftext()的預設編碼就變成了UTF- 8,就可以正常顯示中文了~