Ваш вопрос немного неясен.
Если у вас есть текст 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");