In unserer Anwendung erhalten wir Textdateien ( .txt
, .csv
usw.) aus verschiedenen Quellen. Beim Lesen enthalten diese Dateien manchmal Müll, da die Dateien in einer anderen / unbekannten Codepage erstellt wurden.
Gibt es eine Möglichkeit, die Codepage einer Textdatei (automatisch) zu erkennen?
Die detectEncodingFromByteOrderMarks
auf dem StreamReader
Konstruktor, arbeiten für UTF8
und andere Unicode markiert Dateien, aber ich bin auf der Suche nach einer Möglichkeit , Code - Seiten zu erkennen, wie ibm850
, windows1252
.
Vielen Dank für Ihre Antworten, das habe ich getan.
Die Dateien, die wir erhalten, stammen von Endbenutzern und haben keine Ahnung von Codepages. Die Empfänger sind auch Endbenutzer. Mittlerweile wissen sie Folgendes über Codepages: Codepages existieren und sind ärgerlich.
Lösung:
- Öffnen Sie die empfangene Datei im Editor und sehen Sie sich einen verstümmelten Text an. Wenn jemand François oder so heißt, können Sie dies mit Ihrer menschlichen Intelligenz erraten.
- Ich habe eine kleine App erstellt, mit der der Benutzer die Datei öffnen und einen Text eingeben kann, von dem der Benutzer weiß, dass er in der Datei angezeigt wird, wenn die richtige Codepage verwendet wird.
- Durchlaufen Sie alle Codepages und zeigen Sie diejenigen an, die eine Lösung mit dem vom Benutzer bereitgestellten Text bieten.
- Wenn mehr als eine Codepage angezeigt wird, bitten Sie den Benutzer, mehr Text anzugeben.
Wenn Sie Nicht-UTF-Codierungen (dh keine Stückliste) erkennen möchten, müssen Sie im Wesentlichen die Heuristik und die statistische Analyse des Textes durchführen. Vielleicht möchten Sie einen Blick auf das Mozilla-Papier zur universellen Zeichensatzerkennung werfen ( gleicher Link mit besserer Formatierung über Wayback Machine ).
quelle
Haben Sie C # -Port für Mozilla Universal Charset Detector ausprobiert ?
Beispiel von http://code.google.com/p/ude/
quelle
private Encoding GetEncodingFromString(string encoding) { try { return Encoding.GetEncoding(encoding); } catch { return Encoding.ASCII; } }
Das ist eindeutig falsch. Jeder Webbrowser verfügt über eine Art universellen Zeichensatzdetektor für Seiten, die keinerlei Hinweis auf eine Codierung enthalten. Firefox hat einen. Sie können den Code herunterladen und sehen, wie es funktioniert. Eine Dokumentation finden Sie hier . Grundsätzlich ist es eine Heuristik, die aber sehr gut funktioniert.
Bei einer angemessenen Textmenge ist es sogar möglich, die Sprache zu erkennen.
Hier ist eine andere, die ich gerade mit Google gefunden habe:
quelle
a character encoding declaration is required even if the encoding is US-ASCII
eine fehlende Deklaration dazu, dass ein heuristischer Algorithmus verwendet wird und nicht auf UTF8 zurückgegriffen wird.Ich weiß, dass es für diese Frage sehr spät ist und diese Lösung einige nicht ansprechen wird (aufgrund ihrer englischsprachigen Tendenz und des Fehlens statistischer / empirischer Tests), aber sie hat bei mir sehr gut funktioniert, insbesondere bei der Verarbeitung hochgeladener CSV-Daten:
http://www.architectshack.com/TextFileEncodingDetector.ashx
Vorteile:
Hinweis: Ich bin derjenige, der diese Klasse geschrieben hat, also nimm sie offensichtlich mit einem Körnchen Salz! :) :)
quelle
Notepad ++ bietet diese Funktion sofort. Es unterstützt auch das Ändern.
quelle
Auf der Suche nach einer anderen Lösung habe ich das gefunden
https://code.google.com/p/ude/
Diese Lösung ist ziemlich schwer.
Ich brauchte eine grundlegende Codierungserkennung, basierend auf 4 ersten Bytes und wahrscheinlich einer XML-Zeichensatzerkennung. Deshalb habe ich einen Beispielquellcode aus dem Internet genommen und eine leicht modifizierte Version von hinzugefügt
http://lists.w3.org/Archives/Public/www-validator/2002Aug/0084.html
geschrieben für Java.
Es reicht aus, wahrscheinlich die ersten 1024 Bytes aus der Datei zu lesen, aber ich lade die ganze Datei.
quelle
Wenn jemand nach einer 93,9% igen Lösung sucht. Das funktioniert bei mir:
quelle
Ich habe etwas Ähnliches in Python gemacht. Grundsätzlich benötigen Sie viele Beispieldaten aus verschiedenen Codierungen, die durch ein verschiebbares Zwei-Byte-Fenster aufgeschlüsselt und in einem Wörterbuch (Hash) gespeichert sind, das auf Byte-Paaren verschlüsselt ist und Werte für Codierungslisten liefert.
Mit diesem Wörterbuch (Hash) nehmen Sie Ihren Eingabetext und:
Wenn Sie auch UTF-codierte Texte abgetastet haben, die nicht mit einer Stückliste beginnen, werden im zweiten Schritt diejenigen behandelt, die aus dem ersten Schritt herausgerutscht sind.
Bisher funktioniert es bei mir (die Beispieldaten und nachfolgenden Eingabedaten sind Untertitel in verschiedenen Sprachen) mit abnehmenden Fehlerraten.
quelle
Das Tool "uchardet" macht dies gut, indem es Zeichenhäufigkeitsverteilungsmodelle für jeden Zeichensatz verwendet. Größere Dateien und "typischere" Dateien haben (offensichtlich) mehr Vertrauen.
Auf Ubuntu bist du einfach
apt-get install uchardet
.Auf anderen Systemen finden Sie Quelle, Verwendung und Dokumente hier: https://github.com/BYVoid/uchardet
quelle
brew install uchardet
Der Konstruktor der StreamReader-Klasse verwendet einen Parameter zum Erkennen der Codierung.
quelle
Wenn Sie eine Verknüpfung zu einer C-Bibliothek herstellen können, können Sie diese verwenden
libenca
. Siehe http://cihar.com/software/enca/ . Von der Manpage:Es ist GPL v2.
quelle
Ich habe das gleiche Problem, aber noch keine gute Lösung gefunden, um es automatisch zu erkennen. Jetzt benutze ich PsPad (www.pspad.com) dafür;) Funktioniert gut
quelle
Da es sich im Wesentlichen um Heuristiken handelt, kann es hilfreich sein, die Codierung zuvor empfangener Dateien aus derselben Quelle als ersten Hinweis zu verwenden.
Die meisten Leute (oder Anwendungen) erledigen Dinge jedes Mal in der gleichen Reihenfolge, oft auf demselben Computer. Wenn Bob eine CSV-Datei erstellt und an Mary sendet, wird sie wahrscheinlich immer Windows-1252 oder verwenden was auch immer seine Maschine standardmäßig ist.
Wo möglich schadet auch ein bisschen Kundenschulung nie :-)
quelle
Eigentlich suchte ich nach einer generischen, nicht programmierbaren Methode zum Erkennen der Dateicodierung, fand diese aber noch nicht. Beim Testen mit verschiedenen Codierungen stellte ich fest, dass mein Text UTF-7 war.
Also, wo ich zuerst war: StreamReader file = File.OpenText (vollständiger Dateiname);
Ich musste es ändern in: StreamReader file = new StreamReader (vollständiger Dateiname, System.Text.Encoding.UTF7);
OpenText geht davon aus, dass es sich um UTF-8 handelt.
Sie können den StreamReader auch wie diesen neuen StreamReader (vollständiger Dateiname, true) erstellen. Der zweite Parameter bedeutet, dass versucht werden soll, die Codierung anhand der Byteordermarkierung der Datei zu erkennen. In meinem Fall hat dies jedoch nicht funktioniert.
quelle
Öffnen Sie die Datei in AkelPad (oder kopieren Sie einfach einen verstümmelten Text) und gehen Sie zu Bearbeiten -> Auswahl -> Neu codieren ... -> aktivieren Sie "Autodetect".
quelle
Als Addon zum ITmeze-Beitrag habe ich diese Funktion verwendet, um die Ausgabe des C # -Ports für Mozilla Universal Charset Detector zu konvertieren
MSDN
quelle
Vielen Dank an Erik Aronesty für die Erwähnung
uchardet
.Mittlerweile gibt es das (gleiche?) Tool für Linux :
chardet
.Oder Sie möchten auf cygwin Folgendes verwenden:
chardetect
.Siehe: Chardet-Manpage: https://www.commandlinux.com/man-page/man1/chardetect.1.html
Dadurch wird die Zeichenkodierung für jede gegebene Datei heuristisch erkannt (erraten) und der Name und das Konfidenzniveau für die erkannte Zeichenkodierung jeder Datei angegeben.
quelle
Ich verwende diesen Code, um beim Lesen einer Datei die Unicode- und Windows-Standard-Ansi-Codepage zu erkennen. Für andere Codierungen ist eine Überprüfung des Inhalts manuell oder durch Programmierung erforderlich. Dies kann verwendet werden, um den Text mit derselben Codierung wie beim Öffnen zu speichern. (Ich benutze VB.NET)
quelle
10Y (!) War vergangen, seit dies gefragt wurde, und ich sehe immer noch keine Erwähnung der guten, nicht GPL-fähigen Lösung von MS: IMultiLanguage2 API.
Die meisten bereits erwähnten Bibliotheken basieren auf Mozillas UDE - und es scheint vernünftig, dass Browser bereits ähnliche Probleme gelöst haben. Ich weiß nicht, was die Lösung von Chrome ist, aber seit IE 5.0 haben MS ihre veröffentlicht, und es ist:
Es ist ein nativer COM-Aufruf, aber hier ist eine sehr schöne Arbeit von Carsten Zeumer, die das Interop-Chaos für die .net-Nutzung behandelt. Es gibt einige andere, aber im Großen und Ganzen bekommt diese Bibliothek nicht die Aufmerksamkeit, die sie verdient.
quelle