Вывод UTF-16? Немного застрял

У меня есть некоторые символы в кодировке UTF-16 в форме суррогатной пары. Я хочу вывести эти суррогатные пары в виде символов на экране.

Кто-нибудь знает, как это возможно?


person Jamie Redmond    schedule 17.08.2010    source источник
comment
stackoverflow.com/questions/3506120/ Похоже на дубликат .   -  person Jimithus    schedule 18.08.2010


Ответы (1)


Ваш вопрос немного не ясен.

Если у вас есть текст ASCII со встроенными escape-последовательностями UTF-16, вы можете преобразовать все в UTF-8 следующим образом:

function unescape_utf16($string) {
    /* go for possible surrogate pairs first */
    $string = preg_replace_callback(
        '/\\\\u(D[89ab][0-9a-f]{2})\\\\u(D[c-f][0-9a-f]{2})/i',
        function ($matches) {
            $d = pack("H*", $matches[1].$matches[2]);
            return mb_convert_encoding($d, "UTF-8", "UTF-16BE");
        }, $string);
    /* now the rest */
    $string = preg_replace_callback('/\\\\u([0-9a-f]{4})/i',
        function ($matches) {
            $d = pack("H*", $matches[1]);
            return mb_convert_encoding($d, "UTF-8", "UTF-16BE");
        }, $string);
    return $string;
}

$string = '\uD869\uDED6';
echo unescape_utf16($string);

что дает символ ???? в UTF-8 (требуется 4 байта, так как он находится за пределами BMP).

Если весь ваш текст имеет формат UTF-16 (включая HTML-теги и т. д.), вы можете просто указать браузеру, что вывод находится в формате UTF-16:

header("Content-type: text/html; charset=UTF-16");

Это бывает очень редко, потому что PHP-скрипты не могут быть написаны в UTF-16 (если только PHP не скомпилирован с поддержкой многобайтности), что затруднило бы печать буквенных строк.

Таким образом, у вас, вероятно, есть только фрагмент текста в UTF-16, который вы хотите преобразовать в ту кодировку, которую использует ваша веб-страница. Вы можете сделать это преобразование с помощью:

//replace UTF-8 with your actual page encoding
mb_convert_encoding($string, "UTF-8", "UTF-16");
person Artefacto    schedule 18.08.2010