ホームページ > バックエンド開発 > PHPチュートリアル > PHPでのjson_decode()とjson_encode()の使用法と中国語ではdisplay_PHPチュートリアルができない場合の解決策

PHPでのjson_decode()とjson_encode()の使用法と中国語ではdisplay_PHPチュートリアルができない場合の解決策

WBOY
リリース: 2016-07-13 10:55:53
オリジナル
773 人が閲覧しました

この記事ではphpのjson_decode()とjson_encode()の使い方と漢字が表示されない問題の解決策を紹介しますので、困っている方は参考にしてください。

phpのjson_decode()とjson_encode()

1.json_decode()

json_decode
(PHP 5 >= 5.2.0、PECL json >= 1.2.0)

json_decode — JSON 形式の文字列をエンコードする

指示
混合 json_decode ( string $json [, bool $assoc ] )
JSON 形式の文字列を受け入れ、それを PHP 変数に変換します

パラメータ

ジソン
デコードする json 文字列形式の文字列。

アソック
このパラメータが TRUE の場合、オブジェクトの代わりに配列が返されます。


戻り値
オブジェクトを返すか、オプションの assoc パラメーターが TRUE の場合は、代わりに連想配列が返されます。

例 #1 json_decode() の例

コードは次のとおりですコードをコピーコードは次のとおりです
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}'; var_dump(json_decode($json)); var_dump(json_decode($json, true)); ?>

上記の例は次のように出力します:

オブジェクト(stdClass)#1 (5) {

["a"] => int(1)

["b"] => int(2)

["c"] => int(3)

["d"] => int(4)
["e"] => int(5)
}

配列(5) {
["a"] => int(1)
["b"] => int(2)

["c"] => int(3)

["d"] => int(4)
["e"] => int(5)
}


$data='[{"名前":"a1","番号":"123","続き番号":"000","QQNo":""},{"名前":"a1","番号" :"123","続き番号":"000","QQNo":""},{"名前":"a1","番号":"123","続き番号":"000","QQNo": ""}]'; echo json_decode($data);

結果は次のとおりです:


Array ( [0] => stdClass オブジェクト ( [名前] => a1 [番号] => 123 [Contno] => 000 [QQNo] => ) [1] => stdClass オブジェクト ( [名前] => a1 [番号] => 123 [コント番号] => 000 [QQNo] => stdClass オブジェクト ([名前] => a1 [番号] => 123 [続き] => 000 [QQ番号] => ) )

json_decode() によってコンパイルされたオブジェクトがオブジェクトであることがわかります。今度は json_decode($data,true) を出力してみます。

コードをコピー

echo json_decode($data,true);結果: Array ( [0] => Array ( [名前] => a1 [番号] => 123 [Contno] => 000 [QQNo] => ) [1] => Array ( [名前] => a1 [番号] => 000 [QQNo] ) [2] => a1 [番号] => 123 => 000 [QQNo] => ) )

json_decode($data,true) が連想配列を出力することがわかります。このことから、json_decode($data) がオブジェクトを出力し、json_decode("$arr",true) が PHP 連想配列を生成することがわかります。 .

2.json_encode()

json_encode
(PHP 5 >= 5.2.0、PECL json >= 1.2.0)

json_encode — JSON エンコード変数

バグを報告する 説明
string json_encode (mixed $value [, int $options = 0 ] )
JSON 形式の値を返します

バグパラメータを報告する

価値
エンコードされる値は、リソースタイプを除く任意のデータタイプにすることができます

この関数は UTF-8 でエンコードされたデータのみを受け入れることができます

オプション
次の定数で構成されるバイナリ マスク: JSON_HEX_QUOT、JSON_HEX_TAG、JSON_HEX_AMP、JSON_HEX_APOS、JSON_NUMERIC_CHECK、JSON_PRETTY_PRINT、JSON_UNESCAPED_SLASHES、JSON_FORCE_OBJECT、JSON_UNESCAPED_UNICODE。

戻り値のバグを報告する
成功した場合は JSON 形式の文字列表現を返し、失敗した場合は FALSE を返します。

