与编码相关的错误让我一团糟。
我有一个带有 latin1 的数据库(我相信它接近 Windows-1252)、Windows-1252 中的用户前端页面以及 Windows-1252 中的 AJAX 后端。这些无法在自动提款机上更改。
但是,由于 JSON 需要 UTF8 数据,因此我在使用德语变音符号时遇到了很多麻烦。
我目前正在前端的数据库中检索一些转义的示例数据[{"\u00f6\u00e4\u00fc\u00df"}]
并使用
foreach($example_array_of_objects as $k => &$v) {
foreach($v as $k2 => $v2) {
$v[$k2] = utf8_decode($v2);
}
}
这会导致前端输入表单字段中的数据正确显示。
但是,这就是我陷入困境的地方。 PHP 的 json_encode 将 Umlaute 转义为这些\u 序列,但在 Javascript 中,JSON.stringify 却不会。 当我 JSON.stringify 输入字段数据并将其发送到 AJAX 脚本时,我从 print_r 响应中只得到垃圾:
öäüß
encodeURIComponent 不执行与 PHP 相同类型的转义。这真是令人气愤。
如何在 JS 中将“öäüß”转换为\u00f6\u00e4\u00fc\u00df(或者如何以某种方式同步 JS/PHP/mySQL 之间的数据处理方式)?
最佳答案
您无法真正修改 JSON.stringify
的工作方式 - 提供 replacer
函数作为第二个参数将迫使您手动编码值(令人不快的事情)。最好的选择是在前端(JavaScript 代码)中使用 UTF-8,并仅在 PHP 代码中从/到 CP1252 进行转换。
将数据发送到前端时,您应该使用这些标志
json_encode($array, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);
这将确保尽可能干净的 UTF-8 输出。
要填充您的 $array
,您应该使用 mb_convert_encoding($original_data_from_DB, 'UTF-8', 'CP1252')
并在 json_decode 之后获取数据
你应该使用mb_convert_encoding($data_from_java_script, 'CP1252', 'UTF-8')
关于javascript - 对 JSON 编码错误以及 JS 和 PHP 之间的差异感到疯狂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61871945/