Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 疯狂地使用JSON编码错误以及JS和PHP之间的差异_Javascript_Php_Json - Fatal编程技术网

Javascript 疯狂地使用JSON编码错误以及JS和PHP之间的差异

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 =&

我手头上有一大堆与编码相关的bug

我有一个latin1的DB(我相信它接近Windows-1252),Windows-1252中有一个用户前端页面,Windows-1252中有一个AJAX后端。这些不能用自动取款机换

然而,由于JSON需要UTF8数据,我在使用德国Umlaute时遇到了很多麻烦

我目前正在从前端数据库中检索一些转义的示例数据
[{“\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));
    }
}