从PHP传递变量到js时出错
错误的原因是字符串中包含了一些无效的UTF-8字符,导致传递变量从PHP到JavaScript时出现错误。解决方法是使用PHP的json_encode函数,并传递JSON_INVALID_UTF8_IGNORE或JSON_INVALID_UTF8_SUBSTITUTE选项来处理无效的UTF-8字符。
在PHP 7.2中,可以使用以下代码来处理无效的UTF-8字符:
json_encode($text, JSON_INVALID_UTF8_IGNORE);
或者
json_encode($text, JSON_INVALID_UTF8_SUBSTITUTE);
这些选项可以直接在json_encode函数中使用,以处理无效的UTF-8字符。
感谢上面的方法,这对我有用,因为我的API响应中的标题字符串中包含了一些表情符号。但是我有一个疑问,我在某处看到表情符号是UTF-8字符,那为什么字符串中的表情符号会导致这个错误呢?也许有些表情符号是有效的UTF-8字符,而其他一些不是...
问题的出现原因是在将PHP变量传递给JavaScript时出现错误。错误是由于多维数组在JSON格式中的编码问题引起的。为解决这个问题,可以使用下面的方法:
1. 首先,使用以下代码将数组编码为JSON格式:
$encoded = json_encode(utf8ize($responseForJS));
2. 然后,使用以下递归函数来编码数组数据:
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; }
3. 如果你运行的是PHP 7.2或更高版本,则不需要使用上述的utf8ize
函数。只需使用以下代码即可:
json_encode(mb_convert_encoding($responseForJS, "UTF-8", "UTF-8"));
需要注意的是,mb_convert_encoding
函数只能在PHP 7.2或更高版本中转换数组。否则,可以使用上述的utf8ize
函数。
通过以上的解决方法,你可以成功地将PHP变量传递给JavaScript,并避免出现错误。
问题的出现原因是在变量中存在一些非UTF-8字符,即使大部分字符都是UTF-8字符。通过使用mb_convert_encoding()
函数将变量转换为UTF-8编码,可以解决这个问题。同时,可以使用$mysqli->set_charset("utf8")
来设置数据库连接的字符集。
作者尝试通过添加以下代码来查找无效的字符串:
foreach ($addresses as $address) { $converted = mb_convert_encoding($address, 'UTF-8', 'UTF-8'); if ($converted !== $address) { dd($addresses); } }
作者发现$converted !== $address
条件从未满足。这可能是因为===
是一个"二进制安全"操作符。作者还发现即使从未将$converted
赋值给任何变量,最终也没有报错。这就像mb_convert_encoding()
函数按引用接受了字符串,尽管实际上并没有。
有趣的是,由于糟糕的编码,mb_check_encoding()
和json_decode()
两个函数都无法正常工作。而mb_detect_encoding()
却可以。这是因为存在一个UTF-8编码错误的文件的问题。但是经过mb_convert_encoding()
之后,一切都按预期工作了。