Domyślny PowerShell do emitowania UTF-8 zamiast UTF-16?

31

Domyślnie PowerShell w Windows wydaje się wyświetlać UTF-16 (np. Jeśli zrobię prosty echo hello > hi.txt, to hi.txtkończy się w UTF-16). Wiem, że mogę wymusić to na moim pożądanym kodowaniu tekstu, robiąc to zamiast tego echo hello | out-file -encoding utf8 hi.txt, ale chciałbym, aby było to ustawienie domyślne, gdy używam operatora przekierowania. Czy jest jakiś sposób na osiągnięcie tego?

Benjamin Pollack
źródło
1
dzięki za podpowiedź dotyczącą alternatywy, czasami wykonanie tego z terminala może być szybsze niż edytor tekstu.
Todd Partridge
W Powershell 6.0 stało się to zbędne - Powershell ma teraz domyślnie UTF-8 bez kodowania przekierowań. Zobacz github.com/PowerShell/PowerShell/issues/4878
kumarharsh

Odpowiedzi:

21

Użycie dekompilatora .NET w zestawie System.Management.Automation (inaczej „Microsoft Windows PowerShell Engine Core Assembly”) ujawnia ten fragment kodu:

// 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);
    ...

Wygląda na to, że jestem zakodowany.

Do Twojej wiadomości, dotyczyło to systemu Windows 7 Enterprise x64 z zainstalowanym programem PowerShell 2.0.

Tinister
źródło
5
Wciąż wciąż zakodowany w PowerShell 5 na Windows 10, niestety:CommandParameterInternal.CreateParameterWithArgument(PositionUtilities.EmptyExtent, "Encoding", "-Encoding:", PositionUtilities.EmptyExtent, "Unicode", false, false);
Artfunkel
3

Nie jestem pewien, czy to zrobi dokładnie to, czego szukasz, ale możesz spróbować ustawić zmienną środowiskową, jak wspomniano tutaj

$OutputEncoding = New-Object -typename System.Text.UTF8Encoding
OldWolf
źródło
2
Nie sądzę, że $OutputEncodingjest to dokładnie to, czego potrzebuję; to jest ustawione na ASCII w PowerShell i wpływa na sposób wyświetlania rzeczy . Chcę zmienić format tekstu zapisanego w pliku, który (AFAICT) różni się od tego, co $OutputEncodingkontroluje.
Benjamin Pollack