Изменение кодировки 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 байта.
  • Зачем указывать @charset «UTF-8»; в вашем файле CSS?
  • Interesting Posts

    Преобразование массива InputStream в байты в Java

    Определение Java Enum

    Создание и построение эмпирического совместного PDF и CDF

    Сохранить ArrayList в SharedPreferences

    HTTP-туннель HTTP через 2 хоста Linux?

    Как я могу проверить, существует ли опция, уже выбранная JQuery

    Можете ли вы ссылаться на хороший пример использования BackgroundWorker, не помещая его в форму как компонент?

    Как создать соединение ssh Terminal ярлык на Mac OS X 10.6.8 (Snow Leopard)?

    Как подключить два локально связанных компьютера к WIFI с помощью адресации IPv4?

    Почему на клавиатуре есть два набора клавиш Ctrl, Alt и Shift?

    Использование фреймворков в инструменте командной строки

    Рекурсивный список LINK_LIBRARIES в CMake

    Symfony2: Как получить ошибки проверки формы после привязки запроса к форме

    Как добавить дополнительные пространства имен в страницы Razor вместо @using объявления?

    Каково фактическое использование интерфейса в java?

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