我手上有很多与编码相关的错误。
我有一个带有 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));
}
}