Laden...

Problem bei Codierung zu UTF8

Erstellt von MaikelF vor einem Jahr Letzter Beitrag vor einem Jahr 544 Views
M
MaikelF Themenstarter:in
2 Beiträge seit 2022
vor einem Jahr
Problem bei Codierung zu UTF8

Hallo zusammen, ich arbeite im Bereich Data Warehouse für eine Uni Klinik und entwickle ETL Strecken mit Visual Studio. Bei meinem derzeitigen Projekt möchte ich RTF formatierte Befundtexte aus einer Oracle Datenbank heraus exportieren und in RTF Dateien schreiben, um anschließend mittels C# die RTF Formatierung zu entfernen, so dass TXT Dateien übrig bleiben. Das Erstellen der RTF Dateien erfolgt direkt mittels Task in Visual Studio innerhalb der Datenstrecke. Das klappt auch. Anschließend werden die RTF Dateien eingelesen und cleane TXT Dateien daraus erstellt, mittels folgendem Code


RichTextBox rtb = new RichTextBox();
rtb.Rtf = s;
System.IO.File.WriteAllText(Path_Target + "RTF_TO_TXT/" + NewFilename, rtb.Text, System.Text.Encoding.UTF8);

Bei der aktuellen Tabelle funktioniert das aber nicht, es gibt einen Laufzeitfehler. Das liegt wohl daran, dass die zuvor erstellten RTF Dateien keine UTF8 Codierung aufweisen. Wenn ich die Datei mittels Notepad++ öffne, sehe ich das keine Codierung angegeben ist. Ändere ich diese manuell auf UTF8, kann mein Code Schnipsel die Datei verarbeiten.
Jetzt war mein Ansatz die Codierung Datei zu ändern mittels:


System.IO.File.WriteAllText(Path_Target + "RTF_TO_TXT/" + NewFilename, rtb.Text, System.Text.Encoding.UTF8);

Allerdings klappt das nicht, die Datei beinhaltet anschließend nur noch wilde Zeichen. Hat jemand eine Idee? Viele Grüße und danke im Voraus

16.806 Beiträge seit 2008
vor einem Jahr

Datei mittels Notepad++ öffne, sehe ich das keine Codierung angegeben ist.

Eine Kodierung kann nicht zu 100% erkannt, sondern nur erraten werden. Daher ist eine Angabe, wie sie N++ macht, nicht 100% korrekt.
Manchmal ist der Encoding Header gesetzt, manchmal nicht. Und wenn er gesetzt ist heisst das noch lange nicht, dass auch der Inhalt dieses Encoding hat.

Du musst den Inhalt einer Datei immer mit dem Encoding lesen, mit der die Datei geschrieben wurde.
Danach kannst Du sie in ein solches Encoding überführen, wie Du es brauchst.

Deinem Text nach liest Du die Datei nicht mit dem korrekten Encoding.
Encodings ändert man zB mit Encoding.Convert.

PS: es gibt in .NET den System.IO Namespace und dort die Klasse Path.
Man puzzelt Pfade nicht von Hand zusammen, sondern verwendet Path.Combine().

4.931 Beiträge seit 2008
vor einem Jahr

Welchen Laufzeitfehler erhältst du denn?

Beim Schreiben eines Textes in einer Datei in einem bestimmten Encoding ist es egal, welches Encoding die zuvor gelesene Datei hat (.NET speichert intern alle Strings einheitlich als UTF16 und konvertiert dann beim Schreiben passend in das übergebene Encoding, z.B. UTF8, s.a. Verwendung von Zeichencodierungsklassen in .NET).

PS: Du hast zweimal dieselbe Codezeile gepostet.

16.806 Beiträge seit 2008
vor einem Jahr

Wenn man mit dem falschen Encoding liest spielt es keine Rolle, wie .NET intern den String repräsentiert.

4.931 Beiträge seit 2008
vor einem Jahr

Ich habe deinen Beitrag nur ergänzen wollen.
Der Fehler wird wohl bei der Zuweisung von rtb.Rtf = s passieren und nicht beim Schreiben der Datei.

