特殊文字を含む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"のように文字列を正しく表示するにはどうすればよいですか?
どうもありがとうございました。
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のいずれかです。
それでは、PHPスクリプトでデータベースに接続した後、次の行を追加してください。少なくとも問題は解決しました。
mysql_query('SET CHARACTER SET utf8');
はい、 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 です。