Bei der Arbeit scheint es, als würde keine Woche ohne eine kodierungsbedingte Verbindung, ein Unglück oder eine Katastrophe vergehen. Das Problem ist normalerweise auf Programmierer zurückzuführen, die glauben, eine Textdatei zuverlässig verarbeiten zu können, ohne die Codierung anzugeben. Aber du kannst nicht.
Daher wurde beschlossen, Dateien künftig zu verbieten, jemals Namen zu haben, die mit *.txt
oder enden *.text
. Der Gedanke ist, dass diese Erweiterungen den Gelegenheitsprogrammierer in eine langweilige Selbstzufriedenheit in Bezug auf Codierungen führen, was zu einer unsachgemäßen Handhabung führt. Es wäre fast besser, überhaupt keine Erweiterung zu haben, denn zumindest dann wissen Sie , dass Sie nicht wissen, was Sie haben.
Wir werden jedoch nicht so weit gehen. Stattdessen wird erwartet, dass Sie einen Dateinamen verwenden, der mit der Codierung endet. Also für Textdateien, zum Beispiel, wäre dies so etwas wie README.ascii
, README.latin1
, README.utf8
usw.
Wenn Sie für Dateien, die eine bestimmte Erweiterung erfordern, die Codierung in der Datei selbst angeben können, z. B. in Perl oder Python, müssen Sie dies tun. Bei Dateien wie der Java-Quelle, in denen keine solche Funktion innerhalb der Datei vorhanden ist, setzen Sie die Codierung vor die Erweiterung, z SomeClass-utf8.java
.
Für die Ausgabe ist UTF-8 stark zu bevorzugen.
Für die Eingabe müssen wir jedoch herausfinden, wie wir mit den Tausenden von Dateien in unserer Codebasis namens umgehen sollen *.txt
. Wir möchten alle umbenennen, damit sie in unseren neuen Standard passen. Aber wir können sie unmöglich alle betrachten. Wir brauchen also eine Bibliothek oder ein Programm, das tatsächlich funktioniert.
Diese sind in ASCII, ISO-8859-1, UTF-8, Microsoft CP1252 oder Apple MacRoman erhältlich. Obwohl wir wissen, dass wir feststellen können, ob etwas ASCII ist, und wir wissen, ob es sich wahrscheinlich um UTF-8 handelt, sind wir über die 8-Bit-Codierungen ratlos. Da wir in einer gemischten Unix-Umgebung (Solaris, Linux, Darwin) arbeiten und die meisten Desktops Macs sind, haben wir einige nervige MacRoman-Dateien. Und das ist besonders ein Problem.
Seit einiger Zeit suche ich nach einer Möglichkeit, programmgesteuert zu bestimmen, welche davon
- ASCII
- ISO-8859-1
- CP1252
- MacRoman
- UTF-8
Eine Datei befindet sich in und ich habe kein Programm oder keine Bibliothek gefunden, die zuverlässig zwischen diesen drei verschiedenen 8-Bit-Codierungen unterscheiden kann. Wir haben wahrscheinlich allein über tausend MacRoman-Dateien, daher muss jeder Zeichensatzdetektor, den wir verwenden, in der Lage sein, diese herauszuspüren. Nichts, was ich mir angesehen habe, kann den Trick schaffen. Ich hatte große Hoffnungen auf die ICU-Zeichensatzdetektorbibliothek , aber sie kann nicht mit MacRoman umgehen. Ich habe mir auch Module angesehen, um in Perl und Python dasselbe zu tun, aber immer wieder ist es immer die gleiche Geschichte: Keine Unterstützung für die Erkennung von MacRoman.
Was ich daher suche, ist eine vorhandene Bibliothek oder ein Programm, das zuverlässig bestimmt, in welcher dieser fünf Codierungen sich eine Datei befindet - und vorzugsweise mehr. Insbesondere muss zwischen den drei von mir zitierten 3-Bit-Codierungen unterschieden werden, insbesondere zwischen MacRoman . Die Dateien bestehen zu mehr als 99% aus englischsprachigem Text. Es gibt einige in anderen Sprachen, aber nicht viele.
Wenn es sich um Bibliothekscode handelt, bevorzugen wir die Spracheinstellung in Perl, C, Java oder Python und in dieser Reihenfolge. Wenn es sich nur um ein Programm handelt, ist es uns egal, in welcher Sprache es sich befindet, solange es in voller Quelle vorliegt, unter Unix läuft und völlig unbelastet ist.
Hat jemand anderes das Problem gehabt, dass zig Millionen ältere Textdateien zufällig codiert wurden? Wenn ja, wie haben Sie versucht, es zu lösen, und wie erfolgreich waren Sie? Dies ist der wichtigste Aspekt meiner Frage, aber ich bin auch daran interessiert, ob Sie das Problem in Zukunft vermeiden können, wenn Sie Programmierer dazu ermutigen, ihre Dateien mit der tatsächlichen Codierung zu benennen (oder umzubenennen), in der sich diese Dateien befinden. Hat jemals jemand versucht, dies auf institutioneller Basis durchzusetzen, und wenn ja, war das erfolgreich oder nicht und warum?
Und ja, ich verstehe voll und ganz, warum man angesichts der Art des Problems keine eindeutige Antwort garantieren kann. Dies ist insbesondere bei kleinen Dateien der Fall, bei denen Sie nicht über genügend Daten verfügen, um fortzufahren. Glücklicherweise sind unsere Dateien selten klein. Abgesehen von der Zufallsdatei README
liegen die meisten im Größenbereich von 50.000 bis 250 KB, und viele sind größer. Alles, was größer als ein paar K ist, ist garantiert in Englisch.
Die Problemdomäne ist das biomedizinische Text Mining. Daher haben wir es manchmal mit umfangreichen und extrem großen Unternehmen zu tun, wie dem gesamten Open Access-Repository von PubMedCentral. Eine ziemlich große Datei ist der BioThesaurus 6.0 mit 5,7 Gigabyte. Diese Datei ist besonders ärgerlich, da es sich fast ausschließlich um UTF-8 handelt. Einige taubköpfige Personen haben jedoch ein paar Zeilen mit 8-Bit-Codierung eingefügt - Microsoft CP1252, glaube ich. Es dauert eine ganze Weile, bis Sie darauf stolpern. :((