最近在開發(fā)項(xiàng)目的時(shí)候,定義了一個(gè)內(nèi)容比較多的數(shù)組,目的呢是為了在多個(gè)功能點(diǎn)不用多次的去定義這個(gè)數(shù)組,畢竟內(nèi)容很多重復(fù)定義看起來也很不舒服,為了更好的儲(chǔ)存這個(gè)數(shù)組的數(shù)據(jù)啊,我直接把他格式化成了JSON字符串,存到數(shù)據(jù)庫里面去,這樣也可以通過后臺(tái)去管理和修改這個(gè)數(shù)組的內(nèi)容,來實(shí)現(xiàn)相關(guān)的功能。
但是在調(diào)用的時(shí)候卻發(fā)生了一個(gè)靈異的事件,明明直接使用JSON_DECODE方法就可以把json字符串還原成數(shù)組了,結(jié)果卻返回了null,很是奇怪,于是我就打印了一下這個(gè)json字符串,輸出的內(nèi)容沒問題啊,格式也沒問題。
如圖,上下兩個(gè)變量輸出的內(nèi)容一摸一樣。但是奇怪的是長度,長度竟然不一樣,有點(diǎn)奇怪啊。很明顯兩個(gè)字符串的結(jié)構(gòu)和內(nèi)容都是一樣的,但是長度不一樣,我就考慮難道是字符集發(fā)生了變化嗎,這么奇怪嗎,但是用mb_detect_encoding函數(shù)打印了一下字符串的字符集,結(jié)果是UTF-8沒有問題。
這個(gè)時(shí)候,有點(diǎn)無解了啊,很明顯這個(gè)長的字符串里面有很多隱形的字節(jié)啊,導(dǎo)致了json_decode反序列化json字符串失敗了。然后我就想里面是不是又什么\n\r的字符啊,看不到的字符。用字符串替換了一下,也沒有反應(yīng)。
最后發(fā)現(xiàn)原來是,提交數(shù)據(jù)的時(shí)候由于對(duì)數(shù)據(jù)又XSS過濾功能,直接被htmlspecialchars函數(shù)把我這些內(nèi)容給換為 HTML 實(shí)體了,結(jié)果可不就是在打印的時(shí)候沒有任何的變化,但是字符串的長度比原有的長度長了很多。找到問題,解決問題就比較簡(jiǎn)單了,把內(nèi)容使用htmlspecialchars_decode函數(shù)將內(nèi)容重新格式化為字符串,在json_decode轉(zhuǎn)換成數(shù)組,就可以正常使用了。