F
10.010 Beiträge seit 2004
vor einem Jahr

In 90% der Fälle ist auch System.Text.Encoding.UTF8 die falsche Encoding.
System.Text.Encoding.Default passt meist viel besser.

22 Beiträge seit 2004
vor einem Jahr

Hatte mal ein ähnliches Problem.

Wollte den Inhalt einer RichTextBox speichern und in Flutter öffnen.


File.WriteAllText(saveFileDialog.FileName, this.richTextBoxCSV.Text, Encoding.UTF8);

=> Flutter haut mir ne Fehlermeldung raus.


string output =  this.richTextBoxCSV.Text.ToString();
File.WriteAllText(saveFileDialog.FileName, output, Encoding.UTF8);

Einlesen der Textdatei funktioniert.

Komisch...

16.806 Beiträge seit 2008
vor einem Jahr

=> Flutter haut mir ne Fehlermeldung raus.

Und das ist nun ein Quiz und wir sollen die Fehlermeldung raten? 🙂
Gibts nen Tipp? Oder Multiple Choice?

2.078 Beiträge seit 2012
vor einem Jahr

System.Text.Encoding.Default passt meist viel besser.

... was seit .NET Core auch UTF8 ist:
https://docs.microsoft.com/en-us/dotnet/api/system.text.encoding.default?view=net-6.0#the-default-property-on-net-core

3.170 Beiträge seit 2006
vor einem Jahr

Hallo zusammen,

einzig entscheidend ist was Abt bereits geschrieben hat:

Du musst den Inhalt einer Datei immer mit dem Encoding lesen, mit der die Datei geschrieben wurde.
Danach kannst Du sie in ein solches Encoding überführen, wie Du es brauchst.

Wenn beim Lesen das Encoding nicht bekannt ist, kann man versuchen, die Datei nach bestimmten Kriterien (die jetzt den Rahmen sprengen würden) zu untersuchen, um so das Encoding automatisch zu ermitteln, wie es elaborierte Texteditoren tun - aber selbst die erkennen es nicht zu 100% richtig.

Gruß, MarsSetin

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

M
MaikelF Themenstarter:in
2 Beiträge seit 2022
vor einem Jahr

Hallo, vielen Dank für die Antworten damals. Leider komme ich erst jetzt wieder dazu an dem Projekt weiterzuarbeiten.
Es ist so, dass die RTF Dateien in Visual Studio innerhalb einer ETL Strecke generiert werden mittels des Skript im Anhang. Die Daten werden dabei aus einer Zeile einer Tabelle ausgelesen und dann jeweils in eine Datei geschrieben. An dieser Stelle habe ich scheinbar keinen Einfluss auf die Kodierung. Ich habe mal mit der Person gesprochen, die damals die Daten in die Tabelle geladen hat. Er sagt, die Daten wurden damals im Format Ansi 1252 codiert und abgespeichert.

Wie müsste der Code denn aussehen, wenn ich die Dateien jeweils umcodieren möchte von Ansi1253 zu UTF8?
Bei System.Text.Encoding. stehen mir ja nur ein paar Typen zur Verfügung wie UTF8, 16, Unicode etc.

// Einlesen
string fileContent = File.ReadAllText(@Path_Source + "RTF.rtf", System.Text.Encoding.ASCII);

// In Datei schreiben
File.WriteAllText(@Path_Target + "RTF.RTF", fileContent, System.Text.Encoding.UTF8);

Viele Grüße

Maikel

D
261 Beiträge seit 2015
vor einem Jahr

Bei System.Text.Encoding. stehen mir ja nur ein paar Typen zur Verfügung wie UTF8, 16, Unicode etc.

Da gibt es noch viel mehr und genau dafür gibt es die Dokumentation:

Encoding Klasse (System.Text)

T
2.219 Beiträge seit 2008
vor einem Jahr

Zusätzlich zu den Vordefinierten Encodings gibt es auch die Möglichkeit mit GetEncoding eine passende Codierung zu erhalten.
Aber auch dies steht in der Doku.

Link:
Encoding.GetEncoding Methode (System.Text)

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.