Параметр Encoding в PowerShell Core 6.0 Beta.9


В PowerShell целый ряд командлетов имеет параметр Encoding для задания используемой кодировки. Эти командлеты появлялись в течение многих лет, в результате параметр реализован несколькими способами и поддерживает разный набор кодировок. Причём набор этот сильно ограничен.

В PowerShell Core 6.0 Beta.9 мы получили унификацию. С одной стороны это хорошо, а с другой это breaking change — совместимость с существующими скриптами нарушается.

В чём суть унификации? Теперь у всех командлетов параметр Encoding работает одинаково и поддерживает не только традиционный для PowerShell набор имен кодировок (Unicode, BigEndianUnicode, Utf8, Utf8Bom, Utf8NoBom, Utf7, Utf32, Ascii, Oem — вы видите, что кое-что удалили и кое-что добавили), но также все кодировки, которые поддерживаются в .Net Core 2.0.

Плюс теперь «Byte» это не кодировка, а отдельный параметр —AsByteStream, который игнорирует параметр ​Encoding и позволяет работать с файлами, как с байтовыми потоками. Это логичное изменение, но опять же несовместимое.

Ну и наконец последние изменение — кодировка по умолчанию установлена в Utf8NoBom глобально, что влияет не только на файловые командлеты, но и на web командлеты и консоль.

Весной я делал специальное изменение (о чём писал тут ранее), чтобы на Windows вернуть текущее поведение (кодировка по умолчанию OEM), т.к. столкнулся с проблемами использования русского языка при работе с файлами в консоле. Сейчас MSFT опять решила унифицировать кодировку по умолчанию на всех платформах. Пробуйте и напишите в PowerShell Core repo на GitHub, если это вас не устраивает, потому что для RTM осталось совсем мало времени.

Оставьте комментарий