Изменение выходной кодировки 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