【发布时间】:2021-10-24 00:58:34
【问题描述】:
问题:包含“en dash”、“em dash”的 XML 文件的目录必须替换为常规的 ASCII 字符破折号。还有单/双左/右大引号,必须用 ASCII 字符直单/双引号替换。
由于工作限制,此处只能使用基于 microsoft 的计算机上的 VBA(无法访问 powershell、脚本语言、java 等。)
我了解到 VBA 可以解释 Unicode 字符,但它不能编写 unicode 字符。而不是编写 unicode 字符,而是将其替换为垃圾(即 Ite$&s,其中“e$&”是垃圾,输出应该是“It's”)
我尝试使用字符串操作的示例:
伪代码:
- 将 XML 内容转换为字符串
- 如果找到 Unicode 字符“破折号”则
-
- 用 ASCII 破折号/连字符替换
- 写入 XML 文件
XML 示例:(前两个破折号分别为破折号和破折号,在堆栈溢出时未正确显示)
<para> TEST REPLACE UNICODE CHARACTERS: — – - “ ” ‘ ’ '</para>
VBA 输出示例:
<para> TEST REPLACE UNICODE CHARACTERS: â€" â€" - “ â€� ‘ ’ '</para>
代码:
Const ForReading = 1
Const TristateTrue = -1
Dim FSO As Object: Set FSO = CreateObject("Scripting.FileSystemObject")
Dim XMLString As String
XMLString = FSO.OpenTextFile(FilePath, ForReading, TristateTrue).ReadAll
UpdatedXMLString = Replace(XMLString, ChrW(8211), Chr(45)) 'Replace En-Dash
UpdatedXMLString = Replace(UpdatedXMLString, ChrW(8212), Chr(45)) 'Replace Em-Dash
UpdatedXMLString = Replace(UpdatedXMLString, ChrW(8220), Chr(34)) 'Replace Left Double Curly
UpdatedXMLString = Replace(UpdatedXMLString, ChrW(8221), Chr(34)) 'Right Double Curly
Set objStream = CreateObject("ADODB.Stream")
objstream.Charset = "utf-8"
objstream.Open
objStream.WriteText UpdatedXMLString
objStream.SaveToFile UpdatedFilePath, 2
我的经验:
我知道文件中存在一个 En Dash,但是替换字符不成功。关于 En/Em 破折号,我不输入“If 语句”的逻辑。但是,我确实成功输入了 Curly Quotes 的“If 语句”,但字符替换不成功。
是否必须在“FSO.OpenTextFile().ReadAll”之前执行字符替换?在 XML 文件中用 ASCII 字符替换 Unicode 字符的适当代码流是什么?
【问题讨论】:
-
可能有助于显示您的完整代码,包括您如何重新保存内容。
-
请在您的问题中添加一个最小的 XML 文件示例。 XSLT 是处理您的任务的最佳方式。
-
你在说哪些引用,那些在 XML 中的数据中,例如内部元素或属性值?或者那些构成标记的一部分,即分隔属性值?这些输入文件是格式良好的 XML 吗?您可以使用 XSLT 1 通过 MSXML(新 MXML2.DOMDocument60)运行它们,如先前的评论中所述。
-
@TimWilliams 添加了我如何将内容输出到新文件。
-
@YitzhakKhabinsky 添加了 XML 的 sn-p
标签: xml vba unicode ms-word ascii