Javascript 疯狂地使用JSON编码错误以及JS和PHP之间的差异
我手头上有一大堆与编码相关的bug 我有一个latin1的DB(我相信它接近Windows-1252),Windows-1252中有一个用户前端页面,Windows-1252中有一个AJAX后端。这些不能用自动取款机换 然而,由于JSON需要UTF8数据,我在使用德国Umlaute时遇到了很多麻烦 我目前正在从前端数据库中检索一些转义的示例数据Javascript 疯狂地使用JSON编码错误以及JS和PHP之间的差异,javascript,php,json,Javascript,Php,Json,我手头上有一大堆与编码相关的bug 我有一个latin1的DB(我相信它接近Windows-1252),Windows-1252中有一个用户前端页面,Windows-1252中有一个AJAX后端。这些不能用自动取款机换 然而,由于JSON需要UTF8数据,我在使用德国Umlaute时遇到了很多麻烦 我目前正在从前端数据库中检索一些转义的示例数据[{“\u00f6\u00e4\u00fc\u00df”}],并使用 foreach($example_array_of_objects as $k =&
[{“\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脚本时,我只从打印响应中获得垃圾:
öäüß
encodeURIComponent的转义类型与PHP不同。这令人愤怒
如何在JS中将“öäüß”转换为\u00f6\u00e4\u00fc\u00df(或者如何以某种方式同步JS/PHP/mySQL之间处理数据的方式)?曾经遇到过此类问题,但不是使用PHP,而是使用encodeURIComponent解决的。如果encodeURIComponent不适用于您,请尝试使用atob和btoa在两侧使用编码解码 您无法真正修改
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_编码($original_data_from_DB,'UTF-8','CP1252')
并在json_解码后获取数据
您应该使用mb_convert_编码($data_from_java_脚本,'CP1252','UTF-8')
我现在让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
[...]
用户前端(表格):
你到底是如何在JS中对数据进行字符串化,使其最终成为mojibake的?这几乎不可能,除非你一开始就在处理mojibake。
//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));
}
}