Powershell Fehler bei Datei Umwandlung von UTF8 auf ANSI
Hallo,
ich möchte eine Datei mit utf8-Codierung per Powershell in eine Datei mit ansi-Codierung umwandeln.
Aktuell versuche ich das mit dem folgenden Powershell-Script:
Get-Content C:\Temp\Test-utf8.txt -Raw -Encoding utf8 | Out-File C:\Temp\Test-ansi.txt -Encoding Default
Die Datei: Test-utf8.txt enthält die folgenden Testdaten:
01.10.20,00099999,Möwe,Maxi
Die Umwandlung von utf8 --> ansi funktioniert in diesem Fall einwandfrei. Die Datei: Test-ansi.txt hat die Codierung: ansi.
Bei dem gleichen Programmaufruf, nur mit den folgenden leicht geänderten Daten (Möwe gegen Moewe getauscht):
01.10.20,00099999,Moewe,Maxi
wird zwar die Datei: Test-ansi.txt erzeugt. Die Datei: Test-ansi.txt hat aber immer noch eine utf8-Codierung.
Erklären kann ich mir das nicht..
Vielleicht hat ja jemand einen Tipp für mich. Herzlichen Dank im Voraus....
Markus
ich möchte eine Datei mit utf8-Codierung per Powershell in eine Datei mit ansi-Codierung umwandeln.
Aktuell versuche ich das mit dem folgenden Powershell-Script:
Get-Content C:\Temp\Test-utf8.txt -Raw -Encoding utf8 | Out-File C:\Temp\Test-ansi.txt -Encoding Default
Die Datei: Test-utf8.txt enthält die folgenden Testdaten:
01.10.20,00099999,Möwe,Maxi
Die Umwandlung von utf8 --> ansi funktioniert in diesem Fall einwandfrei. Die Datei: Test-ansi.txt hat die Codierung: ansi.
Bei dem gleichen Programmaufruf, nur mit den folgenden leicht geänderten Daten (Möwe gegen Moewe getauscht):
01.10.20,00099999,Moewe,Maxi
wird zwar die Datei: Test-ansi.txt erzeugt. Die Datei: Test-ansi.txt hat aber immer noch eine utf8-Codierung.
Erklären kann ich mir das nicht..
Vielleicht hat ja jemand einen Tipp für mich. Herzlichen Dank im Voraus....
Markus
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 4479114215
Url: https://administrator.de/contentid/4479114215
Ausgedruckt am: 26.11.2024 um 02:11 Uhr
7 Kommentare
Neuester Kommentar
Hi!
Reference "Out-File", Parameter "-Encoding":
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell ...
Die Codepage für " Western European (Windows)" ist 1252.
Gruß
TA
Reference "Out-File", Parameter "-Encoding":
Specifies the type of encoding for the target file. The default value is utf8NoBOM.
Beginning with PowerShell 6.2, the Encoding parameter also allows numeric IDs of registered code pages (like -Encoding 1251) or string names of registered code pages (like -Encoding "windows-1251")
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell ...
Die Codepage für " Western European (Windows)" ist 1252.
Gruß
TA
Beginning with PowerShell 6.2
Geht auch mit der 5.1 wenn man die .NET Functions bemüht.[IO.File]::WriteAllText('C:\Temp\Test-ansi.txt',(Get-Content 'C:\Temp\Test-utf8.txt' -Raw -Encoding UTF8),[System.Text.Encoding]::GetEncoding(1252))
Moin Markus,
Bei Kodierungen ohne BOM gibt es (erst mal) keine Anhaltspunkte, anhand derer ein Editor die verwendete Kodierung erkennen könnte.
Sobald du jedoch spezielle Zeichen wie eben Umlaute verwendest, können die Editoren dann interpretieren, zu welcher Kodierung die verwendeten Zeichen passen.
Gruß Thomas
Zitat von @makroll10:
Bei dem gleichen Programmaufruf, nur mit den folgenden leicht geänderten Daten (Möwe gegen Moewe getauscht):
01.10.20,00099999,Moewe,Maxi
wird zwar die Datei: Test-ansi.txt erzeugt. Die Datei: Test-ansi.txt hat aber immer noch eine utf8-Codierung.
das ist ganz normal.Bei dem gleichen Programmaufruf, nur mit den folgenden leicht geänderten Daten (Möwe gegen Moewe getauscht):
01.10.20,00099999,Moewe,Maxi
wird zwar die Datei: Test-ansi.txt erzeugt. Die Datei: Test-ansi.txt hat aber immer noch eine utf8-Codierung.
Bei Kodierungen ohne BOM gibt es (erst mal) keine Anhaltspunkte, anhand derer ein Editor die verwendete Kodierung erkennen könnte.
Sobald du jedoch spezielle Zeichen wie eben Umlaute verwendest, können die Editoren dann interpretieren, zu welcher Kodierung die verwendeten Zeichen passen.
Gruß Thomas
Nein, das Ganze hat überhaupt nichts mit Powershell zu tun. Auch wenn du diese Datei mit einem x-beliebigen Editor erstellst, bleibt das Problem.
Erstelle eine Textdatei, die nur das Wort "Test" enthält. Diese lädst du mit:
Alternativ können wir auch die beiden Encoder laden
und mit diesen jeweils das Wort "Test" in ein Bytearray umwandeln:
Bei allen Aufrufen werdet ihr immer die selben 4 Bytes erhalten, nämlich
Aus mehr als diesen 4 Bytes besteht diese Datei nicht - und diese 4 Bytes sind bei UTF8 & ANSI vollkommen identisch.
Nun die Millionen-€-Frage: Woher soll der Editor also nun wissen, um welche Kodierung es sich handelt?
- Geht nicht.
Nun nehmen wir einen Umlaut - bleiben wir einfach mal bei dem "ö" aus Möwe:
Wandeln wir die Bytefolge nun in die andere Kodierung um, wird schnell klar: Da kann was nicht stimmen.
Genau so machen es auch die Texteditoren.
Wir können noch als abschließenden Test die jeweilige Bytefolge als Textdatei abspeichern:
Wie ihr seht, haben wir eigentlich überhaupt keine Textkodierung definiert - sondern nur die Bytes exportiert. Der Editor zeigt dennoch bei beiden jeweils das Zeichen "ö" an, einmal als UFT8- und einmal als ANSI-Kodierung.
Gruß Thomas
Zum besseren Verständnis, machen wir ein kleines Praxisexperiment:
Erstelle eine Textdatei, die nur das Wort "Test" enthält. Diese lädst du mit:
Get-Content -Encoding Byte -path <datei>
Alternativ können wir auch die beiden Encoder laden
$UTF8 = [System.Text.Encoding]::UTF8
$ANSI = [System.Text.Encoding]::GetEncoding(1252)
$UTF8.GetBytes("Test")
$ANSI.GetBytes("Test")
Bei allen Aufrufen werdet ihr immer die selben 4 Bytes erhalten, nämlich
PS C:\> "Test".ToCharArray()|%{"{0,3} = {1}" -f [int]$_,$_}
84 = T
101 = e
115 = s
116 = t
Aus mehr als diesen 4 Bytes besteht diese Datei nicht - und diese 4 Bytes sind bei UTF8 & ANSI vollkommen identisch.
Nun die Millionen-€-Frage: Woher soll der Editor also nun wissen, um welche Kodierung es sich handelt?
- Geht nicht.
Nun nehmen wir einen Umlaut - bleiben wir einfach mal bei dem "ö" aus Möwe:
PS C:\> $UTF8.GetBytes('ö')
195
182
PS C:\> $ANSI.GetBytes('ö')
246
Wandeln wir die Bytefolge nun in die andere Kodierung um, wird schnell klar: Da kann was nicht stimmen.
PS C:\> $UTF8.GetString(@(246))
�
PS C:\> $ANSI.GetString(@(195,182))
ö
Wir können noch als abschließenden Test die jeweilige Bytefolge als Textdatei abspeichern:
[byte[]]@(246) | Set-Content -Encoding Byte ansi.txt
[byte[]]@(195,182) | Set-Content -Encoding Byte utf8.txt
Gruß Thomas