Лучший отвечающий
Powershell: как решить проблему с знаками вопроса вместо русских букв?

Вопрос
-
Получаю по API JSON результат. Но русские буквы отображаются в виде знаков вопроса. Есть идеи, товарищи? Спасибо заранее
Что запускаю:
$url2 = "http://********/rooms?limit=3&access_token=******" $rres = Invoke-WebRequest -Method GET -Uri $url2 -ContentType "application/json;charset=utf-8" | ConvertFrom-Json $Lmres = $rres.chunk Write-Host $Lmres[0].Content
Получаю:
@{body=???? ??????) ; msgtype=m.text} @{body=??????????????; msgtype=m.text} @{body=??????????; msgtype=m.text}
Кодировку запроса к json менял на win-1251, ничего не изменилось.
28 февраля 2018 г. 7:50
Ответы
-
С проблемными сайтами отдает ISO-8859-1(что является багом), функцию конвертирования, я привел выше.
PS > $res = iwr http://php.su PS > $res.BaseResponse IsMutuallyAuthenticated : False Cookies : {} Headers : {Transfer-Encoding, Connection, Vary, Content-Type...} SupportsHeaders : True ContentLength : -1 ContentEncoding : ContentType : text/html CharacterSet : ISO-8859-1 Server : nginx LastModified : 2/28/2018 1:12:32 PM StatusCode : OK StatusDescription : OK ProtocolVersion : 1.1 ResponseUri : http://www.php.su/ Method : GET IsFromCache : False PS > $res.BaseResponse.CharacterSet ISO-8859-1
PS. Можно скачать портативную версию PowerShell Core и написать скрипт в ней - https://github.com/PowerShell/PowerShell/releases/download/v6.0.1/PowerShell-6.0.1-win-x64.zip
- Помечено в качестве ответа [technoir] 1 марта 2018 г. 6:36
28 февраля 2018 г. 10:15Отвечающий -
Данного поля в заголовке может и не быть. С WebClient нормально отображается кодировка?
$wb = New-object System.Net.WebClient -Property @{Encoding = [System.Text.Encoding]::UTF8} $wb.Headers.Add("Content-Type","application/json;charset=utf-8") $wb.DownloadString($url2)
- Помечено в качестве ответа [technoir] 1 марта 2018 г. 6:36
28 февраля 2018 г. 12:04Отвечающий
Все ответы
-
Для примера сайт http://php.su:
PS > $wrong_string.ParsedHtml.title PHP, MySQL è äðóãèå âåá-òåõíîëîãèè
$win = [System.Text.Encoding]::GetEncoding(1251) $utf8 = [System.Text.Encoding]::GetEncoding(65001) $iso88591 = [System.Text.Encoding]::GetEncoding(28591) $wrong_string = iwr http://php.su $wrong_bytes = $utf8.GetBytes($wrong_string.ParsedHtml.title) $right_bytes = [System.Text.Encoding]::Convert($utf8,$iso88591,$wrong_bytes) $right_string = $win.GetString($right_bytes) $right_string
Вывод:
>> $right_string PHP, MySQL и другие веб-технологи
28 февраля 2018 г. 9:33Отвечающий -
Спасибо! А если надо с utf в win только?
Как убрать
$iso88591,
из цепочки правильно?
28 февраля 2018 г. 9:45 -
Пока я это прогнал всё равно полуаю:
удобное оповещение )
ЗП пришла
несет28 февраля 2018 г. 9:49 -
Ссылку на сайт приведите проблемный.
function ConvertTo-Encoding ([string]$From, [string]$To){ Begin{ $encFrom = [System.Text.Encoding]::GetEncoding($from) $encTo = [System.Text.Encoding]::GetEncoding($to) } Process{ $bytes = $encTo.GetBytes($_) $bytes = [System.Text.Encoding]::Convert($encFrom, $encTo, $bytes) $encTo.GetString($bytes) } }
Вывод вашего примера:
PS > $b = @' >> СѓРґРѕР±РЅРѕРµ оповещение ) >> Р—Рџ пришла >> несет >> '@ PS > $b | ConvertTo-Encoding -From utf-8 -To windows-1251 удобное оповещение ) ЗП пришла несет PS >
- Изменено KazunEditor 28 февраля 2018 г. 9:52
28 февраля 2018 г. 9:50Отвечающий -
Расшифровано:
удобное оповещение )
ЗП пришлаИсходник в CP1251
CP1251 -> UTF-8
28 февраля 2018 г. 9:52 -
Да проблема в том что локальный сайт..
А как нибудь кодировку узнать можно того что мне invoke-webrequest возвращает?
Кодировку того что в переменной содержиться
28 февраля 2018 г. 10:02 -
$rres.BaseResponse.CharacterSet28 февраля 2018 г. 10:04Отвечающий
-
Пустой ответ$res = Invoke-WebRequest -Method GET -Uri $url2 -ContentType "application/json;charset=utf-8"
write-host $res.BaseResponse.CharacterSe28 февраля 2018 г. 10:10 -
С проблемными сайтами отдает ISO-8859-1(что является багом), функцию конвертирования, я привел выше.
PS > $res = iwr http://php.su PS > $res.BaseResponse IsMutuallyAuthenticated : False Cookies : {} Headers : {Transfer-Encoding, Connection, Vary, Content-Type...} SupportsHeaders : True ContentLength : -1 ContentEncoding : ContentType : text/html CharacterSet : ISO-8859-1 Server : nginx LastModified : 2/28/2018 1:12:32 PM StatusCode : OK StatusDescription : OK ProtocolVersion : 1.1 ResponseUri : http://www.php.su/ Method : GET IsFromCache : False PS > $res.BaseResponse.CharacterSet ISO-8859-1
PS. Можно скачать портативную версию PowerShell Core и написать скрипт в ней - https://github.com/PowerShell/PowerShell/releases/download/v6.0.1/PowerShell-6.0.1-win-x64.zip
- Помечено в качестве ответа [technoir] 1 марта 2018 г. 6:36
28 февраля 2018 г. 10:15Отвечающий -
IsMutuallyAuthenticated : False
Cookies : {}
Headers : {Access-Control-Allow-Headers, Access-Control-Allow-Origin, Access-Control-Allow-Methods, Content-Length...}
SupportsHeaders : True
ContentLength : 1126
ContentEncoding :Вообще пустота в кодировке
28 февраля 2018 г. 10:33 -
Данного поля в заголовке может и не быть. С WebClient нормально отображается кодировка?
$wb = New-object System.Net.WebClient -Property @{Encoding = [System.Text.Encoding]::UTF8} $wb.Headers.Add("Content-Type","application/json;charset=utf-8") $wb.DownloadString($url2)
- Помечено в качестве ответа [technoir] 1 марта 2018 г. 6:36
28 февраля 2018 г. 12:04Отвечающий -
Вот так отлично вообще! Может его и использовать?)28 февраля 2018 г. 12:20