ホームページ >バックエンド開発 >PHPチュートリアル >json_encode を使用した後、PHP では中国語で null が表示される

json_encode を使用した後、PHP では中国語で null が表示される

WBOY
WBOYオリジナル
2016-06-23 14:18:171367ブラウズ

PHP JSON null

次の配列があります:
Array(    [0] => Array        (            [name] => 192.168.1.250            [id] => 3232236026            [items] => Array                (                    [defualt] => Array                        (                            [parentNode] => 3232236026                            [name] => 请选择接口                            [id] => 0                        )                    [0] => Array                        (                            [parentNode] => 3232236026                            [name] => LAN0(内网)                            [id] => em0                        )                    [1] => Array                        (                            [parentNode] => 3232236026                            [name] => LAN1(外网)                            [id] => em1                        )                )        ))


解析する前に mb_convert_encoding() を使用して utf-8 に変更しました

json_encode で解析した後、Linux で php xxx.php を使用して直接実行しました正しい結果を取得できます:
[{"name":"192.168.1.250","id":"3232236026","items":{"defualt":{"parentNode":"3232236026","name" :" u8bf7u9009u62e9u63a5u53e3","id":"0"},"0":{"parentNode":"3232236026","name":"LAN0(u5185u7f51)","id":"em0"},"1" :{ "parentNode":"3232236026","name":"LAN1(u5916u7f51)","id":"em1"}}}]

しかし、Firefox の Web コンソールで開いた後、得られた結果は次のとおりでした。
[{"name":"192.168.1.250","id":"3232236026","items":{"defualt":{"parentNode":"3232236026","name":"u8bf7u9009u62e9u63a5u53e3","id" : "0"},"0":{"parentNode":"3232236026","name":null,"id":"em0"},"1":{"parentNode":"3232236026","name" : null,"id":"em1"}}}]

上記の「インターフェイスを選択してください」という文字列はphpに直接入力されており、「LAN1(外部ネットワーク)」は私がファイルで取得したものです。何か違いますか?どうやって解決すればいいでしょうか?

ディスカッションへの返信 (解決策)

1. json_encode は utf-8 データのみを処理できます (名前空間を使用して再定義できます)
2. php プログラムは utf-8 なので、「インターフェイスを選択してください」はエンコーディングを通じて行うことができます
3. データ ファイルは utf-8 ではないため、「LAN1 (外部ネットワーク)」などをエンコードできません

解決策は、データ ファイルを utf-8 エンコードで保存することです

1L への返信、

私の編集環境はすべてgbkなので、PHPで編集時に「インターフェースを選択してください」と直接入力し、mb_convert_encoding()を使ってutf-8に変更しました

「LAN1(外部ネットワーク)」は同じです。別のファイルから取得するので、mb_convert_encoding() を使用して utf-8 に変更しました。

それで、php ファイル php xxx.php を実行すると、それを渡して正しい結果 LAN1 (u5916u7f51) を得ることができます。Firefox Web コンソールで開くと、結果は Null です。

Baidu で検索したところ、誰かがそのファイルは c を使用して生成され、次の内容が含まれていると言った


[root@localhost php]# php select_for_interface.php
PHP 警告: ディレクティブ 'register_globals' は PHP 5.3 以降、行 0 の Unknown では非推奨です
czoyODM6Ilt7Im5hbWUiOiIxOTIuMTY4LjE uMjUwIiwiaWQiOiIzM jMyMjM2MDI2IiwiaXRlbXMiOnsiZGVmdWFsdCI6eyJwYXJlbnROb2RlIjoiMzIzMjIzNjAyNiIsIm5hbWUiOiJcdThiZjdcdTkwMDlcdTYyZTlcdTYzYTVcdTUzZTMiLCJp ZCI6IjAifSwiMCI6eyJwYXJlbnRO b2RlIjoiMzIzMjIzNjayNiIsIm5hbWUiOiJMQU4wKFx1NTE4NVx1N2Y1MSkiLCJpZCI6ImVtMCJ9LCIxIjp7InBhcmVudE5vZGUIOizMjMyMjM2MDI2Ii wibmFtZSI6IkxBTjEoXHU1OTE2XH U3ZjUxKSIImlkIjoiZW0xIn19fV0iOw==
[{"名前":"192.168 .1.250", "id":"3232236026","items":{"defualt":{"parentNode":"3232236026","name":"u8bf7u9009u62e9u63a5u53e3","id":"0"},"0" :{"親ノード ":"3232236026","名前":"LAN0(u5185u7f51)","id":"em0"},"1":{"親ノード":"3232236026","名前":"LAN1( u5916u7f51)", "id":"em1"}}}]
[root@localhost php]#

