Как заставить \ uXXXX правильно отображаться, используя PHP5 - PullRequest
3 голосов
/ 17 июля 2009

Я унаследовал базу данных, которая содержит строки, такие как:

u8d8a \ u4e9a \ u9a6c \ u900a: \ u7f51 \ u4e0a \ u8d2d \ u7269: \ u5728 \ u952e \ u562 \ u4e66 \ uff0ccd uff0 uc078 u5177 \ uff0c \ u5bb6 \ u5c45 \ uff0c \ u5316 \ u5986

Вопрос в том, как сделать так, чтобы это правильно отображалось на HTML-странице?

Я использую PHP5 для обработки строк.

Ответы [ 3 ]

4 голосов
/ 17 июля 2009

1) Я скачал и установил шрифт Unicode с именем CODE2000

2) Я написал это:

<?php header('Content-Type: text/html;charset=utf-8'); ?>
<head></head>
<body style="font-family: CODE2000">
<?php
// I had to remove some strings like ': ', 'DVD', 'CD' to make it in \uXXXX format
$s = '\u5353\u8d8a\u4e9a\u9a6c\u900a\u7f51\u4e0a\u8d2d\u7269\u5728\u7ebf\u9500\u552e\u56fe\u4e66\uff0c\uff0c\uff0c\u6570\u7801\uff0c\u73a9\u5177\uff0c\u5bb6\u5c45\uff0c\u5316\u5986';
$chars = explode('\\u', $s);
foreach ($chars as $char) {
  $c = iconv('utf-16', 'utf-8', hex2str($char));
  print $c;
}

function hex2str($hex) {
  $r = '';
  for ($i = 0; $i < strlen($hex) - 1; $i += 2)
    $r .= chr(hexdec($hex[$i] . $hex[$i + 1]));
  return $r;
}
?>
</body>
</html>

3) Это произвело символов http://img267.imageshack.us/img267/9759/49139858.png, что может быть правильным. Например. 1-й символ (5353) действительно это , а 2-й (8d8a) это . Конечно, я не могу быть уверен на 100%, но, похоже, подходит. Может быть, вы можете взять это отсюда.

Это было хорошее упражнение:)

3 голосов
/ 17 июля 2009

PHP <6, к сожалению, не знает Unicode, поэтому вы должны сделать все самостоятельно: </p>

  • Убедитесь, что ваша база данных использует кодировку с поддержкой Unicode для своих соединений. В MySQL, например, директивой является default-character-set =. UTF-8 - разумный выбор
  • Сообщите браузеру, какую кодировку вы используете. Есть несколько способов сделать это:

    1. Установите значение набора символов в заголовке Content-Type. Что-то вроде заголовок ('Content-Type: text / html; charset = utf-8');

    2. Используйте версию вышеуказанного заголовка.

    3. Установить параметр кодировки XML <? Xml encoding = "utf-8"?>

Вариант 1. имеет приоритет над 2. Я не уверен, где 3. подходит.

Если вам необходимо выполнить какую-либо обработку строки до отображения данных, убедитесь, что вы используете многобайтовые (mb_ *) строковые функции. Если у вас есть данные Unicode, поступающие из других источников в других кодировках, вам необходимо использовать mb_convert_encoding.

2 голосов
/ 17 июля 2009

На основе представления daremon, вот функция "unicode_decode", которая преобразует \ uXXXX в их аналоги UTF.

function unicode_decode($str){
    return preg_replace("/\\\u([0-9A-F]{4})/ie", "iconv('utf-16', 'utf-8', hex2str(\"$1\"))", $str);    
}
function hex2str($hex) {
    $r = '';
    for ($i = 0; $i < strlen($hex) - 1; $i += 2)
    $r .= chr(hexdec($hex[$i] . $hex[$i + 1]));
    return $r;
}
...