Как правильно/глобально использовать файл PowerShell для UTF-8 (без спецификации)?

Создайте файл utf8.txt. Убедитесь, что кодировка UTF-8 (без спецификации). Задайте свой контент

В cmd.exe:

type utf8.txt > out.txt

Содержание out.txt -

В PowerShell (v4):

cat .\utf8.txt > out.txt

или

type .\utf8.txt > out.txt

Содержимое Out.txt €

Как глобально заставить PowerShell работать правильно?

Ответ 1

Windows PowerShell, в отличие от базовой платформы .NET [1] , использует следующие значения по умолчанию:

  • на входе: файлы без спецификации (знак байтового байта) считаются кодировкой по умолчанию, которая является наследием Кодовая страница Windows (кодовая страница ANSI: активная одноуровневая кодировка для конкретной культуры, настроенная с помощью панели управления).

  • на выходе: операторы перенаправления > и >> создают файлы UTF-16 LE по умолчанию (у которых есть - и нужно - BOM).

Командующие файлами и -производительными командами обычно поддерживают параметр -Encoding, который позволяет явно указать кодировку.
До PowerShell v5.1 явное использование командлета Out-File явно было единственным способом изменения кодировки.
В PowerShell v5.1 +, > и >> появились эффективные псевдонимы Out-File, позволяющие изменять поведение кодировки > и >> с помощью $PSDefaultParameterValues предпочтения переменная; например.:
$PSDefaultParameterValues['Out-File:Encoding'] = 'utf8'.

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

Применяется к вашему примеру:

Get-Content -Encoding utf8 .\utf8.txt | Out-File -Encoding utf8 out.txt

Чтобы создать файл UTF-8 без спецификации в PowerShell, см. этот ответ.


В отличие от PowerShell Core, межплатформенная версия PowerShell, к счастью, по умолчанию имеет значение BOM-less UTF-8 как для ввода, так и для вывода.


[1].NET framework использует UTF-8 по умолчанию, как для ввода, так и для вывода.
Это - преднамеренная разница в поведении между PowerShell и .NET Framework, на которой она построена, необычна.

[2] Get-Content, однако, автоматически распознает файлы UTF-8 с спецификацией.