web-dev-qa-db-ja.com

PHP jsonエンコード-不正な形式のUTF-8文字、おそらく正しくエンコードされていない

データ配列にjson_encode($data)を使用していますが、ロシア語の文字を含むフィールドがあります。

このmb_detect_encoding()を使用して、そのフィールドのエンコードを表示し、UTF-8を表示します。

Jsonエンコードは、 "ра▒"のような悪い文字が原因で失敗したと思います。データに対してutf8_encodeをたくさん試してみましたが、そのエラーはパスしますが、データはもう正しく見えません。

この問題で何ができますか?

26
sparkmix

問題は、それらのほとんどがutf8文字であるにもかかわらず、内部にいくつかの非utf8文字がある場合に発生します。これにより、utf8以外の文字が削除され、機能するようになります。

$data['name'] = mb_convert_encoding($data['name'], 'UTF-8', 'UTF-8');
42
sparkmix

JSON形式でエンコードする多次元配列がある場合、以下の関数を使用できます。

JSON_ERROR_UTF8が発生した場合:

$encoded = json_encode( utf8ize( $responseForJS ) );

以下の関数は、配列データを再帰的にエンコードするために使用されます

/* Use it for json_encode some corrupt UTF-8 chars
 * useful for = malformed utf-8 characters possibly incorrectly encoded by json_encode
 */
function utf8ize( $mixed ) {
    if (is_array($mixed)) {
        foreach ($mixed as $key => $value) {
            $mixed[$key] = utf8ize($value);
        }
    } elseif (is_string($mixed)) {
        return mb_convert_encoding($mixed, "UTF-8", "UTF-8");
    }
    return $mixed;
}
21
Irshad Khan

Utf8としてcharset isoを使用してPdoオブジェクトを開始してください。これは、再utf8izingダンスを回避するこの問題を修正するはずです。

$pdo = new PDO("mysql:Host=localhost;dbname=mybase;charset=utf8", 'user', 'password');
9
Tom Ah

pdo接続に追加するだけですcharset = utf8以下のようなpdo接続の行:

$pdo = new PDO("mysql:Host=localhost;dbname=mybase;charset=utf8", 'user', 'password');

これがあなたの助けになることを願っています

1
M.Bilal Murtaza

JSONエンコードの前にHTMLエンティティを削除します。 ISはhtml_entity_decode()をPHPで使用し、問題は解決しました。

$json = html_entity_decode($source);
$data = json_decode($json,true);
0
jayashan perera