バグを報告する ログを更新する
バージョンの説明
5.4.0 オプション パラメータには、定数 JSON_PRETTY_PRINT、JSON_UNESCAPED_SLASHES、および JSON_UNESCAPED_UNICODE が追加されます。
5.3.3 options パラメータは定数 JSON_NUMERIC_CHECK を追加します。
5.3.0 オプションパラメータを追加します。


バグの例を報告する

例 #1 json_encode() の例

コードは次のとおりです コードをコピー

$arr = 配列 ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);

エコー json_encode($arr); ?>

上記のルーチンは次のように出力します:

{"a":1,"b":2,"c":3,"d":4,"e":5}

例 #2 json_encode() 関数での options パラメーターの使用法

$a = array('',"'bar'",'"baz"','&blong&', "xc3xa9");

echo "通常: "、json_encode($a)、"n"; echo "タグ: "、json_encode($a、JSON_HEX_TAG)、"n"; echo "Apos: "、json_encode($a、JSON_HEX_APOS)、"n"; echo "Quot: ", json_encode($a, JSON_HEX_QUOT), "n"; echo "アンプ: "、json_encode($a、JSON_HEX_AMP)、"n"; echo "Unicode: "、json_encode($a、JSON_UNESCAPED_UNICODE)、"n"; echo "すべて: ", json_encode($a, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_UNESCAPED_UNICODE), "nn";


$b = 配列();

echo "空の配列を配列として出力: ", json_encode($b), "n"; echo "空の配列をオブジェクトとして出力: ", json_encode($b, JSON_FORCE_OBJECT), "nn";

$c = 配列(配列(1,2,3));

echo "非連想配列を配列として出力: ", json_encode($c), "n"; echo "非連想配列をオブジェクトとして出力: ", json_encode($c, JSON_FORCE_OBJECT), "nn";

$d = array('foo' => 'bar', 'baz' => 'long');


echo "連想配列は常にオブジェクトとして出力されます: ", json_encode($d), "n"; echo "連想配列は常にオブジェクトとして出力されます: ", json_encode($d, JSON_FORCE_OBJECT), "nn"; ?>

上記のルーチンは次のように出力します:

通常: ["","'bar'",""baz"","&blong&","u00e9"]
タグ: ["u003Cfoou003E","'bar'",""baz"","&blong&","u00e9"]

アポス: ["","u0027baru0027",""baz"","&blong&","u00e9"]

引用: ["","'bar'","u0022bazu0022","&blong&","u00e9"]

アンプ: ["","'bar'",""baz"","u0026blongu0026","u00e9"]

Unicode: ["","'bar'",""baz"","&blong&","é"]
すべて: ["u003Cfoou003E","u0027baru0027","u0022bazu0022","u0026blongu0026","é"]

空の配列を配列として出力: []

空の配列をオブジェクトとして出力: {}

非連想配列の配列としての出力: [[1,2,3]]
オブジェクトとしての非連想配列出力: {"0":{"0":1,"1":2,"2":3}}

連想配列は常にオブジェクトとして出力されます: {"foo":"bar","baz":"long"}
連想配列は常にオブジェクトとして出力されます: {"foo":"bar","baz":"long"}

例 #3 連続配列と非連続配列の例

コードは次のとおりです
コードは次のとおりです コードをコピー

エコー「連続配列」.PHP_EOL
$sequential = array("foo", "bar", "baz", "blong"); var_dump(
$シーケンシャル、
json_encode($sequential)
);

echo PHP_EOL."非連続配列".PHP_EOL; $nonsequential = array(1=>"foo", 2=>"bar", 3=>"baz", 4=>"blong"); var_dump(

$ノンシーケンシャル、
json_encode($nonsequential)
);

echo PHP_EOL."連続配列値の削除によって生成された非連続配列を削除します".PHP_EOL; unset($sequential[1]); var_dump(
$シーケンシャル、

json_encode($sequential)

); ?>




上記のルーチンは次のように出力します:

コードをコピー

連続配列 [0]=> 文字列(3) "foo" [1]=>
配列(4) {
文字列(3) "バー"

[2]=>
文字列(3) "バズ"
[3]=>
文字列(5) "長い"
}
string(27) "["foo","bar","baz","blong"]"

