Php / JSON: декодировать UTF8? - PullRequest
       2

Php / JSON: декодировать UTF8?

1 голос
/ 10 октября 2011

Я храню строку 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 "персонажи красиво?

Ответы [ 3 ]

8 голосов
/ 10 октября 2011

Мне кажется, что это нормально работает с 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"
}
3 голосов
/ 10 октября 2011

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) в символ 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);

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

2 голосов
/ 10 октября 2011

<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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...