微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

json_encode非utf-8字符串?

如何解决json_encode非utf-8字符串?

有没有一种方法可以使json_encode()工作并显示这些字符,而不必在所有字符串上都使用utf8_encode()并以“ \ u0082”之类的内容结尾?

如果你有一个ANSI编码的字符串,使用utf8_encode()的是 错误 函数来处理这个问题。您需要先将其从ANSI正确转换为UTF-8。这肯定会减少Unicode转义序列的数量,例如\u0082从json输出获取,但是从技术上讲,这些序列对json有效,您不必担心。

使用PHP将ANSI转换为UTF-8

json_encode 适用于UTF-8编码字符串。如果需要从编码的字符串成功创建有效的字符串,则需要将其重新编码/转换为first。然后将按文档所述工作。 __json``ANSI``UTF-8``json_encode

要将编码从ANSI(更正确地说,我假设您有一个Windows-1252编码的字符串,该字符串很流行,但错误地称为ANSI)转换为UTF-8您可以使用以下mb_convert_encoding()函数

$str = mb_convert_encoding($str, "UTF-8", "Windows-1252");

PHP中另一个可以转换字符串的编码/字符集的函数iconv基于libiconv调用的。您也可以使用它:

$str = iconv("CP1252", "UTF-8", $str);

注意utf8_encode()

utf8_encode()只为Latin-1而不是为ANSI。因此,当您通过该函数运行字符串时,将破坏该字符串中的部分字符。

有关返回内容的更细粒度控制json_encode(),请参见预定义常量列表(取决于PHP版本,包括PHP 5.4,某些常量尚未记录,仅到目前为止在源代码中可用)。

更改数组编码/迭代(PDO注释)

正如您在注释中写道,将函数应用于数组有问题,这是一些代码示例。它 总是 需要 更改编码使用前json_encode。这只是一个标准的数组操作,比较简单的情况下pdo::fetch()一个foreach迭代:

while($row = $q->fetch(PDO::FETCH_ASSOC))
{
  foreach($row as &$value)
  {
    $value = mb_convert_encoding($value, "UTF-8", "Windows-1252");
  }
  unset($value); # safety: remove reference
  $items[] = array_map('utf8_encode', $row );
}

解决方法

因此,我有一个字符串数组,所有字符串都使用系统默认的 ANSI 编码,并从SQL数据库中提取。因此,存在256个不同的可能字符字节值(单字节编码)。
有没有一种方法可以使我json_encode()工作并显示这些字符,而不必utf8_encode()在我的所有字符串上使用并最终得到类似的东西\u0082

还是这是JSON的标准?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。