上記は私の操作結果です。この結果は正常に見えますが、ブラウザで開くと異常です:
czoyNTE6Ilt7Im5hbWUiOiIxOTIUMTY4LjeumjUwIiwiaWQiOizMjMyMjM2MDI2IiwiaXRlbXMiOnsiZGVmdWFsdCI6eyJwYXJlbnROb2RlIjoiMzIzMjIzNjayNiIsIm5hbWUiO IJcdThiZjdcdTkwMDlcdTYyZTlcdTYzYTVcdTUzZTMiLCJpZCI6IjAifSwiMCI6eyJwYXJlbnROb2RlIjoiMzIzMjIzNjayNiIsIm5hbWUiOm51bGwsImlkIjoiZW0wIn0sIjEionsicGFyZW50Tm9kZSI6 IjMyMzIyMzYwMjYiLCJuYW1lIjpudWxsLCJpZCI6ImVtMSJ9fX1dIjs=
[{"name":"192.168.1.250","id":"3232236026","items":{"default":{"parentNode":"3232236026", 「名前」:" u8bf7u9009u62e9u63a5u53e3","id" :"0"},"0":{"parentNode":"3232236026","name":null,"id":"em0"},"1":{"parentNode":" 3232236026","name" :null,"id":"em1"}}}]

これはブラウザに記録された結果です。

渡してほしいのは json_encode より前のデータです #3 の記述では曖昧にはならないと思いますね。



Mzp7czo3OiJkZWZ1YWx0IjthOjM6e3M6MTA6InBhcmVudE5vZGUiO3M6MTA6IjMyMzIyMzYwMjYiO3M6NDioibmFtZSI7czoxNToi6K+36YCJ5oup5 o6l5Y+jIjtzOjI6ImlkIjtzOjE6IjaiO31pOjaA7YTozOntzOjEwOiJwYXJlbnROb2RlIjtzOjEwOizMjMyMjM2MDI2IjtzOjQ6Im5hbWUiO3M6MTI6IkxBTjAo5YaF572RKSI7czoyOi JpZCI7czozOiJlbTAiO31pOjE7YTozOn tzOjEwOiJwYXJlbnROb2RlIjtzOjEwOizMjMyMjM2MDI2IjtzOjQ6Im5hbWUIO3M6MTI6IkxBTjEo5aSW572RKSI7czoyOiJpZCI7czozOiJlbTE iO319fX0=

よく見ていませんでした。 。 。

URL を json でエンコードしてからデコードしても機能するかどうかはわかりません

[{"name":"192.168.1.250","id":"3232236026","items":{ "defualt":{"parentNode" :"3232236026","name":"u8bf7u9009u62e9u63a5u53e3","id":"0"},"0":{"parentNode":"3232236026","name":"LAN0( u5185u7f51)","id": "em0"},"1":{"parentNode":"3232236026","name":"LAN1(u5916u7f51)","id":"em1"}}}]

正しいデータが再度与えられました




kZWZ1YWx0IjthOjM6e3M6MTA6InBhcmVudE5vZGUiO3M6MTA6IjMyMzIyMzYwMjYiO3M6NDioibmFtZSI7czoxNToi6K+36YCJ5oup5o6l5Y+j IjtzOjI6ImlkIjtzOjE6IjAiO31pOja 1 XJlbnROb2RlIjtzOjEwOiIzMjMyMjM2MDI2IjtzOjQ6Im5hbWUiO3M6MTI6IkxBTjEo5aSW572RKSI7czoyOiJpZCI7czozOiJlbTEiO319fX 0=

