Laden...

Textdatei hat falsche Codierung

Erstellt von Joey2020 vor 3 Jahren Letzter Beitrag vor 3 Jahren 1.684 Views
J
Joey2020 Themenstarter:in
10 Beiträge seit 2020
vor 3 Jahren
Textdatei hat falsche Codierung

Hallo Leute,

ich bin Programmieranfänger und habe ein Problem mit einer Datei die ich folgermaßen einlese:

System.IO.StreamReader file1 =
                new System.IO.StreamReader(@Datei);
while ((line = file1.ReadLine()) != null)
{
 // ...
}

Ich muss Zeile für Zeile einlesen weil ich mit jeder Zeile was mache, also möchte ich nicht die komplette Datei auf einmal einlesen.

Soweit sogut...

Der Inhalt der Datei ist:

e73e57 Pax_26.09.2019\Mex\M+U\M&U.ppt
d265d1 Pax\hdue\dwe\eew's\08Edsn_update - for ew.xls
ebb73e Pax\das dasu\ABC\121_KurzPräs.pdf
e6d6ed Pax\dsa(huuh)\~$rkeg-312HasBear 2225-04-202_UBU.doc
5fb411 Pax\dast (ds)\~Wdas764.tmp
54b429 Pax\dsds\ds- da\dsds(SAaaaawqA'S).xls
9af816a Pax\fsd - ZZZ\OK\Ea+WQW\2021Mo_K_KurzPräs.pdf

Wenn ich das File in Notepad++ öffne sagt er das die Kodierung der Datei ANSI ist.

Leider ist der Inhalt von meinem "line" in einigen Fällen "nicht korrekt".

Benutzte ich zB
System.IO.StreamReader file1 =
new System.IO.StreamReader(@Datei);
werden alle Umlaute durch so eine komische schwarze Raute mit ? ersetzt.

Benutzte ich zB
System.IO.StreamReader file1 =
new System.IO.StreamReader(@Datei, Encoding.UTF7);
werden + Zeilen durch \uBDO2 ersetzt.

usw usw

Ich habe alle Encodings die Visual Studio vorschlägt probiert, keines funktioniert so das am Ende wirklich alle "korrekt" in der Var line drinsteht.

Konvertiere ich nun die Datei mit Notepad++ vor dem Einlesen in UTF8, dann funktioniert es direkt.
Alles in line ist da, Umlaute und + Zeichen sind korrekt drin...

Ich habe mich blöd gesucht und keine Lösung gefunden, ich bin sicher es ist trivial - aber ich bekomms nicht hin...

Kann mir jemand sagen wie ich den Inhalt der Datei korrekt in einen string bekomme (inkl. Umlaute, und + (plus))?

Ich möchte die Datei nur wenn es nicht anders geht in der Software vorher konvertieren.
Am liebsten würde ich c# sagen: hey, das ist ne ANSI-datei, ließ diese bitte mit äüö und + usw ein und veränder da nix...
Nur im Notfall möchte ich das File einlesen und dann als UTF8 speichern... ich möchte das original ANSI-File also nicht verändern!

Ich wäre sehr dankbar wenn mir jemand mit einem Codebeispiel helfen könnte!

PS: Ich möchte außerdem prüfen ob das File in ANSI kodiert ist und nur dann möchte ich „was verändern“. Wenn das File nämlich UTF8 ist, funktioniert es ja ohne Probleme. Und manchmal ist das File das ich einlesen will utf8, manchmal ANSI... ich möchte das irgendwie prüfen, weiß aber auch hier nicht wie ich das prüfen kann...

Vielen Dank!
Joey

T
2.219 Beiträge seit 2008
vor 3 Jahren

Wenn die Datei in ANSI codiert ist, kannst du mit Encoding.GetEncoding(1252) das Encoding für Latin-1 (ISO 8859-1) bekommen.
Damit sollte sich die Datei eigentlich lesen lassen.
Die Datei solltest du eigentlich nicht manuell hin und her wursten.
Sobald du die nächste verarbeiten musst, bist du wieder am Anfang.
Hier solltest du die Dateien gleich mit dem korrekten Encoding einlesen, dann hat sich das Problem erledigt.

Ansonsten sollte dir klar sein, dass die Encoding Klasse nur statische Instanzen für die amhäufigsten verwendeten Encoding bietet.
Für spezifische Encodings, musst du immer über die entsprechende Code Page dir das Encoding holen.

Doku Encoding

Nachtrag:
C# ändert an den Zeichen nichts.
Das Problem ist, dass die Zeichen je nach Encoding über entsprechende Bytes dargestellt werden.
Und je nach Encoding kann ein einfacher Buchstabe unterschiedliche Byte Variationen zur Darstellung benötigen.

Du solltest dich in das Thema der Zeichenkodierung generell einlesen um zu verstehen, was dort warum passiert.
Dann dürfte dir auch klar werden, warum dein aktueller Ansatz scheitern muss.
Ein wildes Try-Error rumgewurste bringt dich selten zum Ziel wenn du die Gründe für diese Fehler nicht verstehst.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

4.931 Beiträge seit 2008
vor 3 Jahren

Das Standard-Encoding beim StreamReader ist UTF8, s. StreamReader(String) (unter "Hinweise").

Hast du auch Encoding.Default ausprobiert (denn dieses ist die aktuell auf dem System eingestellte aktive Codepage)?

Für einen MDI-TextEditor mit Encoding-Unterstützung habe ich die simple Methode aus How to Get a File's Encoding with C# benutzt, um das Encoding der Datei zu bestimmen (einzig UTF8 ohne Byte Order Mark (BOM) kann nicht von Encoding.Default unterschieden werden).

J
Joey2020 Themenstarter:in
10 Beiträge seit 2020
vor 3 Jahren

Danke für deine Antwort.

Ich habe es nun so versucht:

Encoding wind1252 = CodePagesEncodingProvider.Instance.GetEncoding(1252);
Encoding utf8 = Encoding.UTF8;

while ((line = file1.ReadLine()) != null)
{
   byte[] wind1252Bytes = wind1252.GetBytes(line);
   byte[] utf8Bytes = Encoding.Convert(wind1252, utf8, wind1252Bytes);
   string utf8String = Encoding.UTF8.GetString(utf8Bytes);
   Console.WriteLine(utf8String);
}

Natürlich ohne Erfolg - meine Umlaute (äöü) werden in der Console als ? angezeigt...

Ich weiß echt nicht was ich noch machen soll - ich habe die Doku gelesen und sämliche Codebeispiele versucht - ich bekomme es nicht hin.

Ich habe die Textdatei mal angefügt - es muss doch ohne viel Aufwand möglich sein die mit Umlauten usw einzulesen...

Hat jemand ein Codebeispiel für mich das funkltiniert?

Vielen Dank!

T
2.219 Beiträge seit 2008
vor 3 Jahren

Das was du da machst, ergibt nicht viel Sinn.
Du musst dem StreamReader schon das richtige Encoding geben, damit er die Zeichen auch korrekt einliest.
Erst wenn das stimmt, kannst du die richtigen Zeichen auch richtig umwandeln im Code.
Sonst hast du nämlich in deinem String einen Datensalat, mit dem du dann nichts mehr anfangen kannst!

Du solltest dich umbedingt in das Thema der Zeichenkodierung einlesen und nicht wilde Konvertierungen machen.
Lies doch bitte einmal die Doku und versuch zu verstehen was du da machst.

Hier mein Code in .NET Core, benötigt eine Zeile extra um die Datei sauber mit Codepage 1252 zu lesen.


private static void ReadFile()
{
        // Diese Zeile kann in .NET Framework entfallen!
	Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
	Encoding encoding = Encoding.GetEncoding(1252);

        using (StreamReader reader = new StreamReader("Encoding.txt", encoding))
	{
		while (!reader.EndOfStream)
			Console.WriteLine(reader.ReadLine());
	}
}

Ausgabe siehe Screenshot im Anhang.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

J
Joey2020 Themenstarter:in
10 Beiträge seit 2020
vor 3 Jahren

Ahhh, danke dir, das scheint zu gehen - ich teste es jetzt nochmal ausführlich.

1000 Dank!

Edit: Funktioniert! Nochmal vielen Dank, du hast mir echt geholfen!