在php程式設計中,對陣列的操作,有時會遇到編碼轉換的相關問題。
因為一些特殊字元的顯示效果的原因,於是把utf-8改成了GBK,由於使用了ajax技術,又涉及到了舊問題-編碼轉換。
一些表單驗證需要回傳json數據,php的json_encode函數只支援utf-8編碼,無奈只得iconv了,需要達到的效果是GBK數組轉換成utf-8數組傳給json_encode函數。
最初是這樣操作的,將陣列序列化後用iconv函數轉換編碼,之後再反序列化:
程式碼如下:
unserialize(iconv('gbk','utf-8',serialize($array)));
得到的結果是空白,後來想起來設定檔裡設定了預設編碼ini_set('default_charset', 'gbk'); 這樣用gbk反序列化utf-8的字串肯定不好用了,此處在序列化和反序列化之間加個ini_set('default_charset', 'utf-8'); 應該也是可以的,但這麼弄總覺得有點彆扭,因為是全域的編碼設置,很容易導致其他地方的編碼問題,例如資料庫操作。接著換個思路,用建構陣列原型的序列化方法,借助var_export函數,最終函數如下:
程式碼如下:
function array_iconv($in_charset,$out_charset,$arr){ return eval('return '.iconv($in_charset,$out_charset,var_export($arr,true).';')); }
原理很簡單var_export設定第二個參數為true,傳回陣列原型字串,將字串轉換為utf-8編碼,之後再用eval來執行傳回(類似匿名函數?),至此完美解決問題。
後續:後來在網路上搜了下資料,看有沒有更好的方法,找到的都大同小異,都是利用遞歸調用iconv的方式,如果數組元素過多或者維數多一些,性能上肯定不怎麼樣了,更好的是原生程式碼的方式,不需要考慮是N維數組還是關聯數組,一切都已經自動完成,保證數組轉換前後資料一致。從程式碼的長短以及循環和原生方法的比較上,相信大家已經有了選擇。
以上是php數組編碼轉換範例的詳細內容。更多資訊請關注PHP中文網其他相關文章!