Эмодзи на VBA
🌰 Используем суррогатные пары для отображения символов с кодами > 65535 🐱
Функция ChrW(код)
не работает для символов с кодом более 65535. Как же отобразить в документе, например, символ 🐱 с кодом 0x1F431 (128049)?
Такие символы мы можем закодировать двумя кодовыми единицами. Пара таких кодов называется суррогатной парой юникода.
Первая кодовая единица суррогатной пары всегда находится в диапазоне от 0xD800 до 0xDBFF и называется верхней частью пары.
Вторая кодовая единица суррогатной пары всегда находится в диапазоне от 0xDC00 до 0xDFFF и называется нижней частью пары.
Обратите внимание, что суррогатная пара представляет только один символ.
Для вычисления этих кодов используются следующие формулы (в excel vba):
Type SurrogatePair lo As Long hi As Long End Type
Function Code2pair(codepoint As Long) As SurrogatePair ' Расчёт суррогатной пары UTF-16 Dim sp As SurrogatePair sp.hi = WorksheetFunction.Floor((codepoint - &H10000) / &H400, 1) + &HD800 sp.lo = (codepoint - &H10000) Mod &H400 + &HDC00 Code2pair = sp End Function
Теперь можно написать функцию, которая выведет нужный символ по его коду с помощью суррогатной пары:
Function Rune(codepoint As Long) As String ' Вывод символа с указанным кодом Dim sp As SurrogatePair sp = Code2pair(codepoint) Rune = ChrW(sp.hi) & ChrW(sp.lo) End Function
Установим нужный шрифт и размер, после чего потренируемся на кошках:
Помните, что сложные эмодзи могут состоять из нескольких подряд идущих символов юникода, но не все системы могут правильно это отобразить.