非連続配列
配列(4) {
[1]=>
文字列(3) "foo"
[2]=>

文字列(3) "バー"

[3]=>
文字列(3) "バズ"
[4]=>
文字列(5) "長い"
}
string(43) "{"1":"foo","2":"bar","3":"baz","4":"blong"}"

連続配列値を削除することで生成された非連続配列を削除します
配列(3) {
[0]=>
文字列(3) "foo"
[2]=>

文字列(3) "バズ"

[3]=>
文字列(5) "長い"
}
string(33) "{"0":"foo","2":"baz","3":"blong"}"


$obj->名前= 'a1';$obj->番号='123'; $obj->Contno= '000'; echo json_encode($obj);

結果は次のとおりです:

{"名前":"a1",

「番号」:「123」、
"コントノ":"000"
}

json_encode() と json_decode() はコンパイルおよび逆コンパイルのプロセスであることがわかります。json は utf-8 でエンコードされた文字のみを受け入れるため、json_encode() のパラメーターは utf-8 でエンコードされている必要があります。そうしないと空の文字が取得されます。またはnull



中国語の場合は注意してください

オンラインで解決策を見つけました:

コードは次のとおりです

コードをコピー

/* json_encode の中国語文字化けを処理します */ ); エコー json_encode ( $data ); エコー "
"; $newData = 配列 (); foreach ( $data as $key => $value ) { echo urldecode ( json_encode ( $newData ) ); ?>技術記事
$data = array ('game' => '火と氷の国', 'name' => '茨の精霊', 'country' => '霜の国', 'level' =>

$newData [$key] = urlencode ($value ); }

後で他の人にアドバイスを求めたところ、base64エンコーディングも使用できますが、Baiduは次のように説明しました。

標準 Base64 は、URL での直接送信には適していません。これは、URL エンコーダーが標準 Base64 の「/」と「+」文字を「%XX」の形式に変更し、これらの「%」文字が保存時に含まれるためです。 ANSI SQL では「%」記号がワイルドカード文字として使用されているため、データベースに変換する必要があります。

ただし、私のデータは POST 経由で送信され、HTTP ヘッドではなくメッセージ本文にあるため、影響を受けません。

json_encode は utf-8 形式のデータのみを受け入れることができます


例: json_encode 処理後、「Xu」は「u80e5」になり、最終的な json の中国語部分は Unicode エンコーディングに置き換えられます。私たちが解決しなければならないのは、オブジェクトを json に変換し、オブジェクト内の中国語が json 内で通常の中国語として表示されるようにすることです。json_encode を使用するだけでは目標を達成できないようです。
私の解決策:最初にクラス内の中国語フィールドをURLエンコード(urlencode)し、次にオブジェクトをJSONエンコード(jsonencode)し、最後にJSON、つまり最後のJSONをURLデコード(urldecode)します。内部の中国語は依然として同じ中国語です!
テストコードは次のとおりです:

tru​​e
コードは次のとおりです コードをコピー

クラス myClass {
パブリック $item1 = 1; パブリック $item2 = '中国語'; 関数 to_json() {
//URL エンコード、中国語を Unicode に変換する json_encode を回避します
$this->item2 = urlencode($this->item2); $str_json = json_encode($this); // URL をデコードし、オブジェクト属性が変更されないように JSON に変換した後に各属性を返します
$this->item2 = urldecode($this->item2); urldecode($str_json)を返します
}
}
$c = 新しい myClass(); エコー json_encode($c); エコー '
'; エコー $c->to_json(); エコー '
'; エコー json_encode($c); エコー '
'; echo json_encode('襥'); ?>

プログラム出力結果:

{"アイテム1":1,"アイテム2":"u4e2du6587"}
{"item1":1,"item2":"中文"}
{"アイテム1":1,"アイテム2":"u4e2du6587"}
「u80e5」








http://www.bkjia.com/PHPjc/632210.html


www.bkjia.com

http://www.bkjia.com/PHPjc/632210.html
この記事では、php での json_decode() と json_encode() の使用方法と、漢字が表示されない場合の解決策を紹介します。 php 1.jsのjson_decode()とjson_encode()...

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