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

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

Это может быть сделано в каждом конкретном случае путем замены >foo.txt синтаксис с | 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?

3 ответа

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

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

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

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

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

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

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


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


Необязательное чтение: кроссплатформенная перспектива:

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

  • Это означает, что файлы с исходным кодом без спецификации предполагаются как UTF-8 и используют > / Out-File / Set-Content по умолчанию используется UTF-8 без спецификации; явное использование utf8-Encoding Аргумент также создает UTF-8 без спецификации, но вы можете создать файлы с псевдо-спецификацией с 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=$(<file) - результирующая переменная будет содержать псевдо-BOM в качестве первых 3 байтов.

Чтобы быть кратким, используйте:

write-output "your text" | out-file -append -encoding utf8 "filename"

Дамп, сделанный с помощью PowerShell в Windows с перенаправлением вывода, создает файл с кодировкой UTF-16. Чтобы обойти эту проблему, вы можете попробовать:

      mysqldump.exe [options] --result-file=dump.sql

Ссылка на ссылку: mysqldump_result-file

Другие вопросы по тегам