Выход UTF-16? Немного застрял - PullRequest
2 голосов
/ 18 августа 2010

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

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

Ответы [ 2 ]

3 голосов
/ 18 августа 2010

iconv('UTF-16', 'UTF-8', yourString)

1 голос
/ 18 августа 2010

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

Если у вас есть текст 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");
...