В 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 осталось совсем мало времени.
Filed under: Powershell, Unix, Windows | Tagged: Powershell, PowerShell Core, Unix, Windows |
Оставьте комментарий