У меня проблема с функцией json_encode со специальными символами.
Например, я стараюсь:
$string="Svrček"; echo "ENCODING=".mb_detect_encoding($string); //ENCODING=UTF-8 echo "JSON=".json_encode($string); //JSON="Svr\u010dek"
Что я могу сделать, чтобы правильно отобразить строку, поэтому JSON = «Svrček»?
Большое спасибо.
json_encode()
самом деле не выводит JSON *. Он выводит строку javascript. (Он выводит JSON, когда вы даете ему объект или массив для кодирования.) Это прекрасно, поскольку строка javascript – это то, что вы хотите.
В javascript (и в JSON) č
может быть экранировано как \u010
. Эти два эквивалента. Поэтому нет ничего плохого в том, что делает json_encode()
. Он должен работать нормально. Я был бы очень удивлен, если это на самом деле вызывает у вас любую проблему. Однако, если передача безопасна в кодировке Unicode (обычно UTF-8) †, нет необходимости и в этом. Если вы хотите отключить экранирование, вы можете сделать так: json_encode('Svrček', JSON_UNESCAPED_UNICODE)
. Обратите внимание, что флаг JSON_UNESCAPED_UNICODE
был введен в PHP 5.4.0 и недоступен в более ранних версиях.
Кстати, вопреки тому, что говорит @onteria_, JSON действительно использует UTF-8 :
Кодировка символов текста JSON всегда является Unicode. UTF-8 – единственная кодировка, которая имеет смысл на проводе, но разрешены UTF-16 и UTF-32.
* Или, по крайней мере, это не выводит JSON, как определено в RFC 4627 . Однако существуют другие определения JSON , по которым допустимы скалярные значения .
† JSON может быть в UTF-8, UTF-16LE, UTF-16BE, UFT-32LE или UTF-32BE.
Итак, после того как вы подключились к базе данных в своем php-скрипте, поместите эту строку, и она должна работать, по крайней мере, она решила мою проблему:
mysql_query('SET CHARACTER SET utf8');
Да, json_encode
избегает символов, отличных от ascii. Если вы декодируете его, вы получите исходный результат:
$string="こんにちは"; echo "ENCODING: " . mb_detect_encoding($string) . "\n"; $encoded = json_encode($string); echo "ENCODED JSON: $encoded\n"; $decoded = json_decode($encoded); echo "DECODED JSON: $decoded\n";
Вывод:
ENCODING: UTF-8 ENCODED JSON: "\u3053\u3093\u306b\u3061\u306f" DECODED JSON: こんにちは
EDIT : ничего не стоит:
JSON использует Unicode исключительно.
Формат самодокументирования, который описывает структуру и имена полей, а также конкретные значения;
Источник: http://www.json.org/fatfree.html
Он использует Unicode NOT UTF-8. Этот FAQ объясняет разницу между UTF-8 и Unicode:
http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
Вы используете JSON, ваши символы, отличные от ascii, получают escape-коды в кодах Unicode. Например こ = кодовая точка 3053 .