[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;
?>

留言

這個網誌中的熱門文章