2012-08-07 44 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