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

标签 javascript php json

与编码相关的错误让我一团糟。

我有一个带有 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/

相关文章:

javascript - 使用 Ajax 请求单击链接后更改 div 的内容

php - 我的页面受到 xss 攻击,但 ftp 上的所有文件都没有更改?

javascript - 是否可以将 HTML id 设置为 json 对象并将其传递给另一个函数?

java - 在 Java/Android 中使用 Flexjson 将 JSONObject 映射到列表

javascript - 在单个 html 页面中下载两个不同 d3 图的图像?

javascript - 为什么 array.length 返回错误的数字?

javascript - 如何使用 Next.js 和 Rails 后端安全地存储 JWT?

java - 人类友好的唯一 URL

php - 手动获取从主要 WordPress 网站到 WordPress 博客的链接

node.js - JSON 有效时 JSON 输入意外结束