【问题标题】:json_encode and accentjson_encode 和重音
【发布时间】:2012-08-04 22:33:09
【问题描述】:

我有一个 json 编码并存储到数据库中的数组。我所有的php文件都是utf8,我的mysql数据库是utf8_general_ci。

我的数组包含可能包含重音字符的名称,json_encode 将其转换为 \u 字符。这个数组被存储到我的数据库中。当我使用 jQuery.parseJSON 时,重音字符正确显示。

info = jQuery.parseJSON(data);
console.log(info);

//"Bob Épine" which is good

但是当我想在 PHP 中使用 json_decode 时,\u 字符会保留。

print_r($this->opts['name']);
echo $this->opts['name'];

//Bob \u00c9pine
//Bob u00c9pine

我发现了这个功能PHP: Replace \u characters in json string,这是要走的路吗? 它确实有效,但它似乎避免了问题而不是修复它。

【问题讨论】:

  • 已经为每个$this->opts['name']尝试了utf8_decode

标签: php javascript json encoding


【解决方案1】:

首先,将 JSON 存储在 DB 表中听起来像是一种有缺陷的应用程序设计,但暂时搁置一下……

对我来说,这听起来像是Bobby Tables 领土。我的意思是,当您将数据插入数据库时​​,听起来您并没有转义\。这意味着它被从字符串中剥离出来,所以你最终得到的是uxxxx而不是\uxxxx,这意味着它们无法被解码。

现在,解决这个问题的方法多种多样,但您需要做的第一件事是确保数据正确插入到数据库中,并且编码的 JSON 字符串与您输入的字符串相同它。如果你这样做并且你发现你仍然有这个问题,我有一个我前一段时间写的函数,它将 unicode 代码点转换为它们的二进制表示(我只是为你找到它)

【讨论】:

  • 感谢您的回答,您指出了错误。数据库中的数据确实不同,正如您所说的 \ 已删除。我用addlashes修复了它现在工作得很好。但我仍然想知道这个 \ 什么时候被删除。 print_r(json_encode($options));写在 mysql insert 之前显示好的值,但插入的值没有 \.
  • @LucCR 那是因为反斜杠也是(假设 MySQL?)数据库转义字符,所以 MySQL 将其解释为转义序列并吃掉它。请注意,对于转义数据库数据,addlashes 并不是很安全——您使用的是什么数据库,如果是 MySQL,您使用哪个扩展程序与之通信?
  • 这是一个 mysql 数据库,由于这是一个旧项目,它使用 mysql 扩展。数据库结构也是如此,我无法控制。
  • @LucCR 好吧,您绝对应该使用mysql_real_escape_string() 而不是addslashes()。尽管表现不佳,但它实际上是完全安全的,只要您从不执行 SET NAMES 查询,这是无论如何都没有人真正做过的事情。
  • 终于解决了我所有的问题。我想在插入之前我不需要 mysql_real_escape_string 我的 json_encode 数据,但似乎这是个坏主意。
【解决方案2】:

PHP json_decode 不能很好地处理一些(如果不是全部)UTF-8 非 ASCII 字符(>1 字节)。在prototype.js 中,我必须添加一个新的JSON 编码函数,该函数将对所有非A​​SCII 字符进行编码(我不再拥有该代码)。

试试phpjs库中的json_encode

【讨论】:

  • 就是这样!使用来自nodejs的phpjs
猜你喜欢
  • 2013-07-01
  • 2017-03-24
  • 1970-01-01
  • 2020-12-08
  • 2014-02-28
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
相关资源
最近更新 更多