Я создал документ только с одним эмодзи "Большой палец вверх" (кодовая точка Unicode U + 1F44D), который я вставил с помощью стандартного ярлыка Windows + ;:
Но я не могу получить его настоящий код с VBA.
Я получаю эти значения (отладка):
text = 12
length = 2
arrBytes = { 49, 0, 50, 0 }
с помощью следующей процедуры Sub:
Sub test()
Dim text As String
Dim length As Integer
Dim arrBytes() As Byte
text = ActiveDocument.Range.Characters(1).text
length = Len(ActiveDocument.Range.Characters(1).text)
arrBytes = ActiveDocument.Range.Characters(1).text
End Sub
Но если бы я вставил тот же Emoji через меню Insert> Symbol> Шрифт "Segoe UI Emoji"> U+1F44D (палец вверх), та же процедура Sub получает ожидаемые значения (в отладке;?? не "настоящие" символы, это суррогатные кодовые точки, которые по отдельности ничего не значат):
text = ??
length = 2
arrBytes = { 61, 216, 77, 220 }
(для информации этот код декодирует два символа в 👍
)
Как определить действительный символ, если Emoji вставлен, используя Windows + ;? (просьба пользователей выбрать обходной путь выше не является частью моего вопроса)
ДОБАВЛЕНИЕ 26 мая: решение @Florent B. работает на всех моих 3 компьютерах (ActiveDocument.Content.InsertXML ActiveDocument.Content.XML
). Перезагрузка XML может оказать влияние на программы VBA, например, он перенумеровывает образ "Идентификаторы формы", но это уже другая история.
ДОБАВЛЕНИЕ 22 мая: для символа, добавленного с помощью Windows + ;, я могу найти правильное значение (4 байта {61, 216, 77, 220}) только в свойстве XML
объекта Range, но для этого требуется что я анализирую весь XML и определяю, какие XML-символы соответствуют каким позициям объектов Range, к сожалению, мне кажется, что для этого требуется много знаний или предположений. Вот часть XML, где я вижу 4 байта (<w:t>??</w:t>
где?? соответствует 4 байтам):
<?xml version="1.0" standalone="yes"?>
<?mso-application progid="Word.Document"?>
<w:wordDocument ...>
... (around 23.000 characters)
<w:body>
<wx:sect>
<w:p wsp:rsidR="002703DB" wsp:rsidRDefault="003926FB">
<w:r>
<w:rPr>
<w:rFonts w:ascii="Segoe UI Emoji" w:h-ansi="Segoe UI Emoji"/>
<wx:font wx:val="Segoe UI Emoji"/>
</w:rPr>
<w:t>??</w:t>
</w:r>
</w:p>
<w:sectPr wsp:rsidR="002703DB" wsp:rsidSect="002849CD"><w:pgSz w:w="11906"
w:h="16838"/><w:pgMar w:top="1417" w:right="1417" w:bottom="1417"
w:left="1417" w:header="708" w:footer="708" w:gutter="0"/><w:cols
w:space="708"/><w:docGrid w:line-pitch="360"/></w:sectPr>
</wx:sect>
</w:body>
</w:wordDocument>
XML почти такой же, когда я вставляю эмодзи в качестве символа, есть еще 2 "rFonts":
<w:body>
<wx:sect>
<w:p wsp:rsidR="00CD420D" wsp:rsidRDefault="00CD420D">
<w:r>
<w:rPr>
<w:rFonts w:ascii="Segoe UI Emoji" w:fareast="Segoe UI Emoji"
w:h-ansi="Segoe UI Emoji" w:cs="Segoe UI Emoji"/>
<wx:font wx:val="Segoe UI Emoji"/>
</w:rPr>
<w:t>??</w:t>
</w:r>
</w:p>
<w:sectPr wsp:rsidR="00CD420D" wsp:rsidSect="002849CD"><w:pgSz w:w="11906"
w:h="16838"/><w:pgMar w:top="1417" w:right="1417" w:bottom="1417"
w:left="1417" w:header="708" w:footer="708" w:gutter="0"/><w:cols
w:space="708"/><w:docGrid w:line-pitch="360"/></w:sectPr>
</wx:sect>
</w:body>
</w:wordDocument>
PS: компьютеры/программное обеспечение, где я мог воспроизвести проблему:
- Компьютер 1: MS Word Office 365 1904 (16.0.11601.20174) 32 бита, Windows 10 Professional 10.0.17763 x64
- Компьютер 2: MS Word Office 365 1904 (16.0.11601.20184) 64 бита, Windows 10 Professional 1809 17763.503 x64
- Компьютер 3: MS Word Office 365 ProPlus 1808 (16.0.10730.20334) 64 бита, Windows 10 Enterprise 10.0.17763 x64