Ich habe eine Webanwendung, mit der Benutzer ihren Inhalt zur Verarbeitung hochladen können. Die Verarbeitungs-Engine erwartet UTF8 (und ich erstelle XML aus mehreren Benutzerdateien), also muss ich sicherstellen, dass ich die hochgeladenen Dateien richtig dekodieren kann.
Da ich überrascht sein würde, wenn einer meiner Benutzer wüsste, dass seine Dateien sogar codiert sind, habe ich sehr wenig Hoffnung, dass er die Kodierung korrekt spezifizieren kann (Decoder) zu verwenden. Und so bleibt meiner Anwendung die Aufgabe, vor der Decodierung zu erkennen.
Das scheint so ein universelles Problem zu sein, ich bin überrascht, weder eine Rahmenfähigkeit noch ein allgemeines Rezept für die Lösung zu finden. Kann es sein, dass ich nicht mit aussagekräftigen Suchbegriffen suche?
Ich habe die BOM-Erkennung implementiert ( Ссылка ), aber ich bin mir nicht sicher, wie oft Dateien hochgeladen werden ohne BOM, um die Kodierung anzuzeigen, und das ist nicht nützlich für die meisten Nicht-UTF-Dateien.
Meine Fragen laufen auf:
Bisher habe ich gefunden:
Danke.
Es wird keinen absolut zuverlässigen Weg geben, aber Sie können vielleicht mit einigen Heuristiken ein "ziemlich gutes" Ergebnis erzielen.
Ob "ziemlich gut" "gut genug" ist, hängt natürlich von Ihrer Anwendung ab. Wenn Sie sicher sein möchten, können Sie die Ergebnisse als Vorschau anzeigen und den Benutzer bestätigen lassen, dass die Daten korrekt aussehen. Wenn dies nicht der Fall ist, versuchen Sie die nächste wahrscheinliche Codierung, bis der Benutzer zufrieden ist.
Hinweis : Dieser Algorithmus funktioniert nicht, wenn die Daten ungültige Zeichen enthalten. Zum Beispiel wird ein einzelnes Müll-Byte in ansonsten gültigem utf-8 dazu führen, dass die utf-8-Decodierung fehlschlägt, wodurch der Algorithmus den falschen Pfad verlässt. Möglicherweise müssen Sie zusätzliche Maßnahmen ergreifen, um damit umzugehen. Wenn Sie beispielsweise möglichen Müll im Voraus identifizieren können, entfernen Sie ihn, bevor Sie versuchen, die Codierung zu ermitteln. (Es spielt keine Rolle, ob Sie zu aggressiv werden, sobald Sie die Kodierung festgelegt haben, können Sie die ursprünglichen nicht-entschlüsselten Daten dekodieren. Konfigurieren Sie die Dekoder einfach so, dass sie ungültige Zeichen ersetzen, anstatt eine Ausnahme auszulösen.) Oder zählen Sie Dekodierfehler und gewichten Sie diese entsprechend . Aber das hängt wahrscheinlich sehr von der Art Ihres Mülls ab, d. H. Welche Annahmen Sie treffen können.
Haben Sie versucht, einen repräsentativen Querschnitt Ihrer Dateien vom Benutzer zu lesen, sie durch Ihr Programm zu führen, zu testen, Fehler zu korrigieren und weiterzumachen?
Ich habe festgestellt, dass File.ReadAllLines () in einer großen Bandbreite von Anwendungen ziemlich effektiv ist, ohne sich um alle Codierungen kümmern zu müssen. Es scheint ziemlich gut damit umzugehen.
Xmlreader () hat ziemlich gut gemacht, sobald ich herausgefunden habe, wie man es richtig benutzt.
Vielleicht könnten Sie einige spezifische Beispiele von Daten veröffentlichen und einige bessere Antworten erhalten.
Dies ist ein bekanntes Problem. Sie können versuchen, was Internet Explorer tut. Dies ist ein netter Artikel im CodeProject, der die Lösung von Microsoft für das Problem beschreibt. Jedoch ist keine Lösung zu 100% korrekt, da alles auf Heuristiken basiert. Und es ist auch nicht sicher anzunehmen, dass eine Stückliste vorhanden sein wird.
Sie können sich eine Python-basierte Lösung mit dem Namen chardet ansehen. Es ist ein Python-Port von Mozilla-Code. Obwohl Sie es möglicherweise nicht direkt verwenden können, ist seine Dokumentation lesenswert, genauso wie der ursprüngliche Mozilla-Artikel, auf den sie verweist.
Tags und Links string c# utf-8 multilingual utf-16