【问题标题】:Decode unicode control characters in JSON string解码 JSON 字符串中的 unicode 控制字符
【发布时间】:2019-12-10 01:34:55
【问题描述】:

情况

我正在将巨大的 JSON 文件导入数据库。它包含用户使用在线所见即所得编辑器填写的字段。这使他们还可以粘贴特殊字符,通常是从 MS Word 文档中复制的。

问题

解码 JSON 文件后,省略了几个特殊字符。结果大多数是unicode control characters,例如†,它是字符U+0086

示例

<?php
$json = '{"test": "start \u0086 end"}';
$decoded = json_decode($json);
echo $decoded->test . PHP_EOL;

输出:

start  end

预期输出:

start † end

临时修复

目前我应用了这个肮脏的修复,但我仍在寻找一种更优雅的方法来替换 all unicode 字符。

protected static function replaceUnicodeCharacters(&$string)
{
    $replace = [
        "\u0086" => "†",
        "\u00b0" => "°",
        "\u0093" => "“",
        "\u0094" => "”",
        "\u0091" => "‘",
        "\u0092" => "’",
        "\u009c" => "œ",
        "\u00f6" => "ö",
        "\u00f9" => "ù",
        "\u00ad" => "­",
        "\u0096" => "–",
        "\u00fb" => "û",
        "\u00a0" => " ",
        "\u0085" => "…",
        "\u00ab" => "«",
        "\u00bb" => "»",
        "\u008c" => "Œ",
        "\u00c0" => "À",
        "\u00ff" => "ÿ",
        "\u00fc" => "ü",
    ];

    $string = str_ireplace(array_keys($replace), array_values($replace), $string);
}

【问题讨论】:

标签: php json unicode character-encoding control-characters


【解决方案1】:

编辑: PHP Unicode in JSON

我希望至少,这会有所帮助......

【讨论】:

  • 这会在 PHP 7.3 上产生 NULL 和 Uncaught JsonException: Syntax error in php shell code:1 with JSON_THROW_ON_ERROR enabled
  • 好吧,对不起。只是想帮忙。 :( 这是因为大多数浏览器不支持这个字符,也许。PHP 不能正确显示十字 D:我猜。
【解决方案2】:

0x86 解释为 Windows-1252 时是 †。您只是缺少一个编码步骤:

$decoded->test = mb_convert_encoding($decoded->test, "Windows-1252", "UTF-8");
echo '<html><meta charset="Windows-1252">';
echo $decoded->test . PHP_EOL;

【讨论】:

  • 对我来说这会导致start � end。由于我使用的是控制台应用程序,因此无法回显字符集。
  • 然后适当地设置控制台的编码。看起来您已将其配置为显示 UTF-8,但正如我在这里试图传达的那样,您的数据位于 Windows-1252 中。
猜你喜欢
  • 2015-05-09
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-03
相关资源
最近更新 更多