gpt4 book ai didi

vba - Word VBA程序读取表情符号字符(4个字节)为“12”

转载 作者:行者123 更新时间:2023-12-03 13:37:14 24 4
gpt4 key购买 nike

我创建了一个文档,它只有一个通过标准Windows +插入的“竖起大拇指” Emoji(Unicode代码点U + 1F44D);捷径:

Windows + ; shortcut for Emojis

但是我无法通过VBA获得其实际代码点。

我得到了这些值(调试):

text = 12
length = 2
arrBytes = { 49, 0, 50, 0 }


使用以下子过程:

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


但是,如果我通过菜单“插入”>“符号”>“字体” Segoe UI Emoji”> U + 1F44D(竖起大拇指)插入了相同的表情符号,则相同的Sub过程将获得我期望的值(在调试中; ??不是“真实的”)字符,它们是 surrogate code points,分别表示无意义):

text = ??
length = 2
arrBytes = { 61, 216, 77, 220 }


(有关信息,此 code将两个字符解码为 &#x1F44D

如果使用Windows +插入了表情符号,如何确定实际字符? (要求用户选择上述解决方法不是我的问题的一部分)

附录5月26日:@Florent B.的解决方案可在我的所有3台计算机( ActiveDocument.Content.InsertXML ActiveDocument.Content.XML)上使用。重新加载XML可能会对VBA程序产生影响,例如,它对图像“ Shape ID”进行了重新编号,但这是另一回事了。

5月22日,增补:对于Windows +所添加的符号,我只能在文档Range对象的 XML属性中找到正确的值(4个字节{61、216、77、220}),但这需要我解析整个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几乎相同,还有另外两个“ 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(联想X230):


MS Word Office 365 1904(16.0.11601.20174)32位,Windows 10专业版10.0.17763 x64
同样在升级到Office 365 1907 16.0.11901.20176,MSO(16.0.11901.20070)32位,Windows 10 Professional 1809 17763.652 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企业版10.0.17763 x64

最佳答案

我希望这会有所帮助:以@SandraRossi的上述评论为基础,似乎表情符号面板中的输入未正确转换为代理代码点。如果将包含两个符号(一个来自Emoji面板,另一个来自通过菜单,如您所述)的文档另存为XML文档,则会注意到以下区别:

表情符号输入:

<w:r w:rsidR="003814F5">
<w:rPr>
<mc:AlternateContent>
<mc:Choice Requires="w16se">
<w:rFonts w:ascii="Segoe UI Emoji" w:hAnsi="Segoe UI Emoji"/>
</mc:Choice>
<mc:Fallback>
<w:rFonts w:hint="eastAsia"/>
</mc:Fallback>
</mc:AlternateContent>
</w:rPr>
<mc:AlternateContent>
<mc:Choice Requires="w16se">
<w16se:symEx w16se:font="@SimHei" w16se:char="1F44D"/>
</mc:Choice>
<mc:Fallback>
<w:t>👍</w:t>
</mc:Fallback>
</mc:AlternateContent>
</w:r>


菜单(符号)输入:

<w:r w:rsidR="003814F5">
<w:rPr>
<w:rFonts w:ascii="Segoe UI Emoji" w:hAnsi="Segoe UI Emoji"/>
</w:rPr>
<w:t xml:space="preserve"> is not 👍</w:t>
</w:r>


<w16se:symEx w16se:font="@SimHei" w16se:char="1F44D"/>行是此处的主要区别。常规(菜单->插入符号)表情符号用作备用。

似乎只有Word才有问题。我在Excel(和PowerPoint)上尝试了相同的表情符号面板输入,并且在debug ??中获得了正确的值,该值在Excel中以及复制回Word时均转换为Unicode代码点 U+1F44D

关于vba - Word VBA程序读取表情符号字符(4个字节)为“12”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56206291/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com