2013-07-17 2 views
4

При использовании командлета InvokeWebRequest для некоторой сети с неанглийскими символами я не вижу способа определить кодировку содержимого ответа/страницы.Кодирование ответа Invoke-Webrequest

Я использую простой GET на http://colours.cz/ucinkujici/, и имена этих художников повреждены. Вы можете попробовать это с помощью этой простой строки:

Это вызвано дизайном командлета? Можно ли каким-то образом указать кодировку? Есть ли какое-либо обходное решение для правильного анализа ответа?

+0

Вы показываете результаты в консоли powershell.exe? Возможно, ваш шрифт не поддерживает символов. – x0n

+0

Я использую powershell ISE v3. Я бы сказал, что это не проблема, потому что у меня нет другой проблемы с моим языком в powershell ISE или консоли ... – jumbo

ответ

6

Мне кажется, вы правы:/

Вот один из способов, чтобы получить право содержания, но вы не имеете дело с HtmlWebResponseObject:

Invoke-WebRequest http://colours.cz/ucinkujici -outfile .\colours.cz.txt 
$content = gc .\colours.cz.txt -Encoding utf8 -raw 

Это поможет вам одинаково далеко:

[net.httpwebrequest]$httpwebrequest = [net.webrequest]::create('http://colours.cz/ucinkujici/') 
[net.httpWebResponse]$httpwebresponse = $httpwebrequest.getResponse() 
$reader = new-object IO.StreamReader($httpwebresponse.getResponseStream()) 
$content = $reader.ReadToEnd() 
$reader.Close() 

Если вы действительно хотите такой HtmlWebResponseObject, вот способ, чтобы получить, например, материал от более ParsedHtml или менее "читаемым" с Invoke-WebRequest ($bad VS. $better):

Invoke-WebRequest http://colours.cz/ucinkujici -outvariable htmlwebresponse 
$bad = $htmlwebresponse.parsedhtml.title 
$better = [text.encoding]::utf8.getstring([text.encoding]::default.GetBytes($bad)) 
$bad = $htmlwebresponse.links[7].outerhtml 
$better = [text.encoding]::utf8.getstring([text.encoding]::default.GetBytes($bad)) 

Update: Вот новый взгляд на это, зная, что вы хотите работать с ParsedHtml.
После того, как у вас есть контент, вы можете сделать это:

$ParsedHtml = New-Object -com "HTMLFILE" 
$ParsedHtml.IHTMLDocument2_write($content) 
$ParsedHtml.Close() 

Et вуаля:] Е.Г. $ParsedHtml.title теперь отображается правильно, угадывая, что остальное тоже будет хорошо ...

+0

Я пробовал первый пример, и он работает. Но плохая новость заключается в том, что я уже написал весь свой код в отношении свойства parsedHTML объекта HtmlWebResponseObject. Поэтому я попробовал третий пример (который спасет меня), но, к сожалению, он не работает для меня. Это дает мне Sigur RA3s (в '$ better') от оригинальных Sigur Rós (в' $ bad'). – jumbo

+0

Обновлен и даже получил его для работы с PowerShell 2 – mousio

+1

Я использовал вашу ** Обновление **, и она работает с моим старым кодом. Большое вам спасибо, именно то, что мне нужно. – jumbo

Смежные вопросы