Powershell - ASCII 编码正在将特殊字符更改为问号

cha*_*ot7 3 powershell encoding ascii utf-8

我正在使用 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
Run Code Online (Sandbox Code Playgroud)

由于供应商限制,目标必须是 ASCII 格式。我看到的问题是 ASCII 只是将特殊字符更改为问号(例如:Ö 变成 ?)。

如果我使用 UTF8 编码,输出看起来完全没问题。我什至尝试保存到 UTF8 然后转换为 ASCII,做同样的事情(导出一个问号):

[System.Io.File]::ReadAllText($filepath) | Out-File -FilePath $filepath -Encoding ASCII
Run Code Online (Sandbox Code Playgroud)

如果我在转换为 XML(使用 ASCII 代码Ö)之前尝试替换字符串中的字符,它只会转换与符号并保留其余部分,使其无用。

有没有办法让 Powershell 正确地将这些字符保存到文件中?

编辑:我想在输出的文件中看到特殊字符,但如果它不符合 ASCII,我想看到它的 ASCII 代码(在这个例子中,Ö

我也不想只看到一个 O,我需要实际的角色。

Tom*_*get 6

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()
Run Code Online (Sandbox Code Playgroud)

这会输出一个带有 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&#xD6;</S>
</Objs>
Run Code Online (Sandbox Code Playgroud)

正如你可以看到这里的C1控件和拉丁语1补充块,U + 00D6(&#D6),是O拉丁大写字母O与二分法

  • @briantist XmlDocument 类非常灵活⇒ 非常复杂。我看到了你的强烈努力,并认为那必须是另一种方式。 (2认同)