Php / json: декодировать utf8?

Я храню строку json, содержащую некоторые (китайские?) Символы в базе данных mysql. Пример того, что находится в базе данных:

normal.text.\u8bf1\u60d1.rest.of.text 

На моей странице PHP я просто делаю json_decode того, что получаю от mysql, но он не отображается правильно, он показывает такие вещи, как «½ ± è§ »,

Я попытался выполнить запрос SET NAMES 'utf8' в начале моего файла, ничего не изменил. У меня уже есть следующий заголовок на моей веб-странице:

 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 

И, конечно, все мои php-файлы закодированы в UTF-8.

Вы знаете, как хорошо отображать эти символы «\ uXXXX»?

Unicode не UTF-8!

 $ echo -en '\x8b\xf1\x60\xd1\x00\n' | iconv -f unicodebig -t utf-8诱惑 

Это странная «кодировка». Я предполагаю, что каждый символ обычного текста длится «один байт» (US-ASCII)? Затем вам нужно извлечь последовательности \ u …., преобразовать последовательность в символ «двух байтов» и преобразовать этот символ с символом iconv("unicodebig", "utf-8", $character) в iconv("unicodebig", "utf-8", $character) UTF-8 (см. iconv в PHP-документации). Это работало на моей стороне:

 $in = "normal.text.\u8bf1\u60d1.rest.of.text"; function ewchar_to_utf8($matches) { $ewchar = $matches[1]; $binwchar = hexdec($ewchar); $wchar = chr(($binwchar >> 8) & 0xFF) . chr(($binwchar) & 0xFF); return iconv("unicodebig", "utf-8", $wchar); } function special_unicode_to_utf8($str) { return preg_replace_callback("/\\\u([[:xdigit:]]{4})/i", "ewchar_to_utf8", $str); } echo special_unicode_to_utf8($in); 

В противном случае нам нужно больше информации о том, как кодируется ваша строка в базе данных.

Кажется, это работает отлично для меня, с PHP 5.3.5 на Ubuntu 11.04:

 <?php header('Content-Type: text/plain; charset="UTF-8"'); $json = '[ "normal.text.\u8bf1\u60d1.rest.of.text" ]'; $decoded = json_decode($json, true); var_dump($decoded); 

Вывод:

 array(1) { [0]=> string(31) "normal.text.诱惑.rest.of.text" } 

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

Это красная сельдь. Если вы обслуживаете страницу через http, а ответ содержит заголовок Content-Type , метатег будет проигнорирован. По умолчанию PHP будет устанавливать такой заголовок, если вы не сделаете это явно. И значение по умолчанию установлено как iso-8859-1 .

Попробуйте эту строку:

 <?php header("Content-Type: text/html; charset=UTF-8");