По умолчанию PowerShell испускает UTF-8 вместо UTF-16?

31

По умолчанию PowerShell в Windows, по-видимому, выводит UTF-16 (например, если я делаю простое echo hello > hi.txt, то получается hi.txtUTF-16). Я знаю, что вместо этого могу принудительно установить желаемую кодировку текста echo hello | out-file -encoding utf8 hi.txt, но мне бы хотелось, чтобы это использовалось по умолчанию при использовании оператора перенаправления. Есть ли способ добиться этого?

Бенджамин Поллак
источник
1
спасибо за подсказку за альтернативу, иногда это можно сделать из терминала быстрее, чем текстовый редактор.
Тодд Партридж
В Powershell 6.0 это стало ненужным - теперь Powershell по умолчанию использует UTF-8 без кодировки для перенаправления. См github.com/PowerShell/PowerShell/issues/4878
kumarharsh

Ответы:

21

Использование декомпилятора .NET в сборке System.Management.Automation (также называемой «Сборка ядра Microsoft Windows PowerShell Engine») показывает этот фрагмент кода:

// class: System.Management.Automation.RedirectionNode
private PipelineProcessor BuildRedirectionPipeline(string path, ExecutionContext context)
{
    CommandProcessorBase commandProcessorBase = context.CreateCommand("out-file");
    commandProcessorBase.AddParameter("-encoding", "unicode");
    if (this.Appending)
    {
        commandProcessorBase.AddParameter("-append", true);
    }
    commandProcessorBase.AddParameter("-filepath", path);
    ...

Так что это выглядит довольно жестко для меня.

К вашему сведению, это было в Windows 7 Enterprise x64 с установленной PowerShell 2.0.

Tinister
источник
5
Все еще жестко запрограммирован в PowerShell 5 для Windows 10, к сожалению:CommandParameterInternal.CreateParameterWithArgument(PositionUtilities.EmptyExtent, "Encoding", "-Encoding:", PositionUtilities.EmptyExtent, "Unicode", false, false);
Artfunkel
3

Не уверен, что это будет именно то, что вы ищете, но вы можете попробовать установить переменную среды, как указано здесь

$OutputEncoding = New-Object -typename System.Text.UTF8Encoding
OldWolf
источник
2
Я не думаю, что $OutputEncodingэто то, что мне нужно; в PowerShell установлено значение ASCII, и оно влияет на то, как все отображается . Что я хочу сделать, это изменить формат текста, который сохранен в файле, который (AFAICT) отличается от того, что $OutputEncodingконтролирует.
Бенджамин Поллак