如何使用VBA替换XML文件中的Unicode字符为ASCII字符
问题根因分析
你遇到的替换失效、输出乱码问题核心原因是读写环节的编码不匹配:
- FSO 的
OpenTextFile方法参数TristateTrue对应读取 UTF-16(Unicode)编码文件,你的 XML 是 UTF-8 编码,用 FSO 读取时就已经把字符解析为乱码,内存中的字符串码点和目标ChrW()字符完全不匹配,自然无法触发替换逻辑 - 原有代码遗漏了左右单弯引号的替换规则
- 混用 FSO 和 ADODB.Stream 两套读写工具,进一步放大了编码不一致的问题
正确实现流程
全程使用 ADODB.Stream 处理文件读写,避免编码兼容问题,流程如下:
- 用 ADODB.Stream 明确指定 UTF-8 编码读取 XML 文件到内存字符串
- 对内存字符串执行所有目标字符替换操作
- 再用 ADODB.Stream 指定 UTF-8 编码将替换后的字符串写入新文件
修正后可直接运行的代码
Sub ReplaceUnicodeInXML() Dim FilePath As String, UpdatedFilePath As String ' 替换为实际的输入、输出文件路径 FilePath = "C:\你的文件路径\输入.xml" UpdatedFilePath = "C:\你的文件路径\输出.xml" Dim objStream As Object Set objStream = CreateObject("ADODB.Stream") ' 读取UTF-8编码的源文件 With objStream .Charset = "UTF-8" .Open .LoadFromFile FilePath Dim XMLString As String XMLString = .ReadText() .Close End With ' 全量替换目标字符 Dim UpdatedXMLString As String UpdatedXMLString = XMLString ' 替换长短横为ASCII短横线 UpdatedXMLString = Replace(UpdatedXMLString, ChrW(8211), Chr(45)) ' En Dash UpdatedXMLString = Replace(UpdatedXMLString, ChrW(8212), Chr(45)) ' Em Dash ' 替换双弯引号为ASCII直双引号 UpdatedXMLString = Replace(UpdatedXMLString, ChrW(8220), Chr(34)) ' 左双弯引号 UpdatedXMLString = Replace(UpdatedXMLString, ChrW(8221), Chr(34)) ' 右双弯引号 ' 替换单弯引号为ASCII直单引号 UpdatedXMLString = Replace(UpdatedXMLString, ChrW(8216), Chr(39)) ' 左单弯引号 UpdatedXMLString = Replace(UpdatedXMLString, ChrW(8217), Chr(39)) ' 右单弯引号 ' 写入替换后的UTF-8文件 With objStream .Charset = "UTF-8" .Open .WriteText UpdatedXMLString .SaveToFile UpdatedFilePath, 2 ' 参数2代表覆盖已存在的目标文件 .Close End With Set objStream = Nothing End Sub
补充说明
- 字符替换操作必须在读取文件到内存字符串之后执行,读取前文件为二进制状态,无法做字符匹配
- 如果你的XML文件是带BOM的UTF-8编码,上述代码可以正常兼容,无需额外调整
- 不要用FSO处理UTF-8编码的非ANSI文件,FSO对UTF-8的原生支持存在缺陷,全程用ADODB.Stream指定编码读写即可避免乱码问题
内容的提问来源于stack exchange,提问作者lifewithelliott
相关产品推荐
相关产品推荐

