Я храню строку 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");