【问题标题】:php: json_encode test when utf-8 failsphp: utf-8 失败时的 json_encode 测试
【发布时间】:2018-01-30 15:14:09
【问题描述】:

我遇到了数据库中 UTF-8 字符编码失败的问题。 当我用 php 和json_encode() 读取它时,json_encode($content) 失败并返回一个空字符串。

$test = array('meep' => base64_decode('7b6Y'));
echo json_encode($test)."\n";

if(json_last_error() == JSON_ERROR_UTF8) {
    echo "fail\n";
}

告诉我为什么这不会打印任何其他内容然后“失败”。或者更好的是,输入内容是什么。

  1. 有没有一种方法可以检测 JSON_ERROR_UTF8 而无需调用 json_encode。像 json_test 还是别的什么?
  2. 您知道修复拼写错误的 utf-8 字符串的方法吗?回到 hex 解决问题并回到 utf-8 或其他什么?

在这种情况下,用目标更好地存储字符串的答案是没有用的!

【问题讨论】:

  • 如果要检查字符串在特定编码中是否有效,请使用mb_check_encoding
  • 您永远不必猜测任何特定字符串的编码方式。为什么您不知道来自数据库的内容是否为 UTF-8?您可以通过在连接到数据库时设置连接编码来控制它。
  • 在任意字符串上使用utf8_encode 不会修复它们,它只是确保你有一些在 UTF-8 编码中有效的东西,但它可能会也可能不会完全是垃圾。
  • 对我有用,并且在循环中看起来更好......问题是在 utf8mb4 mysql 字段中写入了错误的 unicode 序列。这可能会再次发生,并且在这种情况下使用 js 和 json 异步重新加载会失败。当然,字段编码永远是 utf-8,但写入的值不能包含错误的 unicode 序列。这可以通过带有代理对和组合封闭键帽的表情符号序列来实现。在未来的网络应用程序不应该期望这一点。
  • P.S. utf8_encode($content);只是一个易于阅读的示例。之后 json_encode 工作,但其他字符明显失败。

标签: php json encoding utf-8 character-encoding


【解决方案1】:

使用预定义的字符集可以在字段中写出最差的内容!

如果数据无法恢复,必须快速修复?! 这是一个肮脏但不是完全丢失的方法,以防止 json_encode() 崩溃:

if(!mb_check_encoding($oldContent, "UTF-8")) {
    $newContent = '';
    for($e = 0; $e < count($oldContent); $e++) {
        if(mb_check_encoding($oldContent[$e], "UTF-8")) {
            $newContent .= $oldContent[$e];
        } else {
            trigger_error("Bad char at ".$e);
        }
    }
    $oldContent = $newContent;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 2018-10-28
    相关资源
    最近更新 更多