Я создал документ только с одним «большим пальцем вверх» Emoji (кодовая точка 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 через меню Вставка > Symbol > Шрифт "Segoe UI Emoji"> U + 1F44D (большой палец вверх), та же процедура Sub получает ожидаемые значения (в отладке; ?? не являются "реальными" символами,это суррогатные кодовые точки , которые по отдельности ничего не значат):
text = ??
length = 2
arrBytes = { 61, 216, 77, 220 }
(для информации код декодирует два символа в 👍
)
Как определить действительный символ, если Emoji вставлен с использованием Windows + ; ? (просьба пользователей выбрать обходной путь выше не является частьюмойвопрос)
ADDENDUM 26 мая : решение @Florent B. работает на всех моих 3 компьютерах (ActiveDocument.Content.InsertXML ActiveDocument.Content.XML
).Перезагрузка XML может оказать влияние на программы VBA, например, он перенумеровывает изображение «Идентификаторы формы», но это уже другая история.
ADDENDUM 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 равен почти , когдаЯ вставляю Emoji как символ, есть еще 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: MSWord 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