php配列符号化変換例の詳細

1330 ワード

いくつかの特殊な文字の表示効果の原因のためどうしても習慣の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は2番目のパラメータをtrueに設定し、配列プロトタイプ文字列を返し、文字列をutf-8符号化に変換した後、evalで戻り(匿名関数?)を実行します.これで問題を完璧に解決する.
後続:後でネット上で資料を探して、もっと良い方法があるかどうかを見て、見つけたのはすべて大同小異で、すべて再帰的にiconvを呼び出す方式を利用して、もし配列要素が多すぎるか次元数が多いならば、性能の上できっとあまりよくなくて、もっと良いのは原生コードの方式で、N次元の配列か関連配列かを考慮する必要はなくて、すべてすでに自動的に完成して、配列変換前後のデータが一致することを保証します.コードの長さやループとオリジナルの方法の比較から、すでに選択肢があると信じています.