У меня есть некоторые кодированные символы UTF-16 в форме суррогатной пары. Я хочу вывести эти суррогатные пары как символы на экране.
Кто-нибудь знает, как это возможно?
iconv('UTF-16', 'UTF-8', yourString)
Ваш вопрос немного неясен.
Если у вас есть текст 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[cf][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");