web-dev-qa-db-ja.com

json_encode()非utf-8文字列?

だから私は文字列の配列を持っています、そしてすべての文字列はシステムのデフォルト[〜#〜] ansi [〜#〜]エンコーディングを使用していて、SQLデータベースからプルされました。したがって、256の異なる文字バイト値(単一バイトエンコーディング)があります。
すべての文字列でjson_encode()を使用する必要がなく、\u0082のようなもので終わる代わりに、utf8_encode()を機能させてこれらの文字を表示する方法はありますか?

それともJSONの標準ですか?

25
Josh

JSON標準ENFORCES Unicodeエンコーディング。から RFC4627

_3.  Encoding

   JSON text SHALL be encoded in Unicode.  The default encoding is
   UTF-8.

   Since the first two characters of a JSON text will always be ASCII
   characters [RFC0020], it is possible to determine whether an octet
   stream is UTF-8, UTF-16 (BE or LE), or UTF-32 (BE or LE) by looking
   at the pattern of nulls in the first four octets.

           00 00 00 xx  UTF-32BE
           00 xx 00 xx  UTF-16BE
           xx 00 00 00  UTF-32LE
           xx 00 xx 00  UTF-16LE
           xx xx xx xx  UTF-8
_

したがって、厳密には、ANSIエンコードされたJSONは有効なJSONではありません。これがPHP json_encode() を使用するときにUnicodeエンコーディングを強制する理由です。

「デフォルトANSI」に関しては、あなたの文字列がWindows-1252でエンコードされていると確信しています。誤ってANSIと呼ばれます。

10
Andrew Moore
<?php
$array = array('first Word' => array('Слово','Кириллица'),'second Word' => 'Кириллица','last Word' => 'Кириллица');
echo json_encode($array);
/*
return {"first Word":["\u0421\u043b\u043e\u0432\u043e","\u041a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u0430"],"second Word":"\u041a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u0430","last Word":"\u041a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u0430"}
*/
echo json_encode($array,256);
/*
return {"first Word":["Слово","Кириллица"],"second Word":"Кириллица","last Word":"Кириллица"}
*/
?>

JSON_UNESCAPED_UNICODE(整数)マルチバイトUnicode文字を文字どおりにエンコードします(デフォルトでは\ uXXXXとしてエスケープします)。 PHP 5.4.0。

http://php.net/manual/en/json.constants.php#constant.json-unescaped-unicode

6
Jenyok

はい、これはPHP内のjsonの標準的な動作です

ドキュメントを読んだ場合: http://php.net/manual/en/function.json-encode.php
utf-8でエンコードされたデータでのみ機能することがわかります。

一方、最初のコメントは以下で使用できます。 http://php.net/manual/en/function.json-encode.php#104278

aNSIで動作する独自のエンコード/デコード関数を作成します

1
Marek Sebera

スペイン語の単語を印刷するために、私は最終的に2つの関数を適用して以下のような解決策を得ました.

$conn->set_charset("utf8");

mb_convert_encoding('THE BULLOCK ÉTAGÈRE - 3 SHELVES', "UTF-8", "Windows-1252")

「THE BULLOCKÉTAGÈRE-3 SHELVES」の場合、この文字列はデータベースから取得されるため、最初に$ connデータベースオブジェクトを使用して文字をtf8として設定し、次にスペイン語のWordをエンコードしますTF- 8からWindows-1252

0
Bhavin Thummar