尝试使用json_encode保存带有特殊字符的数据。
代码示例:
$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"}
但不幸的是我有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兼容的解决方案?
如果您不能使用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":"جمهوری اسلامی ایران"}}
*/
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句