ホームページ > バックエンド開発 > PHPチュートリアル > PHP--json_encode 中国語エンコードの問題

PHP--json_encode 中国語エンコードの問題

WBOY
リリース: 2016-06-23 13:03:21
オリジナル
1054 人が閲覧しました

著作権表示: この記事は 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" />
ログイン後にコピー
を追加することです。 2 つ目のポイントは、ファイルのエンコーディングがメタによって設定されたエンコーディングと一致していることを確認することです。つまり、最初の項目で設定した文字セットが UTF-8 の場合、ファイル エンコーディングも UTF-8 に設定する必要があります。この 2 つを一貫性を保ってください。

上記はもちろん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}
ログイン後にコピー

この関数が中国語の「Jiyi Blog」の 16 進コード変換を実行していることがわかります。この結果を取得した後、フロントエンドの js を通じて必要な結果を取得することもできるため、これはエラーであるとは言えません。しかし、このまま使うのはやはり面倒です。もちろん、状況は PHP のバージョンによって異なります。

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}
ログイン後にコピー
ログイン後にコピー

正しく結果が得られるようになりました。ただし、PHP バージョンについては、誰もがバージョン 5.4 以降に切り替えられるようにすることはできません。では、5.4 より前のバージョンではどうすればよいでしょうか?

2. URL エンコードによる中国語の問題の解決

PHP には、urlencode と urldecode という 2 つの関数があることがわかっています。 urlencode 関数を使用して中国語を URL エンコードできるため、文字列に中国語が含まれず、中国語のエンコードの問題が発生することはありません。

$str = “迹忆博客”;echo urlencode($str);
ログイン後にコピー

Jiyi ブログで URL エンコードを実行すると、結果は次のようになります

%E8%BF%B9%E5%BF%86%E5%8D%9A%E5%AE%A2
ログイン後にコピー

したがって、上記の配列の name 値を urlencode でエンコードし、それを JSON 形式に変換すると、中国語エンコードの問題は存在しなくなります。

$data = array('id'=>1,'name'=>urlencode('迹忆博客'),'parId'=>0);$res = json_encode($data);echo $res;
ログイン後にコピー

これで、名前エンコード後の JSON 文字列が得られます

{"id":1,"name":"%E8%BF%B9%E5%BF%86%E5%8D%9A%E5%AE%A2","parId":0}
ログイン後にコピー

最後に、URL エンコードされた文字列が urldecode を通じてデコードされます。もちろん、urldecode デコードでは、デコードする対応するエンコードされた文字列を見つける必要はありません。文字列全体を直接 URL デコードできます。 urldecode は、対応する URL エンコードされた文字列を自動的に検出し、デコードします。

$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"}]
ログイン後にコピー
まとめ

中国語のエンコードの問題は非常に一般的であり、実際の状況ではさらに要約する必要があります。今後の開発で同様の問題が発生した場合でも、簡単に解決できます。

上記のカスタム json_encode 関数については、パブリック クラスにカプセル化します。ソース コードはすべて github にあります。このパブリック クラスにいくつかの一般的な関数をカプセル化していきます。クリックしてダウンロードしてください。これらが皆さんのお役に立てば幸いです。

さらに技術的な記事を読みたい場合は、Tingyun Technology Blog にアクセスし、Tingyun 公式 Web サイトにアクセスして、アプリケーションのパフォーマンス最適化の魔法をさらに体験してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート