【问题标题】:json encode utf8 errorjson编码utf8错误
【发布时间】:2015-05-12 16:25:25
【问题描述】:

我在用 json_encode 编码这个字符时遇到问题

http://www.fileformat.info/info/unicode/char/92/index.htm

首先它给了我这个错误 JSON_ERROR_UTF8 是

'UTF-8 格式错误,可能编码不正确'

所以在json_encode之前尝试了这个函数utf8_encode()

现在返回这个结果'\u0092'

所以我找到了这个

 function jsonRemoveUnicodeSequences($struct) {
        return preg_replace("/\\\\u([a-f0-9]{4})/e", "iconv('UCS-4LE','UTF-8',pack('V', hexdec('U$1')))", json_encode($struct));
    }

角色出现了,但与其他角色一起出现

Â’

也试过htmlentities然后html_entity_decode

没有结果

【问题讨论】:

  • 你的输入编码是什么? json_encode之前可以转成utf8吗?
  • @Halcyon 我的输入是对象我使用这个函数进行 utf8 编码函数 utf8ize($mixed) { if (is_array($mixed) ) { foreach ($mixed as $key => $value) { $mixed[$key] = utf8ize($value); } } else if (is_object($mixed)) { foreach ($mixed as $key => $value) { $mixed->$key = utf8ize($value); } } else if (is_string ($mixed)) { return utf8_encode($mixed); } 返回 $mixed; }
  • 为什么不直接json_encode(iconv('UCS-4LE','UTF-8', $text))
  • 它的创建错误“检测到输入字符串中的不完整多字节字符”导致我看到这篇文章stackoverflow.com/questions/26092388/…,它具有我一直在寻找的功能
  • 如果在这里找到有用的功能stackoverflow.com/a/29667430/3479609

标签: php json utf-8


【解决方案1】:

json_encode() 需要输入

  • 整数、浮点数、布尔值
  • 编码为 UTF-8 的字符串
  • 实现 JsonSerializable 的对象(或其他任何名称,我懒得查)
  • JSON 编码对象数组
  • 可 JSON 编码对象的 stdClass 实例

因此,如果您有一个字符串,您必须先将其转码为 UTF-8。正确的工具是 iconv 库,但您需要知道字符串当前具有哪种编码才能正确转码。

您对数组或对象进行递归转码的方法应该可行,但我强烈建议不要在内部使用除 UTF-8 之外的任何东西。如果您有一个必须接受不同编码的接口,请立即验证并拒绝,然后使用 UTF-8。同样,在回复时,请保留 UTF-8,直到您仍然可以表示编码问题的最后可能点。

【讨论】:

  • 它以utf8_general_ci形式存储在数据库中的奇怪问题
  • 我也将 UTF-8 存储在一个带有 utf8 排序规则的 MariaDB 中。这很有效,您也不必做任何事情来使其适用于 JSON。你一定还有别的事情在做。坐下来创建一个最小的示例,从创建 DB 表开始,最后将内容写入其中。其他一切都只是猜测。此外,您的问题并不完全清楚您所看到的内容(引用确切的内容,不要解释!)以及您希望看到的内容。
【解决方案2】:

如果您查看包含到字符 U+0092 的链接,它是一个控制字符,也称为 PRIVATE USE TWO。它在您的字符串中的存在意味着您的字符串几乎可以肯定不是 UTF-8 字符串。相反,它可能是特定于 Windows 的编码,如果您的文本是英文,则可能是 Windows-1252,其中 0x92 是“智能引号”撇号,也称为右单引号。此字符的 Unicode 等效项是 U+2019。

因此,您的数据源没有为您提供 UTF-8 文本。您可以将源数据修复为 UTF-8 编码,也可以转换收到的文本。例如,

的输出
echo iconv('Windows-1252','UTF-8', "\x92")

这可能是你想要的。但是,您要确保所有输入都是相同的编码。如果您的一些数据是 UTF-8 而一些是 Windows-1252,则上述 iconv 调用将正确处理 Windows-1252 编码的撇号,但它会将 UTF-8 编码的撇号转换为

’

【讨论】:

    猜你喜欢
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 2013-04-18
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    相关资源
    最近更新 更多