2010-08-17 2 views
2

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

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

+1

http://stackoverflow.com/questions/3506120/unicode-surrogate-pairs-question Похоже, DUP. –

ответ

1

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

Если у вас есть ASCII текст со встроенными последовательностями 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 байта, так как это вне БМП).

Если весь ваш текст 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"); 
Смежные вопросы