it-frosch
Goto Top

Powershell Variable wird mit falschem Encoding ausgegeben

Hallo Kollegen,

ich arbeite mich gerade in Powershell ein und habe ein Encoding (oder auch Verständnis) Problem. face-wink

PSVersion 5.1.19041.3031

Ich möchte einen XML Konverter erstellen, der bestimmte Werte ersetzt.

# XML korrigieren

# ich habe versucht diesen parameter zu setzen aber keine Auswirkung
$PSDefaultParameterValues['*:Encoding'] = 'utf8'  

# Standardwert festlegen
$LineOne_S="Meine Straße 13"   

# XML einlesen
$xml = [xml](get-content "C:\datei.xml")  

# Originalwert sichern
$LineOne=$xml.CrossIndustryInvoice.SupplyChainTradeTransaction.ApplicableHeaderTradeAgreement.SellerTradeParty.PostalTradeAddress.LineOne

# Standardwert in XML setzen
$xml.CrossIndustryInvoice.SupplyChainTradeTransaction.ApplicableHeaderTradeAgreement.SellerTradeParty.PostalTradeAddress.LineOne=$LineOne_S

Write-Host
"  
Alter Wert:       $LineOne
Neuer Wert:     $LineOne_S
"  

Ausgabe:

Alter Wert: Alte Straße 8
Neuer Wert: Neue Straße 13


Ich lese jetzt seit 2 Stunden alle möglichen Encoding Hinweise aber weiß immer noch nicht wie ich es korrigiert bekommen.

Könnte mir mal jemand aufs Pferd helfen?

Grüße vom it-frosch

Content-ID: 7627701796

Url: https://administrator.de/contentid/7627701796

Ausgedruckt am: 21.11.2024 um 11:11 Uhr

7426148943
7426148943 23.06.2023 aktualisiert um 15:13:14 Uhr
Goto Top
Moin
$xml = [xml](get-content "C:\datei.xml")
Ein oft gemachter Fehler um XML-Dateien einzulesen ohne das Encoding Get-Content mitzugeben ... XML Files am bester so einlesen
$xml = New-Object XML
$xml.Load("C:\datei.xml")  
Dann wird das Encoding durch den XML Parser und aus der XML Deklaration richtig erkannt.
Ansonsten Get-Content das korrekte Encoding der Datei mitgeben
$xml = [xml](get-content "C:\datei.xml" -Encoding UTF8)  
Und natürlich sicherstellen, dass die Skript -Datei selbst auch im UTF8 Encoding gespeichert ist.

Zeppel
emeriks
emeriks 23.06.2023 um 14:56:02 Uhr
Goto Top
Hi,
versuche es mal damit

$OutputEncoding = (New-Object System.Text.UnicodeEncoding $False, $False).psobject.BaseObject
bzw.
$OutputEncoding = (New-Object System.Text.UTF8Encoding $False, $False).psobject.BaseObject

E.
6376382705
6376382705 23.06.2023 aktualisiert um 14:59:42 Uhr
Goto Top
Hi.

Für den
Write-Host

zu Beginn deines Scriptes folgendes einfügen:
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8

ansonsten was @7426148943 schrieb (Ausgabe als XML)
Gruß
it-frosch
it-frosch 23.06.2023 aktualisiert um 15:18:54 Uhr
Goto Top
Zitat von @7426148943:

Moin
$xml = [xml](get-content "C:\datei.xml")
Ein oft gemachter Fehler um XML-Dateien einzulesen ohne das Encoding Get-Content mitzugeben ... XML Files am bester so einlesen
$xml = New-Object XML
$xml.Load("C:\datei.xml")  
Dann wird das Encoding durch den XML Parser und aus der XML Deklaration richtig erkannt.
Ansonsten Get-Content das korrekte Encoding der Datei mitgeben
$xml = [xml](get-content "C:\datei.xml" -Encoding UTF8)  
Und natürlich sicherstellen, dass die Skript -Datei selbst auch im UTF8 Encoding gespeichert ist.

Zeppel

Das Problem ist nicht, dass die Originaldaten aus der XML falsch dargestellt werden, sondern dass der Inhalt meiner Variable falsch dargestellt wird.
Das PS1 Skript ist mit UTF8 abgespeichert.

Grüße vom it-frosch
it-frosch
it-frosch 23.06.2023 um 15:17:21 Uhr
Goto Top
Zitat von @6376382705:

Hi.

Für den
Write-Host

zu Beginn deines Scriptes folgendes einfügen:
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8

ansonsten was @7426148943 schrieb (Ausgabe als XML)
Gruß

Die Write-Host Ausgabe ist immer noch falsch.

Grüße vom it-frosch
it-frosch
it-frosch 23.06.2023 um 15:25:44 Uhr
Goto Top
@6376382705,@Zeppel,@emeriks

ich habe eure Vorschläge in den Code eingearbeitet.
Das Ergebnis ist leider immer noch dasselbe.
Über Write-Host wie auch beim Abspeichern der XML Datei wird in dem der durch mich beschreibenen Wert
das ß falsch angezeigt.

Grüße vom it-frosch
7426148943
7426148943 23.06.2023 aktualisiert um 15:29:16 Uhr
Goto Top
Dann ist deine Skript-Datei fehlerhaft. Schau mal ob die mit oder ohne BOM gesichert ist
it-frosch
it-frosch 23.06.2023 um 15:42:02 Uhr
Goto Top
Ich habe bisher das Skript in VS Code oder in Notepad bearbeitet.
Hier wurden mir meine Eingaben in der Datei sauber angzeigt (als ß).

