Wie kann ich die Kodierung / Codepage einer Textdatei erkennen?
In unserer Anwendung, erhalten wir text-Dateien ( .txt
, .csv
usw.) aus diversen Quellen. Beim Lesen, diese Dateien enthalten manchmal Müll, da die Dateien, in denen erstellt, die in eine andere/unbekannte codepage.
Gibt es eine Möglichkeit, (automatisch) erkennt den Zeichensatz einer text-Datei?
Den detectEncodingFromByteOrderMarks
auf der StreamReader
Konstruktor, arbeitet für UTF8
und andere unicode markiert Dateien, aber ich bin auf der Suche nach einem Weg, um zu erkennen, code-Seiten, wie ibm850
windows1252
.
Dank für Eure Antworten, dies ist, was ich getan habe.
Dateien, die wir erhalten, sind von der end-Benutzer, Sie haben nicht einen Anhaltspunkt über codepages. Die Receiver sind auch end-Anwendern jetzt das ist, was Sie wissen über Zeichensätze: Zeichentabellen existieren, und Sie sind ärgerlich.
Lösung:
- Öffnen Sie die empfangene Datei in Editor, Blick auf einen verstümmelten text. Wenn jemand namens François oder so, mit eurer menschlichen Intelligenz, die Sie erraten können.
- Ich habe eine kleine Anwendung, die Benutzer verwenden können, um die Datei zu öffnen, und geben Sie einen text ein, der Benutzer kennt es erscheint in der Datei, wenn der richtige Zeichensatz verwendet wird.
- Schleife über alle Zeichensätze und zeigen diejenigen, die Sie geben, eine Lösung mit dem Nutzer zur Verfügung gestellten text.
- Wenn mehr als eine codepage erscheint, bitten Sie den Benutzer, geben Sie mehr text.
InformationsquelleAutor der Frage GvS | 2008-09-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht erkennen, die codepage, die Sie erzählt werden müssen. Sie können analysieren, die bytes und Schätze es, aber das kann ein paar bizarre (manchmal amüsant) Ergebnisse. Ich finde es jetzt nicht, aber ich bin mir sicher, dass Notepad kann ausgetrickst werden, die Anzeige englische text in Chinesisch.
Sowieso, das ist, was Sie brauchen, um zu Lesen:
Das Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!).
Speziell Joel sagt:
InformationsquelleAutor der Antwort JV.
Wenn Sie schauen, um zu erkennen, nicht-UTF-Codierungen (d.h. keine Stückliste), sind Sie grundsätzlich nach unten auf Heuristiken und statistische Analyse des Textes. Möchten Sie vielleicht einen Blick auf die Mozilla Papier auf universal-charset-Erkennung (derselbe link mit besserer Formatierung via Wayback Machine).
InformationsquelleAutor der Antwort Tomer Gabel
Haben Sie versucht, C# - port für Mozilla Universal Charset Detector
Beispiel aus http://code.google.com/p/ude/
InformationsquelleAutor der Antwort ITmeze
Dies ist eindeutig falsch. Jeder web-browser hat eine Art von universal-charset detector Umgang mit Seiten, die keinerlei Hinweis auf eine Verschlüsselung. Firefox hat. Sie können den code herunterladen und sehen, wie er es tut. Siehe Dokumentation, die hier. Im Grunde ist es eine heuristische, aber eine, die funktioniert wirklich gut.
Erhält eine angemessene Menge an text, ist es auch möglich, zu erkennen, die Sprache.
Hier ist noch eins Ich gerade gefunden über Google:
InformationsquelleAutor der Antwort shoosh
Ich weiß, es ist sehr spät für diese Frage und diese Lösung wird nicht Appell an einige (wegen seiner Englisch-centric bias und seine fehlende statistische/empirische Tests), aber es funktionierte sehr gut für mich, vor allem für die Verarbeitung hochgeladenen CSV-Daten:
http://www.architectshack.com/TextFileEncodingDetector.ashx
Vorteile:
Anmerkung: ich bin derjenige, der dies schrieb, Klasse, also offensichtlich nehmen Sie es mit einem Körnchen Salz! 🙂
InformationsquelleAutor der Antwort Tao
Notepad++ hat dieses feature out-of-the-box. Es unterstützt auch, es zu ändern.
InformationsquelleAutor der Antwort hegearon
Suchen andere Lösung, die ich fand, dass
https://code.google.com/p/ude/
diese Lösung ist ein bisschen schwer.
Brauchte ich einige basic-encoding-Erkennung, basierend auf 4 ersten bytes und wahrscheinlich xml-charset-Erkennung - so habe ich nahm einige Beispiel-Quellcode aus dem internet und fügte leicht modifizierte version von
http://lists.w3.org/Archives/Public/www-validator/2002Aug/0084.html
geschrieben für Java.
Ist es genug, zu Lesen wohl ersten 1024 bytes aus der Datei, aber ich bin laden der gesamten Datei.
InformationsquelleAutor der Antwort TarmoPikaro
Wenn jemand ist auf der Suche nach einem 93.9% Lösung. Dies funktioniert für mich:
InformationsquelleAutor der Antwort Magu
Habe ich etwas getan, was ähnlich wie in Python. Grundsätzlich müssen Sie jede Menge von sample-Daten von verschiedenen Codierungen, die gebrochen sind durch eine Schiebetür zwei-byte-Fenster und wird in einem Wörterbuch gespeichert (Hashwert), keyed auf byte-Paare der Werte der Listen, Codierungen.
Gegeben, dass Wörterbuch (hash), Sie nehmen Ihren text eingeben und:
Wenn du hast auch abgetastet UTF-codierte Texte, die nicht beginnen Sie mit einer Stückliste, im zweiten Schritt wird diese, schlüpfte aus dem ersten Schritt.
So weit, es funktioniert für mich (die sample-Daten und die anschließende Eingabe der Daten sind Untertitel in verschiedenen Sprachen) mit Abnehmender Fehlerquote.
InformationsquelleAutor der Antwort tzot
Die StreamReader-Klasse ist der Konstruktor nimmt einen "detect encoding' parameter.
InformationsquelleAutor der Antwort leppie
Dem tool "uchardet" macht das gut mit Charakter Häufigkeitsverteilung Modelle für jeden Zeichensatz. Größere Dateien und mehr "typische" Dateien haben mehr Vertrauen (offensichtlich).
Auf ubuntu, die Sie gerade
apt-get install uchardet
.Auf anderen Systemen Holen Sie sich die Quelle, Nutzung & docs hier: https://github.com/BYVoid/uchardet
InformationsquelleAutor der Antwort Erik Aronesty
Wenn Sie einen link zu einer C-Bibliothek, die Sie verwenden können
libenca
. Sehen http://cihar.com/software/enca/. Aus der man-page:Es ist GPL v2.
InformationsquelleAutor der Antwort Kundor
Hab das gleiche problem, aber nicht eine gute Lösung gefunden, die noch für die Erkennung automatisch .
Jetzt bin ich mit PsPad (www.pspad.com);) Funktioniert Prima
InformationsquelleAutor der Antwort DeeCee
Da es im Grunde genommen kommt es auf Heuristiken, kann es helfen, verwenden Sie die Codierung von zuvor empfangenen Dateien aus der gleichen Quelle wie einen ersten Hinweis.
Meisten Menschen (oder Anwendungen) Dinge zu tun die in so ziemlich der gleichen Reihenfolge jedes mal, oft auf der gleichen Maschine, so dass Ihr ziemlich wahrscheinlich, dass, wenn Bob erstellt eine .csv-Datei und sendet Sie an Mary, es werde immer mit Windows-1252 oder was auch immer seine Maschine standardmäßig.
Wo möglich ein bisschen von Kunden-training schadet nie entweder 🙂
InformationsquelleAutor der Antwort devstuff
Ich war eigentlich auf der Suche nach einem generischen, nicht die Programmierung Weg von der Erkennung der Datei-Codierung, aber ich finde nicht, dass noch.
Was habe ich von Tests mit verschiedenen Codierungen war, war mein text UTF-7.
So, wo ich zuerst mache:
StreamReader Datei = Datei.OpenText(dateinamelang);
Musste ich ändern zu:
StreamReader Datei = new StreamReader(dateinamelang, System.Text.- Codierung.UTF7);
OpenText nimmt an, dass es UTF-8.
können Sie auch erstellen Sie die StreamReader-wie dies
new StreamReader(dateinamelang, true), der zweite parameter bedeutet, dass Sie sollten versuchen, und entdecken Sie die Codierung aus der byteordermark der Datei, aber das hat nicht funktioniert in meinem Fall.
InformationsquelleAutor der Antwort Intraday Tips
Datei öffnen AkelPad(oder kopieren/einfügen ein entstellter text), gehen Sie zu Bearbeiten -> Auswahl -> Recode... -> check "Autodetect".
InformationsquelleAutor der Antwort plavozont
Als addon zu ITmeze post, ich habe diese Funktion zum umwandeln der Ausgabe des C# - port für Mozilla Universal Charset Detector
MSDN
InformationsquelleAutor der Antwort PrivatePyle
Dank @Erik Aronesty für die Erwähnung
uchardet
.Inzwischen ist die (gleichen?) tool existiert für linux:
chardet
.Oder cygwin, die Sie möglicherweise verwenden möchten:
chardetect
.Finden Sie unter: chardet-Mann-Seite: https://www.commandlinux.com/man-page/man1/chardetect.1.html
Diese wird heuristisch erkennen (erraten) die Zeichenkodierung, die für jede angegebene Datei und meldet den Namen und das Konfidenzniveau für jede Datei erkannt Zeichenkodierung.
InformationsquelleAutor der Antwort Schlacki
10J (!) waren vergangen, da dieser gefragt wurde, und noch sehe ich keine Erwähnung von MS ist gut, nicht-GPL ' ed-Lösung: IMultiLanguage2 API.
Meisten Bibliotheken bereits erwähnt basieren auf Mozilla-UDE - und es scheint vernünftig, dass die Browser haben bereits aufgegriffen ähnliche Probleme. Ich weiß nicht, was ist chrome die Lösung, aber seit IE 5.0 MS freigegeben haben Ihre, und es ist:
Es ist eine native COM-Aufruf, aber hier ein paar sehr schöne Arbeit von Carsten Zeumer, dass die Griffe der interop-Messe für .net-Nutzung. Es gibt einige andere herum, aber im großen und ganzen ist diese Bibliothek nicht die Aufmerksamkeit, die es verdient.
InformationsquelleAutor der Antwort Ofek Shilon
Ich diesen code verwenden, um zu erkennen, Unicode-und windows-Standard-ansi-codepage beim Lesen einer Datei. Für andere Kodierungen, eine überprüfung der Inhalte notwendig ist, manuell oder durch Programmierung. Dies kann de verwendet, um den text speichern mit der gleichen Codierung, als wenn es geöffnet wurde. (Ich benutze VB.NET)
InformationsquelleAutor der Antwort Thommy Johansson