Benutzer mit den meisten Antworten
Probleme mit Codepages

Frage
-
Hallo NG,
ich schreibe ein E-Mail Client und nutze dafür die Bibliothek von LumiSoft. Diese liefert mit bei einer HTML E-Mail den Html Code als mail.BodyHtmlText.
Wenn ich mir den Text der E-Mail im VS2012 Schnellansicht ansehe, dann steht dort z.B.,
<html xmlns:v="ur
......
<span style='font-size:9.0pt;font-family:"Verdana","sans-serif";mso-fareast-language:EN-US'>Metro stößt Real in der Türkei ab<span style='color:black'>soweit alles ok.
Wenn ich nun die E-Mail in der Datenbank als string speichere und mir das dem SQL-Server Managementstudio aus mit die Daten ansehe dann finde ich in dem Text:
Code in der Tabelle:
<!DOCTYPE html ......
.....
<span class="cs37BA8FCA">Metro stößt Real in der Türkei abWenn ich mir im VS 2012 das erste Byte anschaue:
mail.BodyHtmlText[0] = 0x60 <
Ich denke das Problem muss irgendwas mit dem Encoding zu tun haben. Aber wie finde ich heraus ob der Html Code encoded ist und wie convertiere ich die Daten damit der richtige Html Code erhalten bleibt. Leider passiert dieses nicht bei jeder E-Mail nur sehr wenige haben bei mir dieses Problem.
Danke im voraus für jeden Hinweis und Tipp.
Grüße Ingo
Antworten
-
Hallo NG,
ich habe die Ursache gefunden.
Grund war:
für Ü stand das Zeichen Ä im html code. Wenn ich das ü in ü umwandle, dann kommt alles richtig!!
Grüße Ingo
- Als Antwort markiert Ionut DumaModerator Dienstag, 5. August 2014 13:33
Alle Antworten
-
Hallo Ingo,
sehr wahrscheinlich ist der E-Mail Text gemisch codiert zum Teil in Entities codiert, einige Zeichen verbleiben in einem OEM-Zeichensatz - das "Zeichen" "Ÿ" => "ß" in Codepage 850/437 => 0xDF lässt das vermuten.
Sollte die verwendete Bibliothek die Zeichen so verunstalten, müsstest Du Dich an den Hersteller wenden.
Die SQL Server Zeichenkettendatentypen - NVARCHAR / NVARCHAR(MAX) - erwarten Unicode UTF-16.Da E-Mails unterschiedliche Codierungen haben können, ist der einzig sinnvolle Speichertype VARBINARY(MAX). Und in .NET solltest Du gar nicht erst in einen String konvertieren, sondern gleich ein Byte-Array verwenden.
Gruß Elmar- Als Antwort markiert IngoManthey Samstag, 12. Juli 2014 15:45
- Tag als Antwort aufgehoben IngoManthey Samstag, 12. Juli 2014 17:08
-
Hallo NG,
also wie schon zu Anfang beschrieben wird im VS2012 in der Schnellansicht alles korrekt angezeigt, wenn ich mir im Debug den aus der Bibliothek gelieferten string ansehe, dann kann ich folgendes lesen:
<span style='font-size:9.0pt;font-family:"Verdana","sans-serif";mso-fareast-language:EN-US'>Metro stößt Real in der Türkei ab<span style='color:black'>
ich habe nun die Spalte von string auf byte-Array umgestellt. Leider kommt immer noch die selbe Anzeige:
stößt Real in der Türkei
Der html string sieht dann wie folgt aus:
<span class="cs37BA8FCA">Metro stößt Real in der Türkei ab
Um den string in Byte Array zu convertieren habe ich folgende Methode
public static byte[] StringToByteArray(string str) { if (str == null) return null; UTF8Encoding enc = new UTF8Encoding(); return enc.GetBytes(str); }
um das Byte arry in einen string zu konvertieren:
public static string ByteArrayToString(byte[] arr) { if (arr == null || arr.Length == 0) return null; UTF8Encoding enc = new UTF8Encoding(); return enc.GetString(arr); }
Hat jemand eine Idee was ich falsch mache???
Danke für jeden Hinweis und Tipp.
Grüße Ingo
-
Hallo NG,
ich habe die Ursache gefunden.
Grund war:
für Ü stand das Zeichen Ä im html code. Wenn ich das ü in ü umwandle, dann kommt alles richtig!!
Grüße Ingo
- Als Antwort markiert Ionut DumaModerator Dienstag, 5. August 2014 13:33
-
Hallo Ingo,
Vorsicht.
Wenn Du Zeichen wie Umlautn Html Entitäten wandelst, so müsstest Du das für alle Zeichen außerhalb des ASCII-Zeichensatzes (> 128) machen. Dann wäre das Encoding nicht von Belang, da Zeichen (< 128) in OEM / ANSI und UTF gleich sind.
Aber sobald das nicht für alle geschieht - wie es auch beim Ausgangsbeispiel war - spielt es eine Rolle welches Encoding Du verwendest, ansonsten kommen bestenfalls "komische Zeichen" dabei heraus.
Gruß Elmar