VBA
February 18, 2022

Эмодзи на 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

Установим нужный шрифт и размер, после чего потренируемся на кошках:

Процедура вставки символа с кодом 0x1f431 и результат её работы

Помните, что сложные эмодзи могут состоять из нескольких подряд идущих символов юникода, но не все системы могут правильно это отобразить.