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

标签 powershell encoding utf-8 ascii

我正在使用 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&#xD6;</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/

相关文章:

PowerShell 使用 Invoke-Command 将开关传递给函数

python - 如何通过 subprocess.Popen 将 utf8 字符串从 python 正确传递到 hunspell?

mysql - Delphi 和二进制字符集(适用于 MySQL)

swift -\u{...} 转义序列中的预期 '}'

php - <body> 标签 & script 标签和 link 标签下方的空白区域位于 head 标签的 body 标签下方

MySQL/MariaDB 在使用 utf8mb4 时无法处理唯一键

powershell - 为什么这个 powershell 或过滤器不起作用?

windows - Windows 上类似挖掘的功能?

postgresql - 在 PostgreSQL 中转换重音字符?

android - 如何修复 "emulator: ERROR: No AVD specified. Use ' @foo' 或 '-avd foo' 以启动名为 'foo' 的虚拟设备“