Encoding erkennen

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
Benutzeravatar
grubenfox
User
Beiträge: 593
Registriert: Freitag 2. Dezember 2022, 15:49

Sirius3 hat geschrieben: Montag 17. Juli 2023, 10:46 Text-Dateien sollte man immer explizit mit einem Encoding öffnen.
Wenn man das richtige Encoding denn wüsste....
Ich habe hier einen Schwung an Textdateien die ich in Markdown-Dateien umwandeln möchte (das einfügen der Markierungen für z.B. Links ist jetzt nicht das Problem). Die erste Textdatei mal versuchsweise mit einem einfachen Editor aufgemacht: sieht aber merkwürdig aus... :o
'Sublime Text' erzählt mir beim öffnen "Opened as UTF-16 LE with BOM"

Also im ersten Versuch im Konverter alle Dateien mit den Encoding utf_16_le geöffnet und mit Encoding utf_8 wieder geschrieben... bei einer Datei steigt der Konverter mit einem UnicodeError aus. Also Konverter erweitert, so das im Fehlerfall die Datei ganze nochmal mit encoding 'iso8859' geöffnet wird. Läuft jetzt zwar ohne Fehler durch, aber manche der erzeugten utf8 Markdown-Dateien sehen mir sehr asiatisch aus...

Da erzählt mir "Sublime Text" dass die Quelldateien offenbar schon mit dem Encoding uf8 vorliegen. :roll: Klar, wenn man utf8 als utf16 öffnet und dann als utf8 speichert, dann kann das nur schiefgehen.

Ich werde gleich mal beim Konverter das Encoding für den Fehlerfall von iso8859 auf utf8 ändern, dann sollte meiner Meinung nach alles richtig erkannt werden.
[P.S: Stimmt natürlich nicht! Ich brauche noch die Encoding-Erkennung... ]

Aber für den produktiven Einsatz ist dieses Vorgehen (Encoding über Sublime Text ermitteln) ja nun gar nicht zu gebrauchen. Da gehört eine gescheite Erkennung vom Encoding her (über den BOM usw.)...

Gibt es da schon etwas fertiges? Irgendeine Funktion die ich in der Python-Doku übersehen habe? Ich bin doch nach den Entwicklern von Sublime Text mindestens der zweite der so eine Funktionen gebrauchen kann (und die ganzen Fragesteller hier im Forum, die ihre Textdateien bisher ohne Encoding öffnen, stehen auch noch in der Warteschlange).

Ich würde jetzt für meine Encoding-Erkennung folgendes Mapping vom erkannten BOM auf ein Encoding wählen:
codecs.BOM_UTF16_BE : utf_16_be
codecs.BOM_UTF16_LE : utf_16_le
codecs.BOM_UTF32_BE : utf_32_be
codecs.BOM_UTF32_LE : utf_32_le
alles andere würde als utf8 eingelesen. Passt das so oder könnte ich Probleme bekommen?
Benutzeravatar
grubenfox
User
Beiträge: 593
Registriert: Freitag 2. Dezember 2022, 15:49

Es wird Probleme geben: beim einlesen von Dateien mit dem Encoding iso8859 fliegt das Programm sowohl mit dem Encoding utf_16_le, als auch mit utf_8 auf die Schnauze...

Also was mache ich bei Dateien ohne BOM? Einmal komplett mit Encoding utf_8 einlesen und wenn es knallt dann auf iso8859 wechseln? Das ist doch Murks...
Komme ich also auf meine Frage zurück: gibt es irgendwo schon eine fertige, funktionierende Encoding-Erkennung?
Sirius3
User
Beiträge: 18227
Registriert: Sonntag 21. Oktober 2012, 17:20

Eine 100%-tige Encodingerkennung gibt es nicht, Wenn eine Datei ein BOM hat, dann ist das schon ein guter Hinweis darauf, wie die Datei encodiert ist.
json.detect_encoding hat da eine Heuristik, wenn man davon ausgeht, dass das erste Zeichen in der Datei ein ASCII-Zeichen ist, ist das aber ein asiatischens Zeichen, kann das schief gehen.
Diese Heuristik könnte man noch um den Fall erweitern, dass wenn sich die Datei nicht als UTF8 dekodieren läßt man dann auf irgendein Single-Byte-Encoding zurückfällt, welches das aber ist, läßt sich so gut wie unmöglich bestimmen.
Benutzeravatar
grubenfox
User
Beiträge: 593
Registriert: Freitag 2. Dezember 2022, 15:49

Also json.detect_decoding kann ich so spontan in der Doku (Python 3.11.5) jetzt nicht finden. Die Suche nach detect_encoding hat ein tokenize.detect_encoding zu Tage gefördert.

Aber es stimmt: im Modul json gibt es etwas mit dem Namen detect_decoding ... offenbar komplett ohne Doku.

.... ich nutze doch für die Erzeugung der Textdateien die ich nach Markdown konvertieren möchte, schon undokumentierte Funktionen. Jetzt auch hier in Python noch undokumentierte Funktionen nutzen? :) [warum gibt es hier kein Smiley dem die Haare zu Berge stehen?]

"Unbestätigten Gerüchten" zufolge soll ja der Turmbau zu Babel die Ursache für die Sprachverwirrung gewesen sein. Aber welchem Ereignis haben wir die unterschiedlichen Schriften zu verdanken? Hätte man damals vielleicht vermeiden sollen... ;)
Sirius3
User
Beiträge: 18227
Registriert: Sonntag 21. Oktober 2012, 17:20

Es gibt seit zwanzig Jahren keinen Grund, warum man nicht alle Text-Dateien als UTF-8 kodiert.
Wenn Du etwas fertiges willst, benutze ein Modul wie chardet.
Benutzeravatar
grubenfox
User
Beiträge: 593
Registriert: Freitag 2. Dezember 2022, 15:49

Aha, so etwas wie chardet habe ich vermutlich gesucht. Klingt in der Theorie bzw. Doku erstmal gut. Nachher werde ich es mal in der Praxis ausprobieren.
Besten Dank!
Benutzeravatar
grubenfox
User
Beiträge: 593
Registriert: Freitag 2. Dezember 2022, 15:49

chardet ist top!
Bei mir hat es gut funktioniert (zu den Datei-Formaten hatte es gesagt: ISO-8859-1 [confidence: 0.73-0.627] und ascii bzw. UTF-16 [bei beiden war es mit confidence 1.0 100% sicher], die konvertierten Dateien sehen gut aus und ich kann mich jetzt wieder daran machen mir ein paar Heuristiken auszudenken um noch einige fehlende Links in die Markdown-Dateien reinzubekommen.... :)
Benutzeravatar
DeaD_EyE
User
Beiträge: 1206
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Sirius3 hat geschrieben: Donnerstag 31. August 2023, 11:34 Es gibt seit zwanzig Jahren keinen Grund, warum man nicht alle Text-Dateien als UTF-8 kodiert.
Wenn Du etwas fertiges willst, benutze ein Modul wie chardet.
Leider tauchen diese Daten immer wieder auf und sind ziemlich hartnäckig. Selbst neu erstellte Dokumente haben manchmal eine andere Codierung. Kaum zu fassen, aber utf8 ist nicht bei allen angekommen.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten