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