よく見ていませんでした。 。 。

10L への返信、これは確かに json_encode() 前の配列のデータです。

さらに、テストしたところ、ファイルから読み取られた内容がすべて英語であっても、Firefox Web コンソールは依然として Null を取得することがわかりました。
同時に、PHP コードにコンテンツを記述し、Firefox Web コンソールを表示しました。正しい結果が得られました。

結論: ファイルから読み込む限り、json_encode() の後、Firefox Web コンソールは null を取得するようです。

しかし、私は他のマシンでもそれを使用して、ファイルからコンテンツを読み取り、json_encode() を通じてインターフェースに表示しました。

ブラウザが取得するのは json_encode の実行結果のみであり、受信したデータは変更されません
したがって、それが null の場合は、json_encode 中に生成される必要があります

私が提供してほしいのは、null を見つけたときに正確に提供することです問題の原因を見つけることができるように、元のデータを保存します
抵抗がなければ、気にしません

ブラウザが取得するのは json_encode の実行結果のみであり、受信したデータは変更されませんデータ
したがって、それが null の場合は、 json_encode 中に生成する必要があります

私が提供してほしいのは、問題の原因を見つけることができるように、 null を見つけたときの元のデータです
そうでない場合は、アンチフレームしたくない、気にしません
上司、このアドレスの質問: http://bbs.csdn.net/topics/390507272
答えなくても、理由を教えてください。

ブラウザが取得するのは json_encode の実行結果のみであり、受信したデータは変更されません
したがって、それが null の場合は、json_encode 中に生成される必要があります

私が提供してほしいのは、null を見つけたときに正確に提供することです問題の原因を見つけることができるように、元のデータを保存します
炎上対策、やりたくない場合は、気にしません

8L から送信した段落は、確かに私の json_encode() の前の配列であり、 print_r で出力されたものは私の本館の配列を投稿したものです。
現象は、ターミナルの印刷結果は正常ですが、Firefox コンソールが異常であるということです。 スクリーンショットは次のとおりです。

写真からわかるように、php xxx.php を実行した後の結果、つまりエコーです。 result contains LAN1 (u5916u7f51 ),


Firefox コンソールでは、Firefox が受信した結果は null です。

次に、ファイルの内容を読み取り、読み取らずに直接 php コードに書き込みます。このスクリーンショットからわかるように、エコーの内容は基本的に同じです。 1階のものと同じです


しかし、Firefoxで得られる結果はまったく異なります。この結果は正しいです。

同時に、ファイルを読み込むと、中国語の文字を削除してすべて英語になりました。ファイルを読み込むと、Firefox は Null と表示しました。読み込まれない場合は、正常です。 .

そうじゃないですか
=> 323236026 [名前] => em0

こんな感じですか?

名前は少なくとも非表示文字なので、どうすれば正しく変換できますか?

これは ajax アプリケーションですか? Firefox は引き続き操作できますが、 echo base64_encode(serialize($ar)); を
file_put_contents('test.txt',base64_encode(serialize($ar))); に変更してから、test.txt のコンテンツを投稿します
はい、ajax は php を呼び出し、php は後続の処理のために echo を通じて json オブジェクトを ajax に返します。

