Standardmäßig sendet PowerShell UTF-8 anstelle von UTF-16?


31

Standardmäßig gibt PowerShell in Windows anscheinend UTF-16 aus (wenn ich z. B. eine einfache Ausgabe vornehme echo hello > hi.txt, hi.txtendet die Ausgabe in UTF-16). Ich weiß, dass ich dies auf meine gewünschte Textcodierung erzwingen kann, indem ich dies stattdessen tue echo hello | out-file -encoding utf8 hi.txt, aber ich möchte, dass dies nur die Standardeinstellung ist, wenn ich den Umleitungsoperator verwende. Gibt es eine Möglichkeit, dies zu erreichen?


1
danke für den tipp für eine alternative, dies vom terminal aus zu tun kann manchmal schneller sein als ein texteditor.
— Todd Partridge

In Powershell 6.0 wurde dies überflüssig gemacht. Powershell verwendet jetzt standardmäßig UTF-8 ohne Kodierung für die Umleitung. Siehe github.com/PowerShell/PowerShell/issues/4878
— kumarharsh

Antworten:


21

Die Verwendung eines .NET-Dekompilierers in der System.Management.Automation-Assembly (auch bekannt als "Microsoft Windows PowerShell Engine Core Assembly") zeigt das folgende Codefragment:

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

Es sieht für mich also ziemlich hardcodiert aus.

Zu Ihrer Information, dies war auf einem Windows 7 Enterprise x64-System mit PowerShell 2.0 installiert.


5
In PowerShell 5 unter Windows 10 leider noch fest CommandParameterInternal.CreateParameterWithArgument(PositionUtilities.EmptyExtent, "Encoding", "-Encoding:", PositionUtilities.EmptyExtent, "Unicode", false, false);
— programmiert

3

Sie sind sich nicht sicher, ob dies genau das tut, wonach Sie suchen, aber Sie können versuchen, die Umgebungsvariable wie hier beschrieben festzulegen

$OutputEncoding = New-Object -typename System.Text.UTF8Encoding

2
Ich glaube nicht, dass es das $OutputEncodingist, was ich brauche. Dies ist in PowerShell auf ASCII festgelegt und wirkt sich auf die Anzeige aus . Ich möchte das Format von Text ändern, der in einer Datei gespeichert ist, die sich von den Steuerelementen (AFAICT) unterscheidet $OutputEncoding.
— Benjamin Pollack
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.