web-dev-qa-db-ja.com

json_encode():引数の無効なUTF-8シーケンス

utf8_general_ci照合を使用してMySQLデータベースから取得したデータに対してjson_encode()を呼び出しています。問題は、一部の行に、クリーンにできない奇妙なデータがあることです。たとえば、シンボルであるため、json_encode()に到達すると、json_encode(): Invalid UTF-8 sequence in argumentで失敗します。

utf8_encode()を使用しても、utf8_decode()mb_check_encoding()を試しましたが、それが通り抜けて大混乱を引き起こしています。

MacでPHP 5.3.10を実行します。それで、json_encoding()が機能するように、無効なutf8シンボルをクリーンアップし、残りのデータを保持するにはどうすればよいですか?

更新。これを再現する方法を次に示します。

echo json_encode(pack("H*" ,'c32e'));
57
Artjom Kurapov

シンボルは_Å_だったようですが、データはパブリックであってはならない姓で構成されているため、最初の文字のみが表示され、それは_$lastname[0]_だけで行われました。全体の面倒。 mb_substr($lastname, 0, 1)に変更-チャームのように機能します。

23
Artjom Kurapov

クエリで誤った文字セットが返されるため、文字列に中かっこアポストロフィなどのhi-ascii文字があるたびにjson_encodeがnullフィールドを返す原因となる同様のエラーがありました。

解決策は、以下を追加してutf8として提供されるようにすることでした。

mysql_set_charset('utf8');

mysql connectステートメントの後。

33
Robert Imhoff

問題は、この文字はUTF8ですが、json_encodeはそれを正しく処理しないことです。さらに言えば、同じエラーをトリガーする他の文字のリストがあります( nicode characters list を参照してください)。

使用したのは、これらの文字を次のようなhtmlエンティティに変換することです。

htmlentities( (string) $value, ENT_QUOTES, 'utf-8', FALSE);
21
serge.k

MySQLへの接続文字セットがUTF-8であることを確認してください。多くの場合、デフォルトはISO-8859-1になります。これは、MySQLドライバーがテキストをISO-8859-1に変換することを意味します。

接続文字セットは mysql_set_charsetmysqli_set_charset で、またはクエリSET NAMES 'utf-8'で設定できます

13
Emil Vikström

このコードを使用すると役立つ場合があります。それは私の問題を解決しました!

mb_convert_encoding($post["post"],'UTF-8','UTF-8');

またはそのような

mb_convert_encoding($string,'UTF-8','UTF-8');
6
Can Uludağ

投稿したシンボルは、壊れたバイトシーケンスのプレースホルダーシンボルです。基本的に、それは実際のシンボルではなく、文字列のエラーです。

シンボルの正確なバイト値は何ですか? utf8_encodeを盲目的に適用するのは得策ではありません。最初にバイトがどこから来て、何を意味しているのかを調べる方が良いでしょう。

3
Evert

Phpのjson_encode関数を使用するときにこのエラーをスローするもう1つのことは、Unicode文字が大文字\ Uであり小文字\ uではない場合です。

0
rharvey

json_encodeはUTF-8データでのみ機能します。データがUTF-8であることを確認する必要があります。あるいは、iconv()を使用して、結果をUTF-8に変換してからjson_encode()に渡すことができます

0
Deepika Patel
I am very late but if some one working on SLIM to make rest api and getting same error can solve this problem by adding below line as:

<?php

// DbConnect.php file
class DbConnect
{
    //Variable to store database link
    private $con;

    //Class constructor
    function __construct()
    {

    }

    //This method will connect to the database
    function connect()
    {
        //Including the constants.php file to get the database constants
        include_once dirname(__FILE__) . '/Constants.php';

        //connecting to mysql database
        $this->con = new mysqli(DB_Host, DB_USERNAME, DB_PASSWORD, DB_NAME);

        mysqli_set_charset($this->con, "utf8"); // add this line 
        //Checking if any error occured while connecting
        if (mysqli_connect_errno()) {
            echo "Failed to connect to MySQL: " . mysqli_connect_error();
        }

        //finally returning the connection link
        return $this->con;
    }
}
0
inrsaurabh

更新されました。PDO接続の文字セットを次のように指定して、この問題を解決しました。

「mysql:Host = $ Host; dbname = $ db; charset = utf8」

受信したすべてのデータは、残りのコードが使用するための正しい文字セットでした

0
Jamie Deakin