none
Знаки вопроса вместо кирилицы в PowerShell. RRS feed

  • Вопрос

  • Всем доброго времени суток.

    При попытке отправить сообщение из PS вместо кирилического теста приходит ??????

    Как можно это побороть? Если не помогает[System.Console]::OutputEncoding = [System.Text.Encoding]::UTF8 ?

    Сам скрипт:

    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)
            }
        }

    [System.Text.Encoding]::Default.Codepage

    После конвертации в utf-8, часть символов начинает читатся. Но часть остается вопросами.

    [Console]::outputEncoding

    IsSingleByte      : True
    BodyName          : IBM437
    EncodingName      : OEM United States
    HeaderName        : IBM437
    WebName           : IBM437
    WindowsCodePage   : 1252
    IsBrowserDisplay  : False
    IsBrowserSave     : False
    IsMailNewsDisplay : False
    IsMailNewsSave    : False
    EncoderFallback   : System.Text.InternalEncoderBestFitFallback
    DecoderFallback   : System.Text.InternalDecoderBestFitFallback
    IsReadOnly        : False
    CodePage          : 437


    • Изменено John D0u 17 января 2021 г. 18:07
    20 декабря 2020 г. 17:39

Ответы

  • Ваша функция "перекодирования" не может правильно работать. Ведь если конкретного символа нет в какой то кодировке, то он будет заменен на ?. А кодировка 1252 вообще не содержит кириллицы. Вот и получайте кучу знаков вопросов.

    Увы, но в РФ почему то очень мало кто знает как работать с кодировками вообще и с русскими буквами в частности, все норовят делать "перекодировщики" даже не понимая что они не могут работать. :(

    Чтоб все работало правильно вам надо сделать две вещи:

    1. Сохранять файл скрипта в кодировке где есть кириллица, например UTF-8 или UTF-16. При сохранении файла в notepad следует выбрать одну из этих опций. 

    2. Использовать для вывода на консоль кодировку где есть кириллица. Опять же, лучше всего использовать UTF-8/UTF-16, но можно и 1251, например. Перекодирование в последнем случае будет выполнено автоматически, никаких нерабочих суррогатов вроде "перекодирования" не потребуется.

    Сменить кодировку консоли можно так: 

    [Console]::OutputEncoding = [System.Text.Encoding]::UTF8



    This posting is provided "AS IS" with no warranties, and confers no rights.

    9 января 2021 г. 18:19
    Модератор

Все ответы

  • думаю вам стоит обратиться к докумментации rocketmessage так как конвертация в вашем примере выглядит крайне странно

    write-output с десятком строк инпута тоже крайне не похоже на best practice хоть работать и не мешает


    The opinion expressed by me is not an official position of Microsoft

    20 декабря 2020 г. 22:09
    Модератор
  • Конвертацию брал отсюда https://social.msdn.microsoft.com/Forums/en-US/1fd71a71-53c6-486c-be6d-ca98231384e5/-powershell-?forum=scrlangru

    rocketmessage ни при чём, выводит вопросами и в консоль ps.С латиницей проблем не наблюдается.

    Не удается подобрать правильные параметры конвертации для Кирилицы.


    • Изменено John D0u 21 декабря 2020 г. 7:34
    21 декабря 2020 г. 7:25
  • уберите конвертацию и в консоли все будет отображаться корректно

    о какой версии powershell мы говорим, и каким образом выполняется скрипт?


    The opinion expressed by me is not an official position of Microsoft


    21 декабря 2020 г. 7:58
    Модератор
  • Запускается из консоли.

    Версия PS 5.1.17763.1490

    23 декабря 2020 г. 7:55
  • Нет возможности это исправить?
    9 января 2021 г. 12:15
  • Ваша функция "перекодирования" не может правильно работать. Ведь если конкретного символа нет в какой то кодировке, то он будет заменен на ?. А кодировка 1252 вообще не содержит кириллицы. Вот и получайте кучу знаков вопросов.

    Увы, но в РФ почему то очень мало кто знает как работать с кодировками вообще и с русскими буквами в частности, все норовят делать "перекодировщики" даже не понимая что они не могут работать. :(

    Чтоб все работало правильно вам надо сделать две вещи:

    1. Сохранять файл скрипта в кодировке где есть кириллица, например UTF-8 или UTF-16. При сохранении файла в notepad следует выбрать одну из этих опций. 

    2. Использовать для вывода на консоль кодировку где есть кириллица. Опять же, лучше всего использовать UTF-8/UTF-16, но можно и 1251, например. Перекодирование в последнем случае будет выполнено автоматически, никаких нерабочих суррогатов вроде "перекодирования" не потребуется.

    Сменить кодировку консоли можно так: 

    [Console]::OutputEncoding = [System.Text.Encoding]::UTF8



    This posting is provided "AS IS" with no warranties, and confers no rights.

    9 января 2021 г. 18:19
    Модератор
  • Благодарю. После вашего комментария понял, что иду по неверному пути.

    Указал [System.Text.Encoding]::UTF8.GetBytes и данные стали передаватся корректно.


    • Изменено John D0u 17 января 2021 г. 18:10
    17 января 2021 г. 18:10