著作権表示: この記事は Jiyi ( http://www.onmpw.com/tm/xwzj/prolan_122.html?
hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io ) から転載しています。再版が必要な場合は、Tingyun College チームのメンバーである Xiao ying までメールでご連絡ください: yinhy#tingyun.com
PHP プロジェクトでは、中国語の文字化けが頻繁に発生し、悩ましい問題です。ただし、コンテンツを Web ページに出力する必要がある場合は、次の 2 つの原則に従っており、通常は中国語の文字化けは発生しません。
1 つ目は、HTML ヘッダーに
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
上記はもちろんWebページの話ですが、Webアプリケーションの中でAjaxの占める割合が増えている今、データ通信ではjson形式のデータが広く使われるようになってきています。そのため、PHP で json_encode を使用してデータを json に変換すると、中国語の文字化けや中国語のエンコードの問題も発生します。
例:
$data = array('id'=>1,'name'=>'迹忆博客','parId'=>0);echo json_encode($data);
{"id":1,"name":"\u8ff9\u5fc6\u535a\u5ba2","parId":0}
PHP の一部のバージョンでは、結果は次のようになります
{"id":1,"name":null,"parId":0}
仕方ない、中国問題はめんどくさい。コンピューターは中国人によって発明されたものではないと誰が言いましたか?もちろん、これらに対する解決策はあります。2 つの解決策を見てみましょう。
1. json_encode の 2 番目のパラメータを通じて解決します
上記の問題を考慮すると、PHP のバージョン 5.4.0 以上では、json_encode 関数自体を通じて直接解決できます。これは、2 番目のパラメーターに JSON_UNESCAPED_UNICODE を加えたものです。
$data = array('id'=>1,'name'=>'迹忆博客','parId'=>0);echo json_encode($data, JSON_UNESCAPED_UNICODE);
{"id":1,"name":"迹忆博客","parId":0}
2. URL エンコードによる中国語の問題の解決
PHP には、urlencode と urldecode という 2 つの関数があることがわかっています。 urlencode 関数を使用して中国語を URL エンコードできるため、文字列に中国語が含まれず、中国語のエンコードの問題が発生することはありません。
$str = “迹忆博客”;echo urlencode($str);
%E8%BF%B9%E5%BF%86%E5%8D%9A%E5%AE%A2
$data = array('id'=>1,'name'=>urlencode('迹忆博客'),'parId'=>0);$res = json_encode($data);echo $res;
{"id":1,"name":"%E8%BF%B9%E5%BF%86%E5%8D%9A%E5%AE%A2","parId":0}
$data = array('id'=>1,'name'=>urlencode('迹忆博客'),'parId'=>0);$res =urldecode(json_encode($data));echo $res;
{"id":1,"name":"迹忆博客","parId":0}
2 番目の方法のカプセル化関数 - URL エンコードによる中国語の問題の解決
2 番目の方法では、配列内の各中国語文字の前に urlencode 関数を追加できないという問題が発生します。これも非現実的です。その後、json_encode 関数を自分でカプセル化することで、そのような問題に対処できます。
コードは次のとおりです
/** * 作者:迹忆 * 个人博客:迹忆博客 * 博客url:www.onmpw.com*/function onmpw_json_encode($data){ if(is_object($data)) return false; if(is_array($data)){ $data = deal_array($data); } return urldecode(json_encode($data));}function deal_array($data){ if (is_array($data)) { foreach ($data as $key => $val) { if (is_array($val)) { //如果是多维数组,通过递归来处理多维数组 $data[$key] = deal_array($val); } else { //对值进行url编码 $data[$key] = urlencode($val); } } } elseif (is_string($data)) { $data = urlencode($data); } return $data;}
$data = array( array('id'=>1,'name'=>'迹忆博客','parId'=>0), array('id'=>2,'name'=>'学无止境','parId'=>1), array('id'=>3,'name'=>'趣味杂谈','parId'=>1), array('id'=>4,'name'=>'编程语言','parId'=>2), array('id'=>5,'name'=>'网络','parId'=>2), array('id'=>6,'name'=>'算法','parId'=>2), array('id'=>7,'name'=>'操作系统','parId'=>2), array('id'=>8,'name'=>'数据库','parId'=>2), array('id'=>9,'name'=>'WEB前端','parId'=>2), array('id'=>10,'name'=>'读书','parId'=>3), array('id'=>11,'name'=>'观点与感想','parId'=>3) );$data = onmpw_json_encode($data);echo $data;
[{"id":"1","name":"迹忆博客","parId":"0"},{"id":"2","name":"学无止境","parId":"1"},{"id":"3","name":"趣味杂谈","parId":"1"},{"id":"4","name":"编程语言","parId":"2"},{"id":"5","name":"网络","parId":"2"},{"id":"6","name":"算法","parId":"2"},{"id":"7","name":"操作系统","parId":"2"},{"id":"8","name":"数据库","parId":"2"},{"id":"9","name":"WEB前端","parId":"2"}, {"id":"10","name":"读书","parId":"3"},{"id":"11","name":"观点与感想","parId":"3"}]
中国語のエンコードの問題は非常に一般的であり、実際の状況ではさらに要約する必要があります。今後の開発で同様の問題が発生した場合でも、簡単に解決できます。
さらに技術的な記事を読みたい場合は、Tingyun Technology Blog にアクセスし、Tingyun 公式 Web サイトにアクセスして、アプリケーションのパフォーマンス最適化の魔法をさらに体験してください。