2012-08-07 70 views
2

我有一个数组,它是JSON编码并存储到数据库中。我所有的php文件都是utf8,而我的mysql数据库是utf8_general_ci。json_encode和口音

我的数组包含可能含有突出角色的名字,这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,这是要走的路吗? 它确实有效,但它似乎避免了问题而不是修复它。

+0

已经为每个'$ this-> opts ['name']'尝试过'utf8_decode'? – arnoudhgz 2012-08-07 20:56:32

回答

2

首先,在数据库表中存储JSON听起来像一个有缺陷的应用程序设计,但设置,预留第二...

这听起来像Bobby Tables领土给我。我的意思是,当您将数据插入数据库时​​,您听起来好像不是在逃避\。这意味着它是越来越剥离出来的字符串,所以你最终得到的是uxxxx代替\uxxxx,这意味着它们不能被解码。

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

+0

谢谢你的回答,你指出了错误。数据库中的数据确实不同,因为您说“\”已被删除。我使用addslashes修复了它,现在它运行良好。但是我仍然想知道这个\何时被删除。的print_r(json_encode($选项));在mysql插入前显示良好的值,但插入的值没有\。 – 2012-08-07 21:10:50

+0

@LucCR这是因为反斜杠也是(假设MySQL的?)数据库中的转义字符,因此MySQL将其解释为转义序列,吃它。请注意,addslashes对于转义数据库数据并不安全 - 您使用的是哪个数据库,如果使用了MySQL,您使用哪个扩展与之通信? – DaveRandom 2012-08-07 21:15:17

+0

这是一个mysql数据库,由于这是一个旧的项目,它使用mysql扩展。数据库结构也是如此,我无法控制。 – 2012-08-07 22:56:12

1

PHP json_decode不能与某些打得好,如果不是全部,UTF-8非ASCII字符(> 1个字节)。在prototype.js中,我不得不添加一个新的JSON编码函数来编码所有非ASCII字符(我没有这个代码了)。

尝试从phpjsjson_encode

+0

就是这样!使用nodejs的phpjs – brauliobo 2014-05-13 21:14:13