utf 16 — Как преобразовать суррогатные пары UTF16 в эквивалентную кодовую точку HEX в PHP?

Я делаю приложение, когда чат будет отправлен из приложения iOS, но администратор может просматривать чат из панели администратора, встроенной в PHP.

Из БД я буду получать чаты вроде этого:

Hi, Jax\ud83d\ude1b\ud83d\ude44! can we go for a coffee?

Я использую twemoji библиотека который может конвертировать HEX кодовые точки в изображения.

Скажем подробно,

В разделе PHP у меня есть следующий код: —

$text = "This is fun \u1f602! \u1f1e8 ";
$html = preg_replace("/\\\\u([0-9A-F]{2,5})/i", "&#x$1;", $text);
echo $html;

Теперь twemoji анализирует весь текст HTML-документа, чтобы заменить шестнадцатеричные кодовые точки на изображения.

window.onload = function() {

// Set the size of the rendered Emojis
// This can be set to 16x16, 36x36, or 72x72
twemoji.size = '16x16';

// Parse the document body and
// insert <img> tags in place of Unicode Emojis
twemoji.parse(document.body);
}

Итак, мне нужен текст для замены всех кодовых точек UTF-16 на HEX (для эмодзи).
Как я могу это сделать?

1

Решение

Здесь у вас есть двойная проблема:

  • Обнаружение закодированной суррогатной пары
  • На самом деле преобразование этой суррогатной пары в HTML-сущность

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

$text = "Hi, Jax\\ud83d\\ude1b\\ud83d\\ude44! can we go for a coffee?";

$result = preg_replace_callback('/\\\\u(d[89ab][0-9a-f]{2})\\\\u(d[c-f][0-9a-f]{2})/i', function ($matches) {
$first = $matches[1];
$second = $matches[2];
$value = ((eval("return 0x$first;") & 0x3ff) << 10) | (eval("return 0x$second;") & 0x3ff);
$value += 0x10000;
return "&#$value;";
}, $text);

echo $result;

Я знаю что используя eval почти всегда не рекомендуется, но это совершенно безопасно в этом примере из-за совпадений регулярного выражения (вы знаете, что совпадения содержат только шестнадцатеричные цифры).

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]