对使用JSON编码错误以及JS和PHP之间的差异感到疯狂



我手上有很多与编码相关的错误。

我有一个带有 latin1 的数据库(我相信它接近 Windows-1252(,Windows-1252 中的用户前端页面和 Windows-1252 中的 AJAX 后端。这些不能在自动取款机上更换。

然而,由于JSON需要UTF8数据,所以我在德语变音符号方面遇到了很多麻烦。

我目前正在从前端[{"u00f6u00e4u00fcu00df"}]上的数据库中检索一些转义的示例数据

并使用
foreach($example_array_of_objects as $k => &$v) {
foreach($v as $k2 => $v2) {
$v[$k2] = utf8_decode($v2);
}
}

这导致在前端的输入表单字段中正确显示数据。

然而,这就是我卡住的地方。PHP 的 json_encode 将变音符号转义为这些 \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')

遇到过一次这种类型的问题,但没有使用 PHP,它使用 encodeURIComponent 解决了。如果 encodeURIComponent 不适合您,请尝试使用 atob 和 btoa 在两端使用 Base64 编码解码。

我现在通过让PHP处理其中的大部分来设法做到这一点:

JS发送到AJAX:

mydata = JSON.stringify(data);

AJAX 后端:

//decode JS way of JSON with additional slashes etc.
$tmp = json_decode(stripslashes(html_entity_decode($_POST['mydata'])), true);
//re-encode the PHP way
$json = json_encode($tmp);
//save to DB
[...]

用户前端 (窗体(:

//Retrieval from DB
$mydata = json_decode($db_row['mydata'], true);
//loop through, replace " with " for input fields, decode utf8
foreach($mydata as $k => &$v) {
foreach($v as $k2 => $v2) {
$v[$k2] = utf8_decode(preg_replace('~"~', '"', $v2));
}
}

最新更新