test.txt里面の内容:
YToxOntpOjA7YTozOntzOjQ6Im5hbWUiO3M6MTM6IjE5Mi4xNjguMS4yNTAiO3M6MjoiaWQiO3M6MTA6IjMyMzIyMzYwMjYiO3M6NToiaXRlbXMiO2E6M zp7czo3OiJkZWZ1YWx0IjthOjM6e3M6MTA6InBhcmVudE5vZGUIO3M6MTA6IjMyMzIyMzYw MjYiO3M6NDoibmFtZSI7czoxNToi6K+36YCJ5oup5o6l5Y+jIjtzOjI6ImlkIjtzOjE6IjA IO31pOja7YTozOntzOjEwOiJwYXJlbnROb2RlIjtzOjEwOiizMjMyMjM2MDI2IjtzOjQ6Im5hbWUiO3M6MTI6IkxBTjAo5YaF572RKSI7czoyOiJpZCI7czozOiJlbTAiO31pOjE7YToz OntzOjEwOiJwYXJlbnROb2RlIjtzOjEwIzMjMyMjM2MDI2IjtzOjQ6Im5hbWUiO3M6MTI6IkxBTjEo5aSW572RKSI7czoyOiJpZCI7czozOiJlbTEiO319fX0=

得られた内容:

YToxOntpOjA7YTozOntzOjQ6Im5hbWUiO3M6MTM6IjE5Mi4xNjguMS4yNTAIO3M6MjoiaWQiO3M6MTA6IjMyMzIyMzYwMjYiO3M6NToiaXRlbXMiO2E6Mzp7czo3OiJkZWZ1 YWx0IjthOjM6e3M6MTA6InBhcmVudE5vZGUIO3M6MTA6IjMyMzIyMzYwMjYiO3M6NDoibmFtZSI7czoxNToi6K+36YCJ5oup5o6l5Y+jIjtzOjI6ImlkIjtzOjE6IjAiO31pOja7YTozOntz OjewOiJwYXJlbnROb2RlIjtzOjEwOizMjMyMjM2MDI2IjtzOjQ6Im5hbWUiO047czoyOiJpZCI7czozOiJlbTAiO31pOjE7YTozOntzOjEwOiJwYXJlbnROb2RlIjtzOizEwOizMjMyMj M2MDI2IjtzOjQ6Im5hbWUiO047czoyOiJpZCI7czozOiJlbTEiO319fX0=


file_put_contents('test.txt',base64_encode(serialize($arr_select));
print_r($arr_select);
echo " n";
echo $json;

これがモデレータのメインコンテンツとして出力されるはずです。

教えてください、#17 の 2 つのデータをどうやって入手しましたか?

Firefox の要求に応じてすべてファイルに保存されますか?

「はい」の場合、なぜ違うのですか?


教えてください、#17 の 2 つのデータをどうやって入手したのですか?

Firefox の要求に応じてすべてファイルに保存されますか?

「はい」の場合、なぜ違うのですか?

test.txt 内の 2 つのデータは、モデレーターのステートメントを実行することによって取得され、また echobase64_encode(serialize($arr_select)); の結果でもあります。

2 番目のデータは、Firefox Web コンソールによって追跡された HTTP リクエストであり、Firefox によって出力された応答の内容が含まれています。

どのように変更しても、php の Linux ターミナルのダイレクト エコーでは LAN1 (u5916u7f51) が表示され、Firefox では確かに Null が表示されるため、なぜ異なるのかわかりません。初めてこの状況に遭遇しました。中国語があるかどうかに関係なく、ファイルを読み取ると

コードを別のマシンにデプロイして、環境が原因かどうかを確認してみます。

file_put_contents('test.txt',base64_encode(serialize($arr_select))); をプログラムに入れてから、Firefox を使用して通常のプロセスに従ってプログラムにアクセスしてください

このようにして、テストを取得します.txt は実際のデータです


file_put_contents('test.txt',base64_encode(serialize($arr_select))); をプログラムに入れてから、Firefox を使用して通常の手順に従ってプログラムにアクセスしてください。 process
この方法で取得した test.txt が実際のデータです

申し訳ありませんが、モデレーター、別の環境で試してみましたが、問題は見つかりませんでした。その後、21 階でプロンプトを読んだ後、ファイルのパーミッションが原因であることがわかり、root パーミッションを使用して Linux ターミナルで直接実行したところ、正常に印刷できましたが、ブラウザから印刷するときに使用した apche パーミッションが不十分であったため、ファイルが開かれませんでした。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。