【问题标题】:Printing UTF32 Symbols in Word Macros在 Word 宏中打印 UTF32 符号
【发布时间】:2016-02-25 16:38:09
【问题描述】:

我正在使用 VBA for Word,并且正在开发一个在 Word 文档中进行批量查找/替换的项目。我从 .csv 导入了查找/替换术语的列表。

我遇到的问题是我想用代表单词的符号替换单词。例如,如果我使用面包这个词,我想将它替换为面包的 UTF-32 符号(Unicode 十进制 127838/十六进制 0x1f35e)。当我使用内置的 MS-Word 查找/替换手动执行此操作时,效果很好,我只需在替换框中输入 alt+127838 即可顺利工作,但在 UTF-32 查找/替换batch 似乎给我带来了麻烦。

如果我使用 ChrW() 它将超出范围,因为 ChrW 只接受高达 65,535 的值。它无法处理第 17 位。如果我尝试插入它,它会给我一个运行时错误。

我尝试使用 \U 转义字符,但它只是用“\U127838”字面替换它,这不是很有帮助。不确定 VBA 是否甚至支持 unicode 转义字符。如果我不把它放在引号中,它会给我一个语法错误。

虽然我对编程并不陌生,但我对 VBA 和 VB 还是很陌生。我在网上查了一下,似乎 VB 的 UTF32Encoding 类不适用于 VBA

https://msdn.microsoft.com/en-us/library/system.text.utf32encoding(v=vs.90).aspx

可能是我不熟悉 VB 和 VBA 之间的细微差别,但是当我尝试初始化程序时:

将 u32LE 调暗为新的 UTF32Encoding(False, True)

它在我的 VBA 代码中给了我一个语法错误。

我尝试使用 Imports 语句,但这也让我的编译器感到困惑。我不确定我是否做错了什么,或者 VBA 是否不支持此类。

如果 VBA 不支持打印 UTF32 字符,请告诉我,我应该尝试使用 Python 或 Java 之类的东西。非常感谢您的帮助!

这是我正在编写的函数。我注释掉了 Imports 行,因为它给了我一个错误(它说找不到突出显示“.Text”的方法或成员)

Sub findReplaceUnicode(ByVal findItem As String, unicode As Long)

'Imports System.Text
Dim u32LE As New UTF32Encoding(False, True)



Selection.find.ClearFormatting
Selection.find.Replacement.ClearFormatting
With Selection.find
    .Text = findItem
    .Replacement.Text = ChrW(unicode)
    .Replacement.font.Name = "Segoe UI Symbol"
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
End With
Selection.find.Execute replace:=wdReplaceAll

结束子

【问题讨论】:

  • 好吧,首先你不能在你的 VBA 代码中使用 .NET 命名空间。 VBA 对 .NET 一无所知,因此在 VB.NET 中有效的东西在 VBA 中将不会有效,除非该功能在大约十年前已经存在于 VBA 中。所以没有“导入”(只有工具/参考),也没有 UTF32Encoding。如果您尝试在有效的手动搜索中录制宏,会发生什么?当您运行生成的宏时,您是否获得了有效的语法?
  • 感谢您的提示!这有助于我更好地理解 VBA/VB。另外,我是宏的新手,所以我不知道您可以录制宏并且会变成代码。再次感谢!当我这样做时,它将符号面包表示为两个 UTF-16 值的组合:ChrW(55356) 和 ChrW(57182) 我可以在这里查看:fileformat.info/info/unicode/char/1f35e/index.htm 我的下一个问题是是否有任何UTF-32 名称和双重 UTF-16 名称之间的直观联系,或者我是否必须重新键入源表中的每个符号。
  • 我不知道你的第二个问题,编码不是我的“东西” :-) 最好在一个新问题中提出这个问题,这样你就可以获得更好的可见性。顺便说一句,因为您是 SO 新手:“投票”对您有帮助的事情被认为是一种很好的做法。建议您将内容总结并写到“答案”中,然后将其标记为答案,以便以后有相同问题的其他人可以找到并知道什么有效。

标签: vba ms-word utf-32


【解决方案1】:

首先,您不能在 VBA 代码中使用 .NET 命名空间。在 VBA 程序中使用 VB 类是错误的。没有兼容性。

解决这个问题的方法是不使用 UTF32。但是,其中许多符号也具有双重 UTF-16 编码。例如,面包符号 (UTF-32 0x1f35e) 也可以由两个 UTF-16 条目键入:0xD83C 0xDF5E (d83cdf5e)。

http://www.fileformat.info/info/unicode/char/1f35e/index.htm

File Format.info 是查找该翻译的有用站点。用超过 17 位替换符号的一种方法是输入:

.Replacement.Text = ChrW(first) & ChrW(second)

其中 first 是复合 UTF-16 条目的前半部分, second 是复合 UTF-16 条目的后半部分。

一个好的经验法则是,当有疑问时,手动记录宏,然后对结果进行逆向工程。

【讨论】:

    猜你喜欢
    • 2013-06-14
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 2017-10-05
    • 2011-06-26
    • 2020-06-11
    相关资源
    最近更新 更多