我创建了一个JSON文件:
$json = array(
"Sample" =>array(
"context" => $context,
"date" => $date
)
);
$url= "sample.json";
$myfile = fopen($url, "w") or die("Unable to open file!");
fwrite($myfile, json_encode($json));
fclose($myfile);
Run Code Online (Sandbox Code Playgroud)
我需要将其保存为UTF-8,我不能JSON_UNESCAPED_UNICODE在PHP 5.3中使用.那我现在该怎么办?
cmb*_*ley 15
如果你不能使用JSON_UNESCAPED_UNICODE,你可能会在编码后自己忘记JSON:
$json = array(
'Sample' => array(
'context' => '?????? ?????? ?????'
)
);
$encoded = json_encode($json);
var_dump($encoded); // context: "\u062c\u0645..."
$unescaped = preg_replace_callback('/\\\\u(\w{4})/', function ($matches) {
return html_entity_decode('&#x' . $matches[1] . ';', ENT_COMPAT, 'UTF-8');
}, $encoded);
var_dump($unescaped); // context is unescaped
file_put_contents('sample.json', $unescaped);
Run Code Online (Sandbox Code Playgroud)
但是,这不是必需的,因为任何JSON解析器都应正确解析转义的Unicode字符并返回原始字符串.
编辑:一个更好的模式可能会使用/(?<!\\\\)\\\\u(\w{4})/,这可以避免错误地取消JSON序列"\\u1234".看一个例子.
\\(转义反斜杠本身)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));
}
Run Code Online (Sandbox Code Playgroud)
<?php
$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":"?????? ?????? ?????"}}
*/
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13595 次 |
| 最近记录: |