2016-09-27 58 views
1

嘗試使用json_encode保存帶特殊字符的數據。json_encode PHP 5.3.3中的UTF-8

代碼示例:

$a = array("Name" => "SáENZ PEñA"); 
echo "Normal : ", json_encode($a), "<br>"; 
echo "Unicode : ", json_encode($a, JSON_UNESCAPED_UNICODE), "<br>"; 

JSON_UNESCAPED_UNICODE解決問題與PHP 5.6

Normal : {"Name":"S\u00e1ENZ PE\u00f1A"} 
Unicode : {"Name":"SáENZ PEñA"} 

但unfortunelly我有PHP 5.3:

Normal : {"Name":"S\u00e1ENZ PE\u00f1A"} 
Unicode : 
Warning: json_encode() expects parameter 2 to be long, string given in /var/www/.../TEST.php on line 4 

與PHP作品的任何解決方案5.3?

+0

爲什麼你通過已編碼的數據重新編碼?傳遞數組 –

+0

用fwrite將數據保存在json文件中 – Clementine

回答

1

如果您不能使用JSON_UNESCAPED_UNICODE,你很可能取消轉義的JSON自己它被編碼後:

  • 與\兼容(轉義反斜線本身)
  • 與JSON_HEX_兼容*標誌

    function raw_json_encode($input, $flags = 0) { $fails = implode('|', array_filter(array( '\\\\', $flags & JSON_HEX_TAG ? 'u003[CE]' : '', $flags & JSON_HEX_AMP ? 'u0026' : '', $flags & JSON_HEX_APOS ? 'u0027' : '', $flags & JSON_HEX_QUOT ? 'u0022' : '', ))); $pattern = "/\\\\(?:(?:$fails)(*SKIP)(*FAIL)|u([0-9a-fA-F]{4}))/"; $callback = function ($m) { return html_entity_decode("&#x$m[1];", ENT_QUOTES, 'UTF-8'); }; return preg_replace_callback($pattern, $callback, json_encode($input, $flags)); }

防爆充足的

<?php 

function raw_json_encode($input, $flags = 0) { 
    $fails = implode('|', array_filter(array(
     '\\\\', 
     $flags & JSON_HEX_TAG ? 'u003[CE]' : '', 
     $flags & JSON_HEX_AMP ? 'u0026' : '', 
     $flags & JSON_HEX_APOS ? 'u0027' : '', 
     $flags & JSON_HEX_QUOT ? 'u0022' : '', 
    ))); 
    $pattern = "/\\\\(?:(?:$fails)(*SKIP)(*FAIL)|u([0-9a-fA-F]{4}))/"; 
    $callback = function ($m) { 
     return html_entity_decode("&#x$m[1];", ENT_QUOTES, 'UTF-8'); 
    }; 
    return preg_replace_callback($pattern, $callback, json_encode($input, $flags)); 
} 

$json = array(
    'Sample' => array(
     'specialchars' => '<x>& \' "</x>', 
     'backslashes' => '\\u0020', 
     'context' => 'جمهوری اسلامی ایران', 
    ) 
); 

echo raw_json_encode($json, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT); 

/* 
{"Sample":{"specialchars":"\u003Cx\u003E\u0026 \u0027 \u0022\u003C\/x\u003E","backslashes":"\\u0020","context":"جمهوری اسلامی ایران"}} 
*/