[PHP] 解析中文 JSON 異常
在以 PHP 以 json_decode 解析 JSON 文件時,不斷發生錯誤導致結果為 Null,雖然利用 JSON Online Tester 檢測過 JSON 格式正確,但仍會出現 JSON_ERROR_SYNTAX 錯誤訊息,到底是為什麼呢?
首先我們先假定一段 JSON,並利用 json_decode 做解析後輸出:
<?php $jsonStr = '{ "USBVirusKille": { "Name": "USBVirusKiller", "Version": "1.5.0.0", "UpdateInfo": "更新伺服器位址;" } }'; $json = json_decode($jsonStr); echo $json->USBVirusKille->UpdateInfo; ?>
結果沒意外應該正常執行的程式碼,竟然意外地出現了出現了 Null(空白無顯示),利用 json_last_error() 發現是 Parse error: syntax error, unexpected end of file in test.php on line 12 。
經過搜尋後在 StackOverfile 上找到答案,回答者是這麼解釋的:I faced the same issue, actually there are some hidden characters unseen and you need to remove it. 意即在 JSON 讀取後有些字原是隱藏但無法辨識導致出錯,而我們必須要移除他。回答者也提供了一個適用於全域的程式碼來解決這樣的問題:
// This will remove unwanted characters. // Check http://www.php.net/chr for details for ($i = 0; $i <= 31; ++$i) { $checkLogin = str_replace(chr($i), "", $checkLogin); } $checkLogin = str_replace(chr(127), "", $checkLogin); // This is the most common part // Some file begins with 'efbbbf' to mark the beginning of the file. (binary level) // here we detect it and we remove it, basically it's the first 3 characters if (0 === strpos(bin2hex($checkLogin), 'efbbbf')) { $checkLogin = substr($checkLogin, 3); }
於是程式經過修改後就會變如下,也當然順利的輸出了「更新伺服器位址」的回答:
<?php $jsonStr = '{ "USBVirusKille": { "Name": "USBVirusKiller", "Version": "1.5.0.0", "UpdateInfo": "更新伺服器位址;" } }'; for ($i = 0; $i <= 31; ++$i) { $jsonStr = str_replace(chr($i), "", $jsonStr); } $jsonStr = str_replace(chr(127), "", $jsonStr); if (0 === strpos(bin2hex($jsonStr), 'efbbbf')) { $jsonStr = substr($jsonStr, 3); } $json = json_decode($jsonStr); echo $json->USBVirusKille->UpdateInfo; ?>
留言
張貼留言