Лучший отвечающий
Знаки вопроса вместо кирилицы в PowerShell.

Вопрос
-
Всем доброго времени суток.
При попытке отправить сообщение из PS вместо кирилического теста приходит ??????
Как можно это побороть? Если не помогает
[System.Console]::OutputEncoding = [System.Text.Encoding]::UTF8
?
Сам скрипт:
function ConvertTo-Encoding ([string]$From, [string]$To){
После конвертации в utf-8, часть символов начинает читатся. Но часть остается вопросами.
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[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.
- Помечено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 14 января 2021 г. 17:44
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
- Изменено Vector BCOModerator 21 декабря 2020 г. 7:59
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.
- Помечено в качестве ответа Иван ПродановMicrosoft contingent staff, Moderator 14 января 2021 г. 17:44
9 января 2021 г. 18:19Модератор -
Благодарю. После вашего комментария понял, что иду по неверному пути.
Указал [System.Text.Encoding]::UTF8.GetBytes и данные стали передаватся корректно.
- Изменено John D0u 17 января 2021 г. 18:10
17 января 2021 г. 18:10