我正在使用json_encode()
排序规则调用来自MySQL数据库的数据utf8_general_ci
。问题是有些行有奇怪的数据,我无法清理。例如符号�
,因此一旦达到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'));
答案 0 :(得分:32)
我遇到了类似的错误,导致json_encode在字符串中出现hi-ascii字符(例如卷曲撇号)时返回空字段,原因是查询中返回了错误的字符集。
解决方案是通过添加以下内容确保它以utf8形式出现:
mysql_set_charset('utf8');
在mysql连接语句之后。
答案 1 :(得分:23)
似乎符号是Å
,但由于数据由不应公开的姓氏组成,因此只显示了第一个字母,而且仅由$lastname[0]
完成,这对于多字节字符串是错误的并造成了整个麻烦。将其更改为mb_substr($lastname, 0, 1)
- 就像魅力一样。
答案 2 :(得分:21)
问题是这个字符是UTF8,但是json_encode没有正确处理它。 更多的是,有一个其他字符列表(见Unicode characters list),会触发相同的错误,因此剥离这个字符(Å)不会纠正问题到最后。
我们使用的是将这些字符转换为这样的html实体:
htmlentities( (string) $value, ENT_QUOTES, 'utf-8', FALSE);
答案 3 :(得分:13)
确保您与MySQL的连接字符集是UTF-8。它通常默认为ISO-8859-1,这意味着MySQL驱动程序将文本转换为ISO-8859-1。
您可以使用mysql_set_charset,mysqli_set_charset或查询SET NAMES 'utf-8'
答案 4 :(得分:3)
您发布的符号是断开的字节序列的占位符。基本上,它不是真正的符号,而是字符串中的错误。
符号的确切字节值是多少?盲目地应用utf8_encode并不是一个好主意,最好先找出字节的来源及其含义。
答案 5 :(得分:0)
当您使用php的json_encode函数时,抛出此错误的另一件事是unicode字符是大写字母\ U而不是小写字母\ u
答案 6 :(得分:0)
json_encode仅适用于UTF-8数据。您必须确保您的数据是UTF-8。或者,您可以使用iconv()将结果转换为UTF-8,然后再将它们提供给json_encode()
答案 7 :(得分:0)
更新..我通过在PDO连接上声明字符集来解决此问题,如下所示:
“MySQL的:主机= $主机; DBNAME = $分贝;字符集= UTF8”
然后收到的所有数据都在正确的字符集中,供其他代码使用
答案 8 :(得分:0)
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;
}
}
答案 9 :(得分:-1)
在json_encode解决问题之前使用setLocale(&#39; fr_FR.UTF8&#39;)。