我目前正在修正用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文件?
...
Dim bom(3) As Byte
bom(1) = 239 'EF
bom(2) = 187 'BB
bom(3) = 191 'BF
Call oStream.Write(bom)
...