none
Powershell: как решить проблему с знаками вопроса вместо русских букв? RRS feed

  • Вопрос

  • Получаю по 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.CharacterSet 
    28 февраля 2018 г. 10:04
    Отвечающий
  • Пустой ответ$res = Invoke-WebRequest -Method GET -Uri $url2 -ContentType "application/json;charset=utf-8"
    write-host $res.BaseResponse.CharacterSe
    28 февраля 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