2

我正在使用 Invoke-WebRequest 来检索 xml 文档。在 xml 声明中指定了 encoding="UTF-8"。当我在浏览器中查看文档时,它看起来是正确的。但是,当我在 PowerShell 中检索它并将其中的一些内容保存到数据库或将其打印到控制台时,编码出错并且“Joe's”变成了“Joeâs”。

XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <element attribute="Joe's"></element>
</root>

剧本:

$response = Invoke-WebRequest -Uri "http://example.com/doc.xml"
$xml = [xml]$response.Content
$xml.root.element.attribute

输出:

Joeâs

这不应该工作吗?

4

2 回答 2

0

[xml]我在使用解析时遇到了类似的问题。我通过自己进行解析来解决它:

$xml = New-Object xml
$resolver = New-Object -TypeName System.Xml.XmlUrlResolver
$resolver.Credentials = [System.Net.CredentialCache]::DefaultCredentials
$reader = New-Object -TypeName System.Xml.XmlReaderSettings
$reader.XmlResolver = $resolver
$reader = [System.Xml.XmlReader]::Create($rssUrl, $reader)
$xml.Load($reader)
于 2021-05-19T09:46:01.957 回答
0

我怀疑这可能不是编码问题。我尝试使用 139 种不同的编码进行转换,并且在 XML 中没有一个输出文件是正确的斯堪的纳维亚字符。我使用了这段代码:

$outPath = "C:\Temp\"; 
$result = Invoke-RestMethod -Headers $headers -Body ([System.Text.Encoding]::UTF8.GetBytes($body)) -Uri $url -Method Post;
encodings = [System.Text.Encoding]::GetEncodings();

foreach($item in $encodings) {
    $original = $result.OuterXml;

    $defaultEncoding = [System.Text.Encoding]::GetEncoding($item.name);
    $utf8Bytes = [System.Text.Encoding]::UTf8.GetBytes($original)
    $decoded = $defaultEncoding.GetString($utf8Bytes);

    $Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False;
    [System.IO.File]::WriteAllLines(($outPath +$item.Name + ".xml"), $decoded , $Utf8NoBomEncoding)
}

当我在 Windows 中使用 curl 调用相同的 REST Api 时,我的编码没有问题,我得到的结果是 UTF-8。

于 2018-08-28T14:03:12.470 回答