我正在使用 Powershell 脚本,如下所示将字符串转换为 XML,然后导出到文件(这样做是为了保持缩进):
[xml]$xmloutput = $xml
$sw = New-Object System.IO.StringWriter
$writer = New-Object System.Xml.XmlTextWriter($sw)
$writer.Formatting = [System.Xml.Formatting]::Indented
$xmloutput.WriteContentTo($writer)
$sw.ToString() | Set-Content -Encoding 'ASCII' $filepath
由于供应商限制,目标必须是 ASCII 格式。我看到的问题是 ASCII 只是将特殊字符更改为问号(例如:Ö 变成 ?)。
如果我使用 UTF8 编码,输出看起来完全没问题。我什至尝试保存到 UTF8 然后转换为 ASCII,做同样的事情(导出一个问号):
[System.Io.File]::ReadAllText($filepath) | Out-File -FilePath $filepath -Encoding ASCII
如果我尝试在转换为 XML 之前替换字符串中的字符(使用 ASCII 代码
Ö
),它只会转换与号并保留其余部分,使其无用。有没有办法让 Powershell 正确地将这些字符保存到文件中?
编辑:我想在输出的文件中看到特殊字符,但如果它不符合 ASCII,我想看到它的 ASCII 代码(在这个例子中,
Ö
)我也不想只看到一个 O,我需要实际的角色。
最佳答案
XML 文档中的所有字符都是 Unicode。但是,XML 文档的表示具有文档编码。不属于该字符集的字符被写为字符实体引用,通常是数字和十六进制表示法。该数字是 Unicode 代码点。
似乎您的合作伙伴的要求是使用 ASCII 作为文档编码。XmlDocument
使用起来有点困难,但是 XmlWriter
使用文档编码设置将起作用:
$myString = 'hellÖ'
[xml]$myXml = [System.Management.Automation.PSSerializer]::Serialize($myString)
$settings = New-Object System.Xml.XmlWriterSettings
$settings.Encoding = [System.Text.Encoding]::ASCII
$settings.Indent = $true
$writer = [System.Xml.XmlWriter]::Create("./test.xml", $settings)
$myXml.Save($writer)
$writer.Dispose()
这将输出一个带有 XML 声明的 ASCII 编码文本文件,声明文档编码为 ASCII,并使用十六进制数字字符实体引用来表示无法用 ASCII 表示的 XML 内容字符:
<?xml version="1.0" encoding="us-ascii"?>
<Objs Version="1.1.0.1" xmlns="http://schemas.microsoft.com/powershell/2004/04">
<S>hellÖ</S>
</Objs>
如您所见 here在 C1 Controls 和 Latin-1 Supplement 块中,U+00D6 (D6;) 是 Ö LATIN CAPITAL LETTER O WITH DIAERESIS
关于Powershell - ASCII 编码正在将特殊字符更改为问号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46980317/