VB6/VBA: 如何用带 BOM 的 UTF-8 格式写入 xml 文件

VB6/VBA: How to write xml file in UTF-8 with BOM

我目前正在修复用 VBA 编写的遗留代码(不是我写的),我需要以 UTF-8 编码将 XML 文件保存到磁盘(不是问题),但是包含 BOM(字节顺序标记)(问题)。

将 DOM 文档保存到磁盘的当前代码如下所示:

Private Sub mSaveToFile(ByVal oDoc As MSXML2.DOMDocument60, ByVal sFilename As String)
    Dim oStream As ADODB.Stream
    Dim oWriter As MSXML2.MXXMLWriter60
    Dim oReader As MSXML2.SAXXMLReader60

    Set oStream = New ADODB.Stream
    oStream.Open
    oStream.Type = adTypeBinary

    Set oWriter = New MSXML2.MXXMLWriter60
    'if not set (even to False), ".encoding" is ignored
    oWriter.byteOrderMark = True
    oWriter.output = oStream
    oWriter.indent = True
    oWriter.standalone = True
    oWriter.omitXMLDeclaration = False
    'UTF-8 will never write a BOM, no matter what ".byteOrderMark" says
    oWriter.Encoding = "utf-8"



    Set oReader = New MSXML2.SAXXMLReader60
    Set oReader.contentHandler = oWriter
    Set oReader.dtdHandler = oWriter
    Set oReader.ErrorHandler = oWriter

    Call oReader.putProperty("http://xml.org/sax/properties/declaration-handler", oWriter)
    Call oReader.putProperty("http://xml.org/sax/properties/lexical-handler", oWriter)

    Call oReader.parse(oDoc.xml)

    Call oStream.SaveToFile(sFilename, adSaveCreateOverWrite)
    oStream.Close

End Sub

我不完全明白它在做什么,但它正在做它的工作。

包含的评论是我在网上发现的内容的摘要,微软不关心,开发人员想要什么(.byteOrderMark = True)并且不写任何 BOM(至少不使用 UTF-8 ). 我什至在网上发现, 推荐使用带有 UTF-8 的 BOM,但是当它是一个要求时我们能做什么。

所以,现在我正在寻找一种自己编写 BOM 的方法,但是我找不到使用 "oWriter" 或 "oReader" 将随机字节写入流的方法。

我是不是漏掉了一些重要的东西,或者根本不可能用 Microsoft XML 创建带有 BOM 的 UTF-8 文件?

没关系,我忽略了还有 "oStream" 变量。

只需创建一个字节数组,将 BOM 字节插入其中并将其写入流即可。

...
Dim bom(3) As Byte

bom(1) = 239   'EF
bom(2) = 187   'BB
bom(3) = 191   'BF

Call oStream.Write(bom)
...