web-dev-qa-db-ja.com

問題json_encode utf-8

特殊文字を含むjson_encode関数に問題があります。

たとえば、私はこれを試してみてください:

$string="Svrček";

echo "ENCODING=".mb_detect_encoding($string); //ENCODING=UTF-8

echo "JSON=".json_encode($string); //JSON="Svr\u010dek"

JSON = "Svrček"のように文字列を正しく表示するにはどうすればよいですか?

どうもありがとうございました。

17
epi82

json_encode()は実際には出力していません [〜#〜] json [〜#〜] * javascript文字列を出力しています。 (エンコードするオブジェクトまたは配列を指定すると、JSONが出力されます。)JavaScript文字列が必要なため、これで問題ありません。

JavaScript(およびJSON)では、_č_は_\u010_としてエスケープできます。 2つは同等です。したがって、json_encode()が実行していることに何も問題はありません。正常に動作するはずです。これが実際に何らかの問題を引き起こしているのであれば、私は非常に驚きます。ただし、転送が安全にUnicodeエンコード(通常はUTF-8)†である場合は、それも必要ありません。エスケープをオフにしたい場合は、json_encode('Svrček', JSON_UNESCAPED_UNICODE)のようにできます。フラグ_JSON_UNESCAPED_UNICODE_はPHP 5.4.0で導入され、以前のバージョンでは使用できません。

ちなみに、@ onteria_の言うことに反して、 JSONdoesUTF-8を使用

JSONテキストの文字エンコードは常にUnicodeです。ネットワーク上で意味のあるエンコーディングはUTF-8のみですが、UTF-16およびUTF-32も使用できます。


*または、少なくとも RFC 4627 で定義されているJSONを出力していません。ただし、 JSONの他の定義 があり、これにより スカラー値が許可されます です。

†JSONは、UTF-8、UTF-16LE、UTF-16BE、UFT-32LE、またはUTF-32BEのいずれかです。

41
TRiG

それでは、PHPスクリプトでデータベースに接続した後、次の行を追加してください。少なくとも問題は解決しました。

mysql_query('SET CHARACTER SET utf8');
11
Vulovic Vukasin

はい、 json_encodeは非ASCII文字をエスケープします。デコードすると、元の結果が得られます。

$string="こんにちは";
echo "ENCODING: " . mb_detect_encoding($string) . "\n";
$encoded = json_encode($string);
echo "ENCODED JSON: $encoded\n";
$decoded = json_decode($encoded);
echo "DECODED JSON: $decoded\n";

出力:

ENCODING: UTF-8
ENCODED JSON: "\u3053\u3093\u306b\u3061\u306f"
DECODED JSON: こんにちは

[〜#〜] edit [〜#〜]:それは何の価値もない:

JSONはUnicodeのみを使用します。

構造とフィールド名、および特定の値を記述する自己文書化形式。

ソース: http://www.json.org/fatfree.html

Unicode[〜#〜] not [〜#〜]UTF-8を使用します。これはFAQ UTF-8とUnicodeの違いを説明しています:

http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8

JSONを使用すると、非ASCII文字はUnicodeコードポイントにエスケープされます。たとえば、 こ=コードポイント305 です。

7
onteria_