Jetzt habe ich die PS1 Datei in der ISE geöffnet und sehe das alle meine EIngaben falsch codiert sind.
Nachdem ich das korrigiert habe, wurden sowohl mit Write-Host und xml.save die Umlaut korrekt ausgegeben bzw. in den XML File geschrieben.

Ich hatte die PS1 Datei in VS Code neu erstellt. Vielleicht hat das nachträgliche Abspeichern in Notepad als UTF8 den Unterschied gemacht. Obwohl UTF8 beim Speichern unten schon ausgewählt war.

Es geht aber ich weiß nicht warum. So richtig glücklich macht mich das auch nicht.
Ich werde am WE alles noch einmal von Anfang an nachstellen und dann schauen ob ich die Stelle finde.

Trotzdem danke euch fürs Mitdenken.

Schönes WE vom it-frosch
it-frosch
it-frosch 23.06.2023 um 15:43:29 Uhr
Goto Top
Zitat von @7426148943:

Dann ist deine Skript-Datei fehlerhaft. Schau mal ob die mit oder ohne BOM gesichert ist

Schau mal ob die mit oder ohne BOM gesichert ist
Woran bzw. wie sehe ich das?

Grüße vom it-frosch
7426148943
Lösung 7426148943 23.06.2023 aktualisiert um 16:03:39 Uhr
Goto Top
Aua, so ein Mischmasch an Editoren, "never use the classic notepad if you don't know what you are doing" face-wink. Wie vermutet face-smile.
Woran bzw. wie sehe ich das?
An den ersten 3 Bytes der Datei., die dann lauten EF BB BF in HEX bei UTF8.

screenshot

Ohne BOM im Header gibts nämlich bei Powershell meistens genau diese Encoding-Probleme wenn Sonderzeichen außerhalb des ASCII satzes verwendet werden ...
6376382705
Lösung 6376382705 23.06.2023 um 15:47:27 Uhr
Goto Top
Führe deinen Code doch mal direkt in der ISE aus. Bei mir funktioniert das alles problemlos.

Normalerweise zieht Powershell auch die Kodierung vom OS. Ist da vielleicht was verbogen?

Woran bzw. wie sehe ich das?
Deine XML/deine PS-File mal im Notepad++ aufmachen und schauen was da hinterlegt ist:
utf8

Aber kipp deinen Code einfach mal in die Powershell ISE ein und lass es da mal laufen.

Gruß
it-frosch
it-frosch 23.06.2023 um 15:56:45 Uhr
Goto Top
Wenn ich jetzt den korrekt funktionierenden Code in VS Code öffne werden mir hier die Umlaute falsch angezeigt.
VS Code steht auf UTF-8 und die Datei hat auch UTF-8.

Wenn ich die Datei jetzt in VS Code mit Reopen with Encoding öffne und ISO8859-1 auswähle,
dann zeigt VS Code die Umlaute wieder sauber an.

Jetzt versteht ich gar nichts mehr. face-sad

Wenn noch jemand ein Erklärungshilfe hat, immer her damit.

Grüße vom it-frosch
7426148943
7426148943 23.06.2023 aktualisiert um 16:01:15 Uhr
Goto Top
Ja, speichere mit BOM in UTF8 und schon lüppt dat ... Brauchst nur einmal mit und einmal ohne BOM speichern dann siehst du den Unterschied face-wink.
it-frosch
it-frosch 23.06.2023 um 15:58:44 Uhr
Goto Top
Zitat von @7426148943:

Aua, so ein Mischmasch an Editoren, "never use the classic notepad if you don't know what you are doing" face-wink. Wie vermutet face-smile.
Ich habe das Skript in VS Code erstellt und nur in Notepad geöffnet und mit Speichern unter geprüft dass auch UTF8 gespeichert wird.

Woran bzw. wie sehe ich das?
An den ersten 3 Bytes der Datei., die dann lauten EF BB BF in HEX bei UTF8.

screenshot

Ohne BOM im Header gibts nämlich bei Powershell meistens genau diese Encoding-Probleme ...
Danke dir.
it-frosch
it-frosch 23.06.2023 um 16:00:17 Uhr
Goto Top
Zitat von @6376382705:

Führe deinen Code doch mal direkt in der ISE aus. Bei mir funktioniert das alles problemlos.

Normalerweise zieht Powershell auch die Kodierung vom OS. Ist da vielleicht was verbogen?

Woran bzw. wie sehe ich das?
Deine XML/deine PS-File mal im Notepad++ aufmachen und schauen was da hinterlegt ist:
utf8

Aber kipp deinen Code einfach mal in die Powershell ISE ein und lass es da mal laufen.

Gruß

Notepad++ zeigt ANSI an. face-smile

Grüße vom it-frosch
7426148943
7426148943 23.06.2023 aktualisiert um 16:01:05 Uhr
Goto Top
Was zum Lesen
https://learn.microsoft.com/de-de/powershell/module/microsoft.powershell ...

p.s. kannst du bitte immer nur ein Kommentar schreiben und nciht x hintereinander?! Das nervt gewaltig.
it-frosch
it-frosch 23.06.2023 aktualisiert um 16:02:03 Uhr
Goto Top
ich sehe schon, das ist kein Powershell sondern mehr ein Verständnis Problem. :D


@7426148943
p.s. kannst du bitte immer nur ein Kommentar schreiben und nciht x hintereinander?!
stimmt