PowerShell Invoke-WebRequest上的xml响应中的编码错误

时间:2013-05-08 22:29:52

标签: powershell-v3.0

我正在使用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

这应该不起作用吗?

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分: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)