PHP json编码 - 格式错误的UTF-8字符,可能编码错误

spa*_*mix 28 php encoding json utf-8

我正在将json_encode($ data)用于数据数组,并且有一个字段包含俄语字符.我使用这个mb_detect_encoding()来显示该字段的编码,并显示UTF-8.我认为json编码失败是由于其中的一些不良字符,如"ра▒".我在数据上尝试了很多东西utf8_encode,它会传递那个错误但是数据看起来不再正确了.

这个问题可以做些什么?

spa*_*mix 44

如果内部有一些非utf8字符,即使大多数字符都是utf8字符,也会出现问题.这将删除任何非utf8字符,现在它可以工作.

$data['name'] = mb_convert_encoding($data['name'], 'UTF-8', 'UTF-8');
Run Code Online (Sandbox Code Playgroud)

  • 您可能还想添加`$mysqli->set_charset("utf8");` (6认同)

Irs*_*han 23

如果你有一个多维数组要以JSON格式编码,那么你可以使用下面的函数:

如果发生JSON_ERROR_UTF8:

$encoded = json_encode( utf8ize( $responseForJS ) );
Run Code Online (Sandbox Code Playgroud)

下面的函数用于递归编码数组数据

/* Use it for json_encode some corrupt UTF-8 chars
 * useful for = malformed utf-8 characters possibly incorrectly encoded by json_encode
 */
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;
}
Run Code Online (Sandbox Code Playgroud)

  • `mb_convert_encoding` 本身会进行递​​归工作,正如您在文档[链接](https://www.php.net/manual/en/function.mb-convert-encoding.php)中看到的那样:_如果 val 是一个数组,它的所有字符串值都会被递归地转换。_所以不需要`utf8ize`函数。您需要的只是`json_encode(mb_convert_encoding($responseForJS, "UTF-8", "UTF-8"));` (6认同)
  • mb_convert_encoding 仅在运行 PHP 7.2 或更高版本时才能转换数组,仅供说明。否则,这个功能就可以完美运行。 (4认同)

小智 10

请确保使用字符集iso作为utf8来启动Pdo对象。这样可以解决此问题,避免重新舞蹈。

$pdo = new PDO("mysql:host=localhost;dbname=mybase;charset=utf8", 'user', 'password');
Run Code Online (Sandbox Code Playgroud)


M.B*_*aza 7

您只需添加您的 pdo 连接charset=utf8 如下面的 pdo 连接:

$pdo = new PDO("mysql:host=localhost;dbname=mybase;charset=utf8", 'user', 'password');
Run Code Online (Sandbox Code Playgroud)

希望能帮到你


hug*_*ugs 7

在 php 7.2 中,有两个选项允许在 json_encode 中直接管理无效的 UTF-8:

https://www.php.net/manual/en/function.json-encode

json_encode($text, JSON_INVALID_UTF8_IGNORE);
Run Code Online (Sandbox Code Playgroud)

或者

json_encode($text, JSON_INVALID_UTF8_SUBSTITUTE);
Run Code Online (Sandbox Code Playgroud)