Entwickler-Ecke
Basistechnologien - Probleme mit UTF-8 Code umwandeln in beide Richtungen
renekr - Do 08.04.10 10:23
Titel: Probleme mit UTF-8 Code umwandeln in beide Richtungen
Hi,
Ich habe ein Problem und finde leider keine Funktionierende Lösung.
Ich habe eine Firebird Datenbank wo ein UTF8 Text drin steht welcehn ich rausholen muss und normal anzeigen soll als Iso Code.
Beispiel :
é = é
è=è
groÃ? = groß
velký=velký
Das sind hauptsächlich Übersetzungen von Artikel in Tschechisch und Französisch.
ich habe folgende Funktion benutzt.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| public static string GenerateTextfromUTF8(string utf8Text) { System.Text.Encoding utf_8 = System.Text.Encoding.UTF8; System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding(); Byte[] BytesMessage = UTF8.GetBytes(utf8Text); string s_unicode2 = UTF8.GetString(BytesMessage, 0, BytesMessage.Length); return s_unicode2; } |
und noch
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| string sutf8 = textBox1.Text; Encoding iso = Encoding.GetEncoding("ISO-8859-1"); Encoding utf8 = Encoding.UTF8;
byte[] utfBytes = utf8.GetBytes(sutf8); byte[] isoBytes = Encoding.Convert(utf8, iso, utfBytes); string msg = iso.GetString(isoBytes);
textBox2.Text = msg; |
Ich bekomme immer den UTF8 Code Text als Ausgabe.
Kann mir ev. jemand weiter helfen ?
Vielen Dank
Kha - Do 08.04.10 11:36
Dir ist schon bewusst, dass .NET-Strings und -Controls bereits UTF8 verwenden? Da musst du überhaupt nichts konvertieren, deine Funktion verändert sowieso nichts.
renekr - Do 08.04.10 12:18
Hi,
das Problem ist ja das ich von einer Datenbank auslese welche UTF8 hat.
Anzeigen tu ich es nicht direkt in einem Control sondern verarbeite es weiter.(Lokalisierungs Text)
Später muss ich dann den normalen Text wieder in die Datenbank speichern als UTF8 string.
Es gibt so eine Art Admin Tool für Übersetzungen zu pflegen.
Danke
Kha - Do 08.04.10 17:51
Und dieser weiterverarbeitende Teil steckt auch in deinem Programm? Dann habe ich immer noch nicht verstanden, warum du es nicht bei UTF8 belässt.
renekr - Do 08.04.10 18:16
Hi,
also.
Ich habe eine Firebird DB 1.5 welche UTF8 Code gespeicherten Text aht.
Den muss ich auslesen und in einen SQL Server speichern als normalen Text .
Dann habe ich ein anderes Tool ( Webanwendungen über Webservice) wo ich den Text vom SQL Server auslese und ihn bearbeite,Übersetzen kann.
Den Text speicehre ich dann in SQL und in die Firebird aber FB muss als UTF8 sein.
Also benötige ich doch die Konvertierung UTF8 - Text und Text - UTF8.
Aber falls du eine andere Lösung hast bin ich gerne bereit.
Leider hab i es noch nicht gefudnen wie es geht :)
Danke.
Kha - Do 08.04.10 19:29
Ich zumindest verstehe unter "normalem Text" am ehesten UTF8 - wenn es um .NET geht, sowieso ;) . Die richtige Kodierung sollten alle ADO.NET-Provider selbst hinbekommen, da gibt es überhaupt nichts zu konvertieren.
renekr - Fr 09.04.10 07:55
Hi,
also ich stelle mal etws Code rein , ev. verwende ich auch nur die Falschen Componenten.
Als 1. ist es eine Konsolenanwendung die die Daten von der FB 1.5 holt ( UTF8 Format ) und dann diese Übergibt an einen Webservice ,welcher die dann in die SQL Server DB Speichert als ISO-8859-1, oder kann ich beim auslesen der Übersetzungen ( von der Website - Online shop ) die UTF8 Kodierung automatisch anzeigen in ISO-8859-1.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| StringBuilder sql = new StringBuilder(); sql.Append("SELECT * FROM UEBERSETZUNGEN "); if (!string.IsNullOrEmpty(where)) sql.Append(where);
OpenDbConnection(); OleDbCommand cmd = new OleDbCommand(sql.ToString(), DbConn); OleDbDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { string uebersetzung = reader["utf8text"].ToString(); } reader.Close(); |
Vielen Dank für deine Hilfe
Wie gesagt bin für alles offen was mir weiterhelfen könnte in der Richtung.
Ich muss es halt iergendwie hinbekommen das ich die Originalen UTF8 Zeichen in der Website richtig dargestellt bekomme.
Mir ist es quasi egal ob im SQL Server der String in ISO oder UTF8 steht solange er richtig auf der Website angezeigt wird.
Zudem gibt es wie erwähnt ein 2. Tool welches in Silverlight geschrieben wurde und sich diesen Text vom SQL Server rausholt und anzeigt zur Bearbeitung.
Dieser Bearbeitete Text (Übersetzung) soll dann wieder an einen Webservice übergeben werden der diesen String als UTF8 in die FB 1.5 rein schreiben muss mit einem Insert.
Danke
Kha - Fr 09.04.10 13:11
Ok, und wo ist nun die erste Stelle, an der eine falsche Kodierung auftaucht?
renekr - Fr 09.04.10 14:08
Hi,
hier.
C#-Quelltext
1:
| string uebersetzung = reader["utf8text"].ToString(); |
hier bekomme ich den UTF8 String zurück von der FB.
Wenn ich den als UTF8 in SQL speicehre wird er mir in der Webform als UTF8 falsch angezeigt.
Also muss i ihn hier eigentlich Encoden und später wenn i den ISO String Übersetzt habe wieder zurück ins UTF8 Format wandeln und in die FB speicheren !?
Danke
Kha - Fr 09.04.10 15:49
renekr hat folgendes geschrieben : |
hier. |
Das heißt, wenn dir die Variable im Debugger anschaust, steht dort schon falsch kodierter Text? Ansonsten wird es wohl erst weiter hinten passieren.
Aber wenn du mit Biegen und Brechen eine Codepage-Kodierung in einen UTF8-String quetschen willst: Das
Encoding.Convert in deinem zweiten Code musst du weglassen, dadurch wird er genauso zu einer No-Op wie dein erster.
renekr - Mo 12.04.10 10:13
Hi,
Also wenn ich mir die var anschaue im Debugger steht dort genau der UTF8 Text drin welcehr in der der FB Datenbank steht.
Was ja richtig ist aber ich benötige den ISO Text zum weiter speichern in MSSQL.
Zu deinem Vorschlag :
Meinst du so ?
Ich habe als Ausgang da einen UTF8 Text wie zb: éf
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| string sutf8 = textBox1.Text; Encoding iso = Encoding.GetEncoding("ISO-8859-1"); Encoding utf8 = Encoding.UTF8;
byte[] utfBytes = utf8.GetBytes(sutf8); string msg = iso.GetString(utfBytes);
textBox2.Text = msg; |
Zudem muss ich ja später iergendwie den ISO Text nach Übersetzung wieder in einen UTF8 Text Codieren damit ich ihn in der FB speichern kann,weil die FB Version ja die Unicode noch nicht handeln kann.
Danke
JüTho - Mo 12.04.10 17:17
Dein letzter Code scheint weitgehend korrekt zu sein. Nur den entscheidenden Schritt hast du auskommentiert.
Später geht es genauso umgekehrt. Wo ist das Problem?
Um es nochmals deutlich zu sagen (Sebastian hat es eigentlich schon klar gesagt): Innerhalb von .NET ist alles Unicode, da ist keine Konvertierung nötig. Wenn die FB-Datenbank Unicode liefert, ist an dieser Stelle ebenfalls keine Konvertierung nötig - weder beim Einlesen noch beim Speichern. Nur wenn an anderer Stelle etwas anderes verwendet wird, muss dafür (und nur dafür) konvertiert werden.
Gruß Jürgen
Kha - Mo 12.04.10 20:44
renekr hat folgendes geschrieben : |
Hi,
Also wenn ich mir die var anschaue im Debugger steht dort genau der UTF8 Text drin welcehr in der der FB Datenbank steht. |
Gut, was ist nun die Antwort auf
Kha hat folgendes geschrieben : |
Ok, und wo ist nun die erste Stelle, an der eine falsche Kodierung auftaucht? |
?
Um es noch einmal deutlich
er zu sagen, wie es mir gerade erst auffällt :idea: : Es ist einfach
nicht möglich, Latin1-kodierten Text in einen System.String zu bekommen, mein und die anderen Vorschläge sind einfach murks. Und das ist überhaupt kein Problem, weil eine Konvertierung nur an Grenzen wie dem Dateisystem/Streams/... nötig sein kann. Solange es um Strings im Speicher und .NET geht, ist es UTF8, basta ;) .
renekr - Mo 12.04.10 21:55
Hi Leute,
Also ich bin euch echt dankbar aber ich bin immer mehr verwirrt.
Der eine sagt ich muss die Stelle auskommentieren dann würde es gehn,du Jürgen sagst das ich genau die Stelle benötige.
Ich weiß echt nicht mehr weiter.
Ich habe es doch genau beschrieben wo mein Problem liegt !
Oder kann es sein das wir ev. aneinander vorbei reden ??
Ich benötige eine Lösung und komme an dieser Stelle leider nicht weiter und hoffe ihr könnt mir weiterhelfen !
Ev. mache ich ja auch was falsch , wie gesagt ich bin offen für alle Vorschläge !
Also nochmal in kurzform.
Ich habe eine FB mit UTB8 gespeichert.
Den muss ich auslesen mit einer Konsolenanwendung und den Text einem Webservice Übergeben der diesen in eine SQL DB speichert.
Dann habe ich eine Silverlight Anwendung welche den Text vom SQL in _ISO ausliest und vom Benutzer Übersetzt wird.
Danach wird dieser Übersetzte Text einem anderem Webservice Übergeben , welcher den ISO Text in genau die 1. FB DB wieder speichern muss, aber als UTF8.
Ich habe 2 Probleme.
1. das auslesen von UTF8 von FB und das insert in den SQL damit ich ihn später richtig ohne die UTF8 Kodierung angezeigt bekomme.
2. Den Insert von einem ISO String in die FB als UTF8.
Vielen Dank
Kha - Mo 12.04.10 23:56
renekr hat folgendes geschrieben : |
Der eine sagt ich muss die Stelle auskommentieren dann würde es gehn,du Jürgen sagst das ich genau die Stelle benötige. |
Ich habe doch schon selbst geschrieben, dass mein Vorschlag nicht funktionieren kann. Was du hier von Strings verlangst, _geht_ _einfach_ _nicht_. Und solange du nicht die (wie für gewöhnlich) alles entscheidende Frage beantwortest, ab wo es schief geht, kommen wir nicht mehr weiter.
JüTho hat folgendes geschrieben : |
Innerhalb von .NET ist alles Unicode, da ist keine Konvertierung nötig. Wenn die FB-Datenbank Unicode liefert, ist an dieser Stelle ebenfalls keine Konvertierung nötig - weder beim Einlesen noch beim Speichern. Nur wenn an anderer Stelle etwas anderes verwendet wird, muss dafür (und nur dafür) konvertiert werden. |
Kha hat folgendes geschrieben : |
Und das ist überhaupt kein Problem, weil eine Konvertierung nur an Grenzen wie dem Dateisystem/Streams/... nötig sein kann. |
Kha hat folgendes geschrieben : |
Ok, und wo ist nun die erste Stelle, an der eine falsche Kodierung auftaucht? |
renekr - Di 13.04.10 07:45
Hi Sebastian,
Also die erste Stelle wo es schief geht ist die hier.
Da hole ich den String aus der FB heraus und Übergebe Sie danach dem Webservice welcher Sie in die MS SQL speichert.
Nun wäre meine Frage:
Wenn ich die UTF8 kodierung beibehalten kann, dann kann ich die ja 1:1 von der FB in die MS SQL speichern als UTF8 !
Aber wie bekomme ich dann die Richtige Formatierung in der Website hin das diese mir kein UTF8 auf den Labels anzeigt ?
Das ist die 1. der 2 Entscheidenen Fragen .
Vielen Dank für eure Geduld.
renekr hat folgendes geschrieben : |
Hi,
hier.
C#-Quelltext 1:
| string uebersetzung = reader["utf8text"].ToString(); |
Danke |
In der Website tue ich die Strings in einer Datalist anzeigen:
Quelltext
1:
| Text='<%# DataBinder.Eval (Container.DataItem, "UTF8TextvonMSSQL") %>' |
renekr - Di 13.04.10 07:53
Hi
So sieht das Label dann im Web aus:
Wenn der UTF8 Text von der FB 1:1 in die MSSQL gespeichert wird.
siehe anhang
Kha - Di 13.04.10 21:32
renekr hat folgendes geschrieben : |
Also die erste Stelle wo es schief geht ist die hier.
Da hole ich den String aus der FB heraus und Übergebe Sie danach dem Webservice welcher Sie in die MS SQL speichert. |
Bitte was? Zu dieser Stelle hast du doch geschrieben:
renekr hat folgendes geschrieben : |
Also wenn ich mir die var anschaue im Debugger steht dort genau der UTF8 Text drin welcehr in der der FB Datenbank steht.
Was ja richtig ist |
Das interpretiere ich so, dass dort noch ein "é" auftaucht und kein Geschwurbsel. Ich will aber endlich wissen, ab welcher Stelle
genau das nicht mehr der Fall ist.
renekr hat folgendes geschrieben : |
Vielen Dank für eure Geduld. |
Sorry, aber die ist bei mir zumindest bald weg ;) .
/edit: Um das mit der Webseite klar zu stellen: ASP.NET verschickt standardmäßig UTF8-Webseiten, das sollte also kein Problem ergeben. Hast du das abgeändert, sollte es trotzdem die Ausgabe der <% %>-Blöcke entsprechend enkodieren.
renekr - Mi 14.04.10 07:50
Hi,
Also die erste Stelle wo ich per reader die Daten aus der Abfrage von der FB hole steht natürlich der Wert ( é) anstelle den é, weil das ja auch soo in der FB DB steht.
Das é muss ich aber als é in die SQL speichern, oder ich muss in der Website es so hinbekommen das er den é Text in dem Label als é anzeigt.
Kha hat folgendes geschrieben : |
Das interpretiere ich so, dass dort noch ein "é" auftaucht und kein Geschwurbsel. Ich will aber endlich wissen, ab welcher Stelle genau das nicht mehr der Fall ist.
|
Danke.
JüTho - Mi 14.04.10 09:31
renekr hat folgendes geschrieben : |
Also die erste Stelle wo ich per reader die Daten aus der Abfrage von der FB hole steht natürlich der Wert ( é) anstelle den é, weil das ja auch soo in der FB DB steht. |
Das kommt mir wie ein Widerspruch vor zu allem, was du bisher gesagt hast.
é ist die UTF8-Darstellung dort, wo Unicode gelesen und geschrieben wird. é o.a. ist die Darstellung eines Unicode-Zeichens dort, wo Unicode nicht bekannt ist.
Wenn du behauptest, dass die FB-DB UTF8 speichert, dann muss sie das é auch als é anzeigen. Die einzige Erklärung, die mir für eine solche Abweichung einfällt, ist, dass du mit IBExpert
Personal arbeitest, und die zeigt kein Unicode an. Oder du hast ein é mit IBExpert PE gespeichert; dann steht es auch in einer UTF8-Datenbank nicht korrekt drin.
Wir müssen also noch genauer nachfragen (aber Sebastian geht ja zurecht langsam die Geduld aus), und du solltest endlich ganz exakt sagen:
1. Wie ist ein bestimmtes Zeichen in die DB gekommen? (Befehlsfolge, Arbeitsablauf, Codierung)
2. Wie holst du einen String aus der DB?
3. Wo lässt du ihn dir anzeigen? Wie sieht dort ein bestimmtes Zeichen aus?
4. Wo und wie überträgst du den String weiter? Wie sieht ein bestimmtes Zeichen vorher und nachher aus?
Und so weiter...
Auf ein Neues! Jürgen
renekr - Mi 14.04.10 10:19
Hi,
also ich blick auch langsam nicht mehr durch.
1. Wie ist ein bestimmtes Zeichen in die DB gekommen? (Befehlsfolge, Arbeitsablauf, Codierung)
- Das wird mit einem Delphi Tool gemacht welches in UTF8 speichert.
2. Wie holst du einen String aus der DB?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| OpenDbConnection(); OleDbCommand cmd = new OleDbCommand(sql.ToString(), DbConn); OleDbDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { string sUEBERSETZUNG; sUEBERSETZUNG = reader["UEBERSETZUNG"].ToString() } |
Hier sieht er so aus é wie auch in der FB.
Diesen String muss ich dann in eine SQL speichern via Webservice ,wenn ich ihn nicht umwandle steht im SQL server das drin é.
3. Wo lässt du ihn dir anzeigen? Wie sieht dort ein bestimmtes Zeichen aus?
C#-Quelltext
1:
| Text='<%# DataBinder.Eval (Container.DataItem, "UTF8TextvonMSSQL") %>' |
4. Wo und wie überträgst du den String weiter? Wie sieht ein bestimmtes Zeichen vorher und nachher aus?
- Wenn ich nicht speziell Encode wird dieser é von der FB auch so in dieser Anzeige in der Website angezeigt weil er auch so in der MSSQL drin steht.
PS: Ich arbeite mit IB Expert Personal.
Im Plain Text Editor sieht das so aus:
é
Im Uni Code Editor so:
é
Das Feld ist ein Varchar(100)
Danke.
JüTho - Mi 14.04.10 11:33
Warum benutzt du OleDb und nicht den
Firebird-Provider? Wenn man diese Notlösung verwendet, handelt man sich nur Probleme ein. Das könnte sogar für dieses Zeichensatz-Problem gelten. Also steig zuerst auf den
Firebird ADO.NET Provider [
http://www.firebirdsql.org/index.php?op=files&id=netprovider] um; erst danach lohnt sich eine weitere Fehlersuche.
Zu Delphi: Welche Version, welches Tool? (Nur zur Sicherheit, denn unter Delphi ist UTF8 noch nicht lange möglich.)
Zu IBExpert: Nach deiner Beschreibung scheint das in der Tat korrekt zu sein.
Also zum schrittweisen Vorgehen musst du auf den Firebird-Provider umsteigen, dann kann der nächste Schritt geprüft werden.
Gruß Jürgen
renekr - Mi 14.04.10 11:58
Hi Jürgen,
Ok werde das mal anpassen.
Leider habe ich das Delphi Tool nicht in der Hand aber ich weiß das es noch mit Delphi 7 oder 5 erstellt wurde.
Danke
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!