A-Encoding nach B-Encoding umwandeln

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
GabrielleChanel
User
Beiträge: 42
Registriert: Dienstag 13. April 2021, 11:54

Wie kann ich jede beliebige Datei (.txt, .json,...) einlesen und deren Encoding automatisch rauslesen? Ich meine ohne, dass die Information über das Encoding in der ersten Zeile steht oder irgendwoanderst. Manche Editoren haben eine "Encoding"-Detektor (dann kann man das Encoding ablesen) und zeigen diese auf, doch was geschieht im Editor dahinter, um es herauszufinden? Nehmen wir an eine Datei ist in ANSI geschrieben, wie finde ich dies automatisch (ohne abzulesen und ohne Zusatzinformation) heraus?
Und nachdem ich es herausgefunden habe, wie kann ich es in ein anderes Encoding umwandeln (beispielsweise in UTF-8)? Über Bytes geht dies bei mir nur wenn ich das Encoding schon weiss und jeweils nur von A-Encoding zur A-Bytes-Repräsentation und wieder zurück in die A-Encoding, jedoch nicht in eine B-Encoding. Wie kann ich dem umgehen und dieses Problem lösen?

Hier ein Beispiel für ANSI:
b'Kahl\xfaa' #als Byte
Kahlúa #als str (Wort)
Wie wandle ich es in UTF-8 um?
"Those who can imagine anything, can create the impossible." Alan Turing
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Es gibt keinen golden Weg hierfür, nur Annäherungen:

- Vorwissen übers Encoding: Konventionen auf BS-Ebene (system encoding) oder Einstellungen des Editors (output encoding) geben das Encoding vor. Damit klappt dann auch das Wiedereinlesen, wenn sich nicht die Einstellungen zwischendurch geändert haben.
- BOM: Manche Unicode-Encodings unterstützen ein stummes Zeichen, welches Nutzdaten vorangestellt werden kann, um Bitbreite und Endianess beim Einlesen ableiten zu können. Wird allerdings von den meisten Encodings nicht unterstützt (und gilt als Fehler in reinen UTF8 Umgebungen).

Zum Thema Umwandeln von Encodings schau mal hier: viewtopic.php?t=5095 (habs jetzt nicht angeschaut, keine Ahnung, ob das noch noch aktuell ist oder nur Python 2 abdeckt)

NB: Es gibt kein ANSI-Encoding. Das ist großer Windowsquatsch.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Man kann das Encoding im Allgemeinen nicht herausfinden.
Editoren raten, indem sie unterschiedliche Encodings ausprobieren.
Meist wird probiert, ob es sich um gültiges UTF8 handelt und falls nicht, wird das Encoding, das den aktuellen Spracheinstellungen entspricht, genommen.
GabrielleChanel
User
Beiträge: 42
Registriert: Dienstag 13. April 2021, 11:54

@Sirius3 Vielen herzlichen Dank Sirius, nun kann ich es besser nachvollziehen :)
@jerch danke für die Seite, ich suche weiterhin nach einer Lösung und ja die Seite ist auf Python2 (z.B. sieht das print-statement anders aus). Wieso gibt es kein ANSI? Laut Notepad++ steht einer meiner Files in ANSI.
"Those who can imagine anything, can create the impossible." Alan Turing
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@GabrielleChanel ANSI-Encoding ist ein Verweis auf das Standard-Encoding Deiner Windows-Installation. Kann von CP-1252 bis UTF16LE alles mögliche sein.

Für die Umwandlung findest Du alternativ alles Wichtige in der offiziellen Doku: https://docs.python.org/3/howto/unicode.html und https://docs.python.org/3/library/codecs.html.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wenn man selbst keinen Code zum raten schreiben möchte, so etwas gibt es schon fertig als Bibliothek: https://pypi.org/project/chardet/

JSON ist ein Sonderfall, weil das in 99,99% irgendeine UTF-*-Variante mit oder ohne BOM ist und man dem `json`-Modul aus der Standardbibliothek eine im *Binärmodus* geöffnete Datei geben kann, und dass dann selbst herausfindet in welcher Variante das kodiert ist.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten