Как сохранить JSON как unescaped UTF-8 в PHP 5.3?

Я создал файл 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);