Laden...

Encoding eines Strings ändern

Erstellt von S.R. vor 14 Jahren Letzter Beitrag vor 14 Jahren 3.901 Views
S
S.R. Themenstarter:in
221 Beiträge seit 2007
vor 14 Jahren
Encoding eines Strings ändern

Hallo,

ich habe ein konkretes Problem beim Encoding und komme leider nicht weiter und bin da auf eure Hinweise angewiesen...

Im Code wird eine Textdatei eingelesen:

data = File.ReadAllText(inputFileName);

Wenn ich mir dann "data" anschaue, dann werden die Sonderzeichen falsch dargestellt. Wenn ich dann allerdings

data = File.ReadAllText(inputFileName, Encoding.Default);

nutze, dann werden auch die Sonderzeichen richtig dargestellt. Das Default hat den Wert ISO-8859-1 (CodePage 1252).

Jetzt habe ich allerdings das Problem, dass ich die File.Read nicht mit Encoding nutzen kann, da dieser Teil in einer externen Komponente liegt und ich nur den fertig eingelesenen data-String bekomme. Ich bastel gerade an einer Convertierungsfunktion: data = ConvertToUTF8(data);

Laut MSDN kann ReadAllText ohne Encoding nur UTF-8 und UTF-16 erkennen. Somit müsste ja der data-String den ich bekomme auch UTF-8 sein, oder? Aber der ist ja falsch - also müsste ich von UTF-8 nach ISO oder wie?

Ich blick da net durch, wo wie was welche Codierung hat 😃 Am Ende möchte ich "nur" einen korrekten UTF-8-string, d.h. wo auch alle Sonderzeichen korrekt drin stehen.

Bin für jeden Tipp dankbar! Dankend

Stefan

3.430 Beiträge seit 2007
vor 14 Jahren

Hallo S.R.,

die einfachste Lösung des Problems ist wohl wenn du den Ersteller von der Bibliothek sagst dass er das mit dem Encoding hinzufügen soll 😃

Weil so ist es erstens ein ziemlich große Arbeit das zu übersetzen und wahrscheinlich sind durch das falsche Encoding schon irgendwelche Informationen verloren gegangen bis der String bei dir ankommt.

Deshalb ist es "fast" aussichtslos den String selbst umzuwandeln.

Gruss
Michael

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo S.R.,

C# Strings sind immer als 16Bit-Unicode repräsentiert. Wie michlG sagt, ist es da eigentlich schon zu spät. Das Encoding muss immer bei der jeweiligen Ein- oder Ausgabeoperation verwendet werden.

Du kannst natürlich versuchen, den String mit Encoding.GetBytes unter Angabe des fälschlichen verwendeten Encodings wieder zurück in die ursprüngliche Bytefolge umzuwandeln und dann die Bytefolge mit Encoding.GetString unter Angabe des tatsächlichen Encodings der Eingabedaten in den korrekten String umzuwandeln.

Das richtige Encoding kennst du ja: Encoding.Default. Beim falschen Encoding halte ich UTF-8, UTF-16, GetEncoding (850) oder GetEncoding (437) für am wahrscheinlichsten.

herbivore

308 Beiträge seit 2005
vor 14 Jahren

Hallo S.R.,

solange die Umlaute in Deiner Textdatei unterschiedlich representiert werden (sprich: nicht alle habe z.B. den selben Wert '?') ist es auch möglich die Datei sauber zu lesen.

TextRead (und auch Notepad) erkennt am sogenannten BOM (Byte Order Mark) ob es sich um Unicode (und um welche Variante) es sich handelt. Wenn die BOM fehlt können auch diese routinen keine erfolgreiche Erkennung vornehmen. Es kann sich also durchaus um UTF-7 o.ä. handeln.

Wenn Du den Aufruf nich anpassen kannst, kannst Du ggf. die Textdatei ja vor dem Aufruf der Bibliothek konvertieren?

Einfach mit verschiednenen Eingangs-Encodings experimentieren (DOS? UTF7?).

Mit etwas Glück erkennt dieses Tool auch das original Encoding:
Detect Encoding

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo cadi,

das korrekte Encoding ist ja bekannt. Es ist Encoding.Default. Insofern gibt es auch kein BOM. Das Problem ist doch, dass die zum Einlesen verwendete Bibliothek ein falsches Encoding verwendet und es auch keine Möglichkeit gibt, das richtige Encoding anzugeben. Insofern gehen deine Hinweise leider etwas an der Sache vorbei.

herbivore

S
S.R. Themenstarter:in
221 Beiträge seit 2007
vor 14 Jahren

Hi,

vielen Dank für eure Tipps - Stand der aktuellen Analyse ist, dass durch das Einlesen mit falschem Encoding Informationen verlohren gehen. Der Hersteller der Komponente wird jetzt seine DLL anpassen, so dass hier auch per Parameter das entsprechende Encoding übergeben werden kann.
Alles andere ist denk ich auch sch*** - weil meiner Überzeugung nach, sollte man das Problem immer an der Wurzel angehen und net durch Workarounds irgendwas ans Laufen kriegen 😃

Dankend!!!

Stefan

308 Beiträge seit 2005
vor 14 Jahren

das korrekte Encoding ist ja bekannt. Es ist Encoding.Default. Insofern gibt es auch kein BOM. Das Problem ist doch, dass die zum Einlesen verwendete Bibliothek ein falsches Encoding verwendet und es auch keine Möglichkeit gibt, das richtige Encoding anzugeben. Insofern gehen deine Hinweise leider etwas an der Sache vorbei.

ok, dann habe ich es verdreht verstanden;)

Aber dann sollte es doch relativ einfach sein die Datei zu konvertieren?
Daten mit Encoding.Default lesen und als Encoding.UTF8 schreiben?
Dann liest die bibliothek sie auch korrekt?
Oder habe ich es immer noch nicht richtig verstanden?

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo cadi,

grundsätzlich könnte man auch die Datei in das Encoding bringen, das die Bibliothek mag. Aber die bessere Lösung ist, wenn die Bibliothek eine Möglichkeit bietet, das passende Encoding anzugeben. Und dieser Weg wird ja jetzt beschritten.

herbivore