Проблема json_encode utf-8

У меня проблема с функцией 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 .