Я создал файл 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);
Мне нужно сохранить его как UTF-8, и я не могу использовать JSON_UNESCAPED_UNICODE
в PHP 5.3. Итак, что мне теперь делать?
Если вы не можете использовать JSON_UNESCAPED_UNICODE
, вы можете, возможно, самостоятельно 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);
Вот пример в PHP5.3 .
Однако это не обязательно, поскольку любой парсер JSON должен правильно анализировать экранированные символы Unicode и возвращать исходную строку.
EDIT : Лучшим шаблоном для использования может быть /(?<!\\\\)\\\\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)); }
<?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":"جمهوری اسلامی ایران"}} */
Вы можете использовать подход mbstring :
Попробуйте вот так:
fwrite($myfile, mb_convert_encoding(json_encode($json), "UTF-8"));
$options = json_encode($optn); $arr = explode("\u", $options); foreach($arr as $key => $arr1){ if($arr1[0] == '0'){ $ascCode = substr($arr1, 0, 4); $newCode = html_entity_decode('&#x' .$ascCode. ';', ENT_COMPAT, 'UTF-8'); $arr[$key] = str_replace($ascCode, $newCode, $arr[$key]); } } $options = implode('', $arr);
заголовок
setlocale(LC_CTYPE, array('ru_RU.utf8', 'ru_RU.utf8')); setlocale(LC_ALL, array('ru_RU.utf8', 'ru_RU.utf8'));
тело
json_encode($post_all, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE);