【发布时间】: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);
}
【问题讨论】:
-
我的测试浏览器中没有一个能够在fileformat.info/info/unicode/char/0086/browsertest.htm 上正确显示此字符的“UTF-8”版本,只有十进制/十六进制 HTML 转义似乎可以正常工作。
标签: php json unicode character-encoding control-characters