我正在对来自具有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。所以问题是 - 如何清理无效的 utf8 符号,保留其余数据,以便json_encoding()
工作?
更新。这是一种重现它的方法:
echo json_encode(pack("H*" ,'c32e'));
我有一个类似的错误,导致每当字符串中存在 hi-ascii 字符(例如卷曲撇号)时json_encode返回空字段,因为查询中返回了错误的字符集。
解决方案是通过添加以下内容来确保它以 utf8 形式出现:
mysql_set_charset('utf8');
在 MySQL 连接语句之后。
似乎符号是Å
的,但由于数据由不应该公开的姓氏组成,因此只显示了第一个字母,并且仅由$lastname[0]
完成,这对于多字节字符串来说是错误的,并造成了整个麻烦。将其更改为mb_substr($lastname, 0, 1)
- 就像一个魅力。
问题是这个字符是 UTF8,但json_encode没有正确处理它。多说一点,还有一个其他字符的列表(请参阅 Unicode 字符列表),它将触发相同的错误,因此剥离此字符 (Å) 不会最终纠正问题。
我们使用的是将这些字符转换为 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 函数时,引发此错误的另一件事是当 unicode 字符是大写的 ''u 而不是小写的 ''u
>json_encode仅适用于 UTF-8 数据。您必须确保您的数据采用 UTF-8。或者,您可以使用 iconv() 将结果转换为 UTF-8,然后再将它们提供给 json_encode()
已更新。我通过在PDO连接上声明字符集来解决此问题,如下所示:
"mysql:host=$host;dbname=$db;charset=utf8"
然后,收到的所有数据都采用正确的字符集,供其余代码使用
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;
}
}
Using setLocale('fr_FR.UTF8')之前json_encode解决了问题。