Изменение кодировки PowerShell по умолчанию для UTF-8

По умолчанию, когда вы перенаправляете вывод команды в файл или подключаете ее к чему-то еще в PowerShell, кодировка UTF-16, что не полезно. Я хочу изменить его на UTF-8.

Это можно сделать в каждом конкретном случае, заменив синтаксис >foo.txt на | out-file foo.txt -encoding utf8 | out-file foo.txt -encoding utf8 но это неудобно повторять каждый раз.

Постоянный способ установить вещи в PowerShell состоит в том, чтобы поместить их в \Users\me\Documents\WindowsPowerShell\profile.ps1 ; Я проверил, что этот файл действительно выполняется при запуске.

Было сказано, что выходное кодирование может быть установлено с помощью $PSDefaultParameterValues = @{'Out-File:Encoding' = 'utf8'} но я пробовал это и не имел никакого эффекта.

https://blogs.msdn.microsoft.com/powershell/2006/12/11/outputencoding-to-the-rescue/, который говорит о $OutputEncoding выглядит на первый взгляд так, как если бы он был релевантным, но затем он говорит о выходе будучи закодированным в ASCII, что не происходит на самом деле.

Как установить PowerShell для использования UTF-8?

  • На PSv5.1 или выше , где > и >> – это действительно псевдонимы Out-File , вы можете установить кодировку по умолчанию для > / >> / Out-File помощью переменной $PSDefaultParameterValues :

    • $PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'
  • На PSv5.0 или ниже вы не можете изменить кодировку для > / >> , но, на PSv3 или выше , вышеупомянутый метод работает для вызовов в Out-File .
    $PSDefaultParameterValues была введена переменная предпочтения $PSDefaultParameterValues PSDefaultParameterValues).

  • На PSv3.0 или выше , если вы хотите установить кодировку по умолчанию для всех командлетов, которые поддерживают
    параметр -Encoding (который в PSv5.1 + включает > и >> ), используйте:

    • $PSDefaultParameterValues['*:Encoding'] = 'utf8'

Если вы поместите эту команду в свой файл $PROFILE , командлеты, такие как Out-File и Set-Content будут по умолчанию использовать кодировку UTF-8, но обратите внимание, что это делает ее глобальным параметром сеанса, который будет влиять на все команды / сценарии, которые не явно указать кодировку.

Точно так же не забудьте включить такие команды в свои скрипты или модули, которые вы хотите вести одинаково , так что они действительно ведут себя одинаково, даже если они запускаются другим пользователем или другой машиной.

Caveat : PowerShell, начиная с версии 5.1, неизменно создает файлы UTF-8 с (псевдо) спецификацией , которая является обычной только в мире Windows. Утилиты на базе Unix не распознают эту спецификацию (см. Ниже).


Автоматическая переменная $OutputEncoding не связана и применяется только к тому, как PowerShell связывается с внешними программами (какая кодировка PowerShell использует при отправке им строк) – она ​​не имеет ничего общего с кодировкой, которую используют операторы перенаправления вывода и командлеты PowerShell для сохранения файлы.


Дополнительное чтение: кросс-платформенная перспектива:

PowerShell теперь является кросс-платформенным , через свою версию PowerShell Core , чья кодировка – разумно – по умолчанию используется без спецификации UTF-8 , в соответствии с Unix-подобными платформами.

  • Это означает, что файлы исходного кода без спецификации, как предполагается, являются UTF-8, и с использованием значений > / Out-File / Set-Content умолчанию для BOM-less UTF-8; явное использование аргумента utf8 -Encoding также создает BOM-less UTF-8, но вы можете выбрать создание файлов с псевдо-спецификацией с utf8bom значения utf8bom .

  • Если вы создаете сценарии PowerShell с помощью редактора на Unix-подобной платформе, а в настоящее время даже в Windows с кросс-платформенными редакторами, такими как Visual Studio Code и Sublime Text, в полученном файле *.ps1 обычно не будет псевдо-спецификации UTF-8 :

    • Это отлично работает на PowerShell Core .
    • Он может разбиться на Windows PowerShell , если файл содержит символы, отличные от ASCII; если вам нужно использовать символы, отличные от ASCII, в ваших сценариях, сохраните их как UTF-8 с спецификацией .
      Без спецификации, Windows PowerShell (неверно) интерпретирует ваш сценарий как кодированный в устаревшей кодовой странице ANSI (определяемой языковым стандартом системы для приложений до Unicode, например Windows-1252 на англо-английских системах).
  • И наоборот, файлы, на которых есть псевдо-спецификация UTF-8, могут быть проблематичными на Unix-подобных платформах, поскольку они вызывают утилит Unix, таких как cat , sed и awk – и даже некоторые редакторы, такие как gedit – для передачи псевдо-спецификации через , т. е. рассматривать его как данные .

    • Это может не всегда быть проблемой, но определенно может быть, например, когда вы пытаетесь прочитать файл в строке в bash , скажем, text=$(cat file) или text=$( - результирующая переменная будет содержать псевдо-BOM как первые 3 байта.
  • (w) ifstream поддерживает различные кодировки
  • Interesting Posts

    Проверьте, является ли строка пустой или пустой в XSLT

    Использовать проверку ASP.NET MVC с помощью jquery ajax?

    core data в статической библиотеке для iPhone

    Поместите звезды на ggplot barplots и boxplots – чтобы указать уровень значимости (p-value)

    Запрос Http Servlet теряет параметры из тела POST после прочтения его один раз

    Настройка 2 внешних мониторов на ноутбуке с VGA-разветвителем

    Воспроизвести звук (возможно, WAV?) Из командной строки Windows

    Не знаете, где подключить HD AUDIO или AC-97, и USB

    Как преобразовать SVG в PDF в Linux

    Row_number over (Partition by xxx) в Linq?

    ASP.NET перезапускается, когда папка создается, переименовывается или удаляется

    Существует ли это: программное обеспечение для отмены шума

    Как идентифицировать ключевое слово emacs для чего-то в графическом интерфейсе?

    Настроить сервер флагов, чтобы быть видимым по сети

    Изменение цвета по умолчанию Firefox при открытии ссылок на новой вкладке

    Давайте будем гением компьютера.