Phpのunicode文字によるjsonのデコードとエンコード
-
29-10-2019 - |
質問
文字を台無しにすることなく、デコード、変更、エンコードする必要があるjsonがいくつかあります。
Json文字列にunicode文字がある場合、デコードされません。私はなぜ以来わからないjson.org 文字列には次のものを含めることができます: any-Unicode-character- except-"-or-\-or- control-character
.しかし、それはpythonでも動作しません。
{"Tag":"Odómetro"}
文字列をjson_decodeでデコードできるようにするutf8_encodeを使用できますが、文字は別のものに変換されます。これは、結果配列のprint_rの結果です。二つの文字。
[Tag] => Odómetro
配列を再度エンコードすると、文字がasciiにエスケープされました。:
"Tag"=>"Od\u00f3metro"
これを回避する方法はありますか?json_encodeはそのようなオプションを提供しません。utf8_encodeも動作しないようです。
編集 私はjson_encodeのunescaped_unicodeオプションがあるのを見ます。しかし、期待どおりに動作していません。ああくそー、それはphp5.4だけです。私は5.3しか持っていないので、いくつかの正規表現を使用する必要があります。
$json = json_encode($array, JSON_UNESCAPED_UNICODE);
Warning: json_encode() expects parameter 2 to be long, string ...
解決
あなたが言ったすべてから判断すると、それはオリジナルのようです Odómetro
あなたが扱っている文字列は、UTF-8ではなくISO8859-1でエンコードされています。
ここに私がそう思う理由があります:
json_encode
入力文字列を実行した後に解析可能な出力を生成しましたutf8_encode
, 、ISO8859-1からUTF-8に変換します。- あなたは、使用するときに"マングル"出力を得たと言っていました
print_r
やった後utf8_encode
, 、しかし、あなたが得たマングルされた出力は、実際にはUTF-8テキストをISO8859-1として解析しようとすることによって起こることです(óは\x63\xb3
UTF-8では、そのシーケンスは次のようになりますó
ISO8859-1による。 - あなたの
htmlentities
ハックアラウンドソリューションが機能しました。htmlentities
入力文字列のエンコーディングが正しく動作するかを知る必要があります。指定しない場合は、ISO8859-1と見なされます。(html_entity_decode
, 、紛らわしいことに、デフォルトはUTF-8なので、あなたのメソッドはISO8859-1からUTF-8に変換する効果がありました。) - あなたはPythonで同じ問題を抱えていると言いましたが、これはPHPが問題から除外されているようです。
PHPは、次を使用します。 \uXXXX
エスケープしますが、あなたが指摘したように、これは有効なJSONです。
そのため、Postgresへの接続を設定して、UTF-8文字列を提供する必要があるようです。PHPマニュアルでは、次のように追加してこれを行うことを示しています options='--client_encoding=UTF8'
接続文字列に接続します。また、現在データベースに保存されているデータのエンコーディングが間違っている可能性もあります。(あなたは単に使うことができます utf8_encode
, ただし、これはISO8859-1の一部である文字のみをサポートします)。
最後に、別の答えが指摘したように、HTTPヘッダーなどで適切な文字セットを宣言していることを確認する必要があります(もちろん、この特定の問題は、 print_r
テスト)。
他のヒント
この問題を解決するために次のように発見しました...私はこれがあなたを助けることができることを願っています。
json_encode($data,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES);
. JSON_UNESCAPED_UNICODE
PHP5.4で追加されたので、それを利用するにはPHPのバージョンをアップグレードする必要があるようです。しかし、5.4はまだリリースされていません!:(
があります。 5.4アルファリリース候補 ただし、開発マシンでプレイしたい場合は、QAでプレイします。
PHP5.3でJSON_UNESCAPED_UNICODEを実行するためのハッキーな方法。PHPjsonのサポートに本当にがっかりしました。多分これは他の誰かを助けるでしょう。 ジェネラコディセタグプレ
ページでutf-8
エンコーディングを設定してみてください:
ジェネラコディセタグプレ
これは私にとってはうまくいきます: ジェネラコディセタグプレ
あなたは近くにいました。utf8_decodeを使用してください。
を使ってみてください:
utf8_decode() and utf8_encode
. 特殊文字を含む配列をエンコードするには、ISO8859-1からUTF8まで。(utf8_encodeとutf8_decodeが機能していない場合は、これがオプションになる可能性があります)
ISO-8859-1にあるものはすべてUTF8に変換する必要があります: ジェネラコディセタグプレ
エンコードはこの後機能するはずです: ジェネラコディセタグプレ