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'));
シンボルは_Å
_だったようですが、データはパブリックであってはならない姓で構成されているため、最初の文字のみが表示され、それは_$lastname[0]
_だけで行われました。全体の面倒。 mb_substr($lastname, 0, 1)
に変更-チャームのように機能します。
クエリで誤った文字セットが返されるため、文字列に中かっこアポストロフィなどのhi-ascii文字があるたびにjson_encodeがnullフィールドを返す原因となる同様のエラーがありました。
解決策は、以下を追加してutf8として提供されるようにすることでした。
mysql_set_charset('utf8');
mysql connectステートメントの後。
問題は、この文字はUTF8ですが、json_encodeはそれを正しく処理しないことです。さらに言えば、同じエラーをトリガーする他の文字のリストがあります( nicode characters list を参照してください)。
使用したのは、これらの文字を次のようなhtmlエンティティに変換することです。
htmlentities( (string) $value, ENT_QUOTES, 'utf-8', FALSE);
MySQLへの接続文字セットがUTF-8であることを確認してください。多くの場合、デフォルトはISO-8859-1になります。これは、MySQLドライバーがテキストをISO-8859-1に変換することを意味します。
接続文字セットは mysql_set_charset 、 mysqli_set_charset で、またはクエリSET NAMES 'utf-8'
で設定できます
このコードを使用すると役立つ場合があります。それは私の問題を解決しました!
mb_convert_encoding($post["post"],'UTF-8','UTF-8');
またはそのような
mb_convert_encoding($string,'UTF-8','UTF-8');
投稿したシンボルは、壊れたバイトシーケンスのプレースホルダーシンボルです。基本的に、それは実際のシンボルではなく、文字列のエラーです。
シンボルの正確なバイト値は何ですか? utf8_encodeを盲目的に適用するのは得策ではありません。最初にバイトがどこから来て、何を意味しているのかを調べる方が良いでしょう。
Phpのjson_encode関数を使用するときにこのエラーをスローするもう1つのことは、Unicode文字が大文字\ Uであり小文字\ uではない場合です。
json_encodeはUTF-8データでのみ機能します。データがUTF-8であることを確認する必要があります。あるいは、iconv()を使用して、結果をUTF-8に変換してからjson_encode()に渡すことができます
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;
}
}
更新されました。PDO接続の文字セットを次のように指定して、この問題を解決しました。
「mysql:Host = $ Host; dbname = $ db; charset = utf8」
受信したすべてのデータは、残りのコードが使用するための正しい文字セットでした