【发布时间】:2020-12-08 02:21:29
【问题描述】:
我构建了一个 System.Xml.XmlDocument 类型的 XML 对象。
$scheme.gettype()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False XmlDocument System.Xml.XmlNode
我使用 save() 方法将其保存到文件中。
$scheme.save()
这会将文件保存为带有 BOM 的 UTF-8 格式。 BOM 会导致其他脚本出现问题。
当我们在 Notepad++ 中打开 XML 文件并将其保存为 UTF-8(没有 BOM)时,其他脚本没有问题。所以我被要求在没有 BOM 的情况下保存脚本。
MS documentation for the save method 声明:
编码属性的值取自 XmlDeclaration.Encoding 属性。如果 XmlDocument 没有 XmlDeclaration,或者如果 XmlDeclaration 没有编码属性,则保存的文档也不会有。
MS documentation on XmlDeclaration 列出了 UTF-8、UTF-16 等的编码属性。它没有提到 BOM。
XmlDeclaration 是否具有省略 BOM 的编码属性?
附言。此行为在 Powershell 5 和 Powershell 7 中是相同的。
【问题讨论】:
-
你打电话给
Save()的哪个重载?问题的后半部分涉及<?xml声明的encoding属性,但是通过在Notepad++ 中重新保存文件来解决问题的部分表明真正的问题是文件本身的文本编码。为此,您可以使用$encoding = New-Object -TypeName 'System.Text.UTF8Encoding' -ArgumentList $false; $writer = New-Object -TypeName 'System.IO.StreamWriter' -ArgumentList $outputPath, $shouldAppend, $encoding创建一个UTF-8 非BOMStreamWriter并将其传递给Save()。
标签: .net powershell utf-8 byte-order-mark