Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Problem bei Codierung zu UTF8
MaikelF
myCSharp.de - Member



Dabei seit:
Beiträge: 2

Themenstarter:

Problem bei Codierung zu UTF8

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.306

beantworten | zitieren | melden

Zitat von MaikelF
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().
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.587

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Th69 am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.306

beantworten | zitieren | melden

Wenn man mit dem falschen Encoding liest spielt es keine Rolle, wie .NET intern den String repräsentiert.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.587

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 9.999

beantworten | zitieren | melden

In 90% der Fälle ist auch System.Text.Encoding.UTF8 die falsche Encoding.
System.Text.Encoding.Default passt meist viel besser.
private Nachricht | Beiträge des Benutzers
Paratrooper
myCSharp.de - Member

Avatar #avatar-1887.gif


Dabei seit:
Beiträge: 22
Herkunft: LA

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.306

beantworten | zitieren | melden

Zitat von Paratrooper
=> Flutter haut mir ne Fehlermeldung raus.
Und das ist nun ein Quiz und wir sollen die Fehlermeldung raten? :-)
Gibts nen Tipp? Oder Multiple Choice?
private Nachricht | Beiträge des Benutzers
Palladin007
myCSharp.de - Experte

Avatar #avatar-4140.png


Dabei seit:
Beiträge: 1.878
Herkunft: Düsseldorf

beantworten | zitieren | melden

Zitat von FZelle
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
private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3.170
Herkunft: Trier -> München

beantworten | zitieren | melden

Hallo zusammen,

einzig entscheidend ist was Abt bereits geschrieben hat:
Zitat von Abt
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
private Nachricht | Beiträge des Benutzers
MaikelF
myCSharp.de - Member



Dabei seit:
Beiträge: 2

Themenstarter:

beantworten | zitieren | melden

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
Attachments
private Nachricht | Beiträge des Benutzers
dannoe
myCSharp.de - Member



Dabei seit:
Beiträge: 235

beantworten | zitieren | melden

Zitat
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)
private Nachricht | Beiträge des Benutzers
T-Virus
myCSharp.de - Experte



Dabei seit:
Beiträge: 2.087
Herkunft: Nordhausen, Nörten-Hardenberg

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers