Подтвердить что ты не робот

Проблема 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"?

Большое спасибо.

4b9b3361

Ответ 1

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.

Ответ 2

Итак, после того, как вы создали соединение с базой данных в своем php script, поместите эту строку, и она должна работать, по крайней мере, она решила мою проблему:

mysql_query('SET CHARACTER SET utf8');

Ответ 3

Да, 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 использует только Юникод.

Самодокументирующийся формат, который описывает структуру и имена полей как а также конкретные значения;

Источник: http://www.json.org/fatfree.html

Он использует Unicode НЕ UTF-8. Этот FAQ объясняет разницу между UTF-8 и Unicode:

http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8

Вы используете JSON, ваши символы не-ascii получают экранированные кодовые точки Unicode. Например こ = кодовая точка 3053.