Ответ 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 с спецификацией.