[PS] UTF-8 Encoding als Standard für ">" redirect einstellen?

Mat

Aktives Mitglied
Hatte eine HTML-Datei im Terminal erstellt, um lokale Requests zu testen.

Allerdings sah ich dann das hier im Terminal:
Code:
Invoke-WebRequest -UseBasicParsing -Uri http://localhost:12345 -Method GET
StatusCode        : 200
StatusDescription : OK
[...]
RawContent        : HTTP/1.1 200 OK
                    Host: localhost:12345
                    Connection: close
                    Content-Type: text/html; charset=UTF-8
                    Date: Mon, 18 May 2020 21:37:44 GMT
                    X-Powered-By: PHP/7.4.6

                    ��<!DOCTYPE html>
                    <...
Dachte erst, ich hab's vielleicht aus Versehen in Notepad geöffnet.. aber nein.. das passierte jedes Mal.

Tests

Erstmal redirect in eine Datei, wie ein normaler Mensch:
Code:
"abc" > dings.txt

Get-Content -Encoding Byte .\dings.txt | Format-Hex
           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000   FF FE 61 00 62 00 63 00 0D 00 0A 00              .þa.b.c.....
Was ist das denn? Achja, UTF-16LEL im PowerShell-Terminal.
Das geht mir langsam auf den Sack, aber kein Problem!

Na, dann halt Out-File:
Code:
"abc" | Out-File dings.txt

PS C:\Users\mat_h> Get-Content -Encoding Byte .\dings.txt | Format-Hex
           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000   FF FE 61 00 62 00 63 00 0D 00 0A 00              .þa.b.c.....
Oh, das wird wohl exakt so ausgeführt, wenn man den >-Redirect benutzt.
Gut zu wissen.

Na, dann vielleicht Out-File mit UTF-8:
Code:
"abc" | Out-File -Encoding utf8 dings.txt

Get-Content -Encoding Byte .\dings.txt | Format-Hex
           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000   EF BB BF 61 62 63 0D 0A                          abc..
Wie, was, ist das ein BOM? In UTF8???
Das ergibt keinen Sinn.

Was ist mit New-Item:
Code:
"abc" | New-Item .\dings.txt

Get-Content -Encoding Byte .\dings.txt | Format-Hex
           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000   61 62 63                                         abc
Na geht doch.
Aber was macht New-Item anders? Vielleicht benutzt es immer ASCII?

Code:
"äöüß🤷‍♂️👌" | New-item .\dings.txt

Get-Content -Encoding Byte .\dings.txt | Format-Hex
           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00000000   C3 A4 C3 B6 C3 BC C3 9F F0 9F A4 B7 E2 80 8D E2  äöüÃð¤·ââ
00000010   99 82 EF B8 8F F0 9F 91 8C                       ï¸ð
Nee, obwohl das Terminal die Zeichen nicht anzeigen kann, wird eine UTF-8 enkodierte Datei erzeugt.


Fazit

Ich will einfach nur, dass beim Rumfummeln im Terminal Dateien mit sauberem UTF8 oder ASCII initialisiert werden.
Wenn Editoren und IDEs die Dateien öffnen, übernehmen sie sonst einfach das falsche Encoding und es fällt mir zu spät auf.

"bla" > datei.txt scheint intern den gleichen Mechanismus zu verwenden, wie "bla" | Out-File datei.txt. Vielleicht ist es auch nur ein Alias dafür.

New-Item scheint das zu leisten, was ich brauche. Allerdings wäre es toll, wenn ich "bla" > datei.txt verwenden könnte, damit ich bei Bash und Powershell die gleiche Syntax hab.

Ich meine irgendwo gelesen zu haben, dass geplant ist, das Encoding im Powershell-Terminal in den nächsten Versionen zu vereinfachen.
Aber kann man bis dahin Abhilfe mit einer Konfiguration schaffen? Die könnte ich mir dann ins PSProfil schreiben.
 
Zuletzt bearbeitet:
Verdammt, das Problem hatte ich auch schon und finde es gerade nicht wieder :( Ich such noch ein bisschen.
In der Zwischenzeit - versuch mal ob dich ein gutes altes chcp 65001 schon weiter bringt.

// EDIT: Ich glaube es war ein $PSDefaultParameterValues["*:Encoding"] = "utf8"
Das BOM Problem löst das aber kaum. Wechsle von Windows PowerShell auf PowerShell Core. Damit sollte es solche Probleme nicht mehr geben. https://github.com/PowerShell/Powershell
 
Zuletzt bearbeitet:
Powershell scheint das zu akzeptieren, aber das Verhalten ändert sich nicht.

1589842425183.png


Das Terminal ist auch merkwürdig.. es kann problemlos alle Charaktere beim Output anzeigen. Aber die Eingabe zeigt Fragezeichen als Platzhalter. Sowohl das standard Powershell-Terminal als auch das neue Windows-Terminal mit den Tabs.

Code:
PS> echo "??"
✔✔

Edit:
Danke. Jetzt hab ich chcp 65001 und $PSDefaultParameterValues["*:Encoding"] = "utf8" in meinem Profil stehen und das Windows-Terminal zeigt jetzt alle Sonder- und Multibytezeichen an. Redirect output ist jetzt standardmäßig UTF-8 mit BOM. Immer noch besser, als UTF-16LE. Das Core-Ding schaue ich mir mal an.. klingt vielversprechend.
 
Zuletzt bearbeitet:
Damit läuft das auch wunderbar, kein BOMmel:
Code:
"abc" > dings.txt

Get-Content .\dings.txt | Format-Hex
   Label: String (System.String) <3D38C89F>
          Offset Bytes                                           Ascii
                 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
          ------ ----------------------------------------------- -----
0000000000000000 61 62 63                                        abc

Ich hoffe, das ersetzt mal die Standard Powershell-Installation. Wundert mich, dass es schon bei Release Version 7 ist und noch nicht Teil des Systems. Aber kann ich schon ein bisschen verstehen, da viele Cmdlets inkompatibel zu Befehlen aus v5 sind. Da scheinen sie wohl mehr auf Stabilität zu achten als bei den Windows Updates. :p
 
Zurück
Oben Unten