Когда я использую json_encode для кодирования моих многоязычных строк, он также меняет специальные символы. Что делать, чтобы сохранить их одинаковыми.
Например
<? echo json_encode(array('şüğçö'));
Он возвращает что-то вроде ["\ u015f \ u00fc \ u011f \ u00e7 \ u00f6"]
Но я хочу ["şüğçö"]
попробуй:
<? echo json_encode(array('şüğçö'), JSON_UNESCAPED_UNICODE);
В JSON любой символ в строках может быть представлен escape-последовательности Unicode. Таким образом, "\u015f\u00fc\u011f\u00e7\u00f6"
семантически равно "şüğçö"
.
Хотя этот символ также можно использовать plain, json_encode
вероятно, предпочитает escape-последовательности Unicode, чтобы избежать проблем с кодировкой символов.
Сначала используйте json_encode()
для кодирования строки и сохранения ее в переменной.
Затем просто используйте preg_replace()
чтобы снова заменить все \ uxxxx на unicode.
PHP 5.4 добавляет параметр JSON_UNESCAPED_UNICODE
, который делает то, что вы хотите. Обратите внимание, что json_encode
всегда выводит UTF-8.
json_encode()
не предоставляет никаких параметров для выбора кодировки, в которой кодировка находится в версиях до 5.4.
<?php print_r(json_decode(json_encode(array('şüğçö')))); /* Array ( [0] => şüğçö ) */
Так вам действительно нужно держать эти персонажи незанятыми в JSON?
Решение Jars_encode charset для PHP 5.3.3
Поскольку JSON_UNESCAPED_UNICODE
не работает в PHP 5.3.3, поэтому мы использовали этот метод и он работает.
$data = array( 'text' => 'Päiväkampanjat' ); $json_encode = json_encode($data); var_dump($json_encode); // text: "P\u00e4iv\u00e4kampanjat" $unescaped_data = preg_replace_callback('/\\\\u(\w{4})/', function ($matches) { return html_entity_decode('&#x' . $matches[1] . ';', ENT_COMPAT, 'UTF-8'); }, $json_encode); var_dump($unescaped); // text is unescaped -> Päiväkampanjat