VB6 / VBA:如何在带有BOM的UTF-8中写入xml文件

问题描述 投票:0回答:1

我目前正在修正用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

我不完全理解它在做什么,但是它正在做它的工作。

[包含的注释是我在网上发现的摘要,Microsoft不在乎,开发人员想要什么(.byteOrderMark = True),并且不编写任何BOM(至少不是使用UTF-8)。我什至在网上发现,建议将BOM与UTF-8一起使用,但是当需要时可以做什么?

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

我是否在这里遗漏了一些重要的东西,或者根本无法使用带有Microsoft XML的BOM创建UTF-8文件?

xml vba encoding vb6
1个回答
0
投票
仅创建字节数组,将BOM字节插入其中并将其写入流就可以了。

... Dim bom(3) As Byte bom(1) = 239 'EF bom(2) = 187 'BB bom(3) = 191 'BF Call oStream.Write(bom) ...

© www.soinside.com 2019 - 2024. All rights reserved.