Autor Beitrag
Zenu
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 13.06.14 10:45 
Erstmal ein freundliches Hallo, ich bin neu hier 8)

Hätte auch direkt mal eine Frage und hoffe mir kann jemand auf die Sprünge helfen, so richtig verstehe ich dieses Thema leider nicht.

Ich lese Text aus einer HTML Quelltextdatei aus und speichere ihn in einer Datenbank.
Funktioniert auch prima, leider habe ich Probleme mit Umlauteten / Sonderzeichen.

Folgendes steht im <meta tag> der Datei:

ausblenden Quelltext
1:
<meta content="text/html;charset=utf-8">					

Es scheint sich also um UTF-8 zu handeln.
Bisher konnte ich rausfinden dass c# immer UTF-16 verwendet und es sich bei beiden Zeichenätzen um Unicode handelt ?! (Ich verstehe nichtmal warum es dann überhaupt ein Problem gibt...)

Fakt ist jedenfalls ich extrahiere aus dem Quellcode Zeichenketten wie: "ß" gemeint ist ein "ß" oder "ö" gemeint ist ein "ö"
Das deckt sich hiermit: bueltge.de/wp-conten...tf-8_kodierungen.pdf
Manchmal hab ich aber auch nicht so "abgespacte" Zeichen sondern etwas mit % Zeichen z.B.: "%C3%B6" was ebenfalls einem "ö" entspricht und mich zuätzlich verwirrt!

Ich hätte gerne einen lesbaren Datenbestand, wie muss ich da vorgehen?
Mein bisheriger Ansatz ist sowas:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
        /// <summary>
        /// Konvertiert die Umlaute usw.
        /// </summary>
        /// <param name="text"></param>
        /// <returns></returns>
        private string convertText2Unicode(string text)
        {
            if (text.Contains("%3A"))
                text = text.Replace("%3A"":");

            if (text.Contains("%27"))
                text = text.Replace("%27""'");

            if (text.Contains("ß"))
                text = text.Replace("ß""ß");

            if (text.Contains("ä"))
                text = text.Replace("ä""ä");

            if (text.Contains("ö"))
                text = text.Replace("ö""ö");

            if (text.Contains("ü"))
                text = text.Replace("ü""ü");

            if (text.Contains("Ä"))
                text = text.Replace("Ä""Ä");

            if (text.Contains("Ö"))
                text = text.Replace("Ö""Ö");

            if (text.Contains("Ü"))
                text = text.Replace("Ü""Ü");

            // € Zeichen entfernen
            if (text.Contains("€"))
                text = text.Replace(" €""");

            return text;
        }

Aber ich denke wir sind uns darüber einig, dass das eher naja.. nicht so toll ist..
Ich lese immer wieder etwas über ByteArrays[] und der Encoding Klasse verstehe es aber nicht so richtig, auch weil ich nicht weiß was überhaupt das Ziel ist.
Ich muss von von utf-8 auf utf-16 kodieren oder?

Hier noch etwas, dass ich von Google habe:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
        private void btnStart_Click(object sender, EventArgs e)
        {
            string strUtf8 = "ä";
            MessageBox.Show(DecodeFromUtf8(strUtf8));
        }

        public static string DecodeFromUtf8(string utf8String)
        {
            // copy the string as UTF-8 bytes.
            byte[] utf8Bytes = new byte[utf8String.Length];
            for (int i = 0; i < utf8String.Length; ++i)
            {
                //Debug.Assert( 0 <= utf8String[i] && utf8String[i] <= 255, "the char must be in byte's range");
                utf8Bytes[i] = (byte)utf8String[i];
            }

            return Encoding.UTF8.GetString(utf8Bytes, 0, utf8Bytes.Length);
        }


Mit "ä" funktioniert das sogar, mit "Ü" leider nicht und mit "%C3%B6" auch nicht.

Ich bin total verwirrt :? kann bitte jemand Licht in Dunkle bringen? Vielen Dank
Gruß

Moderiert von user profile iconTh69: Code- durch C#-Tags ersetzt
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 13.06.14 11:01 
Zitat:
Es scheint sich also um UTF-8 zu handeln.


ich bin rot. Was ein Text behauptet und was er tatsächlich ist sind leider 2 verschiedenen Dinge.
Du kannst nur vermuten das es stimmt.

Zitat:
Bisher konnte ich rausfinden dass c# immer UTF-16 verwendet


Die Info wie deine Programmiersprache das macht ist eigentlich irrelevant ein reines interna das keinen Einfluss darauf hat was zu tun ist.
Wenn du eine utf-8 Quelle hast dann mußt du die Daten auch mit dem entsprechenden Encoding einlesen damit die Programmierumgebung in seine interne Darstellung umwandeln kann egal wie die nun konkret ist.

Wenn wir dir helfen sollen müssen wir wissen wo die Daten herkommen und wie du die einliest. Deine Konvertierungsmethoden helfen auf jedenfall nicht. Du versuchst eine falsch kodierte, weil vermutlich falsch eingelesenen Datenquelle, zu korrigieren. Das funktioniert a.) nur für 1 bestimmtest Encoding der Quelle und b.) wenn es sich tatsächlich um utf-8 handelt gibt es dort im Moment etwa 100000 standardisierte Zeichen (bei ca. 1millionen möglichen). Wieviele ifs möchtest du geren in deiner convertText2Unicode unterbringen?
Zenu Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 13.06.14 11:57 
Danke für die Antwort.

Zitat:
ich bin rot. Was ein Text behauptet und was er tatsächlich ist sind leider 2 verschiedenen Dinge.
Du kannst nur vermuten das es stimmt.

Hmmm ich verstehe was du meinst, diese <meta> Sachen sind ja glaube ich eigentlich nur als Info für Suchmaschinen gedacht.
Dann vermuten wir es einfach mal, die verwendeten Sonderzeichen lassen sich ja in der UTF8 Tabelle wiederfinden und ihre Übersetzung ergibt Sinn.
Bis auf die %x%y Geschichten und die befinden sich alle in <a href> links, wie mir gerade aufgefallen ist, hat also wohl etwas mit der "URL Fähigkeit" zu tun.

Zitat:
Die Info wie deine Programmiersprache das macht ist eigentlich irrelevant ein reines interna das keinen Einfluss darauf hat was zu tun ist.
Wenn du eine utf-8 Quelle hast dann mußt du die Daten auch mit dem entsprechenden Encoding einlesen damit die Programmierumgebung in seine interne Darstellung umwandeln kann egal wie die nun konkret ist.


Ahh! Okay! Ich muss .Net beim einlesen also mitteilen dass es sich um utf8 handelt, wie mache ich das denn?
Ich lese die Daten über HttpWebRequest ein und parse den Quelltext dann mit der HTMLAgilityPack Bibliothek, auf die ich gestoßen bin durch, hier der Code:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strUrl);
request.Proxy = null;
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0";

var response = request.GetResponse();
var responseStream = response.GetResponseStream();
var doc = new HtmlAgilityPack.HtmlDocument();
doc.Load(responseStream);

// Jetzt wird sich durch die Datei gehangelt und der gesuchte Text in einem normalen String gespeichert.


Zitat:
falsch kodierte, weil vermutlich falsch eingelesenen Datenquelle, zu korrigieren.


Der Text mit dem ich in meinem doc Objekt arbeite entspricht exakt dem Text, den ich erhalte wenn ich im Browser den Quelltext anzeigen lasse, da sind auch diese Sonderzeichen.
edit: Das nehme ich zurück, ist doch nicht so. HTML Quelltext: "ä", string: "ä"

Zitat:
Wieviele ifs möchtest du geren in deiner convertText2Unicode unterbringen?


Keine ;) Am liebsten.

Moderiert von user profile iconTh69: Code- durch C#-Tags ersetzt
BlackMatrix
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: Fr 13.06.14 12:26 
Welchen Zeichensatz liefert denn der Server im Response? Ich habe die Erfahrung gemacht, dass es besser ist, den Zeichensatz aus dem Response zu verwenden und diesen beim Einlesen des Streams mitzugeben.

Ich weiß nicht wie es sich beim Html-Agility Pack verhält, aber es wird sicher auch eine Überladung geben um den verwendeten Zeichensatz anzugeben. Ansonsten, wenn du nur den String des Html benötigst, lies den Stream mit einem StreamReader ein. Ich würde aber auch vorschlagen unter 4.5 den HttpClient zu verwenden, der unter 4.5 sowieso verwendet werden sollte, da er einige Bugs behebt ;)

Für diesen Beitrag haben gedankt: Zenu
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 13.06.14 12:30 
HtmlDocument.Load hat eine Überladung der man das Encoding mitgeben kann. Ich vermute mal das die ohne Angabe das Default Encoding des Systems nimmt. Bei dir wahrscheinlich also einfach CP-1252.

Für diesen Beitrag haben gedankt: Zenu
Zenu Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 13.06.14 12:38 
Ich danke euch Leute, es funktioniert!

Der Server gibt UTF-8 zurück und das geb ich jetzt wie vorgeschlagen in der Überladung mit! *Thumbs up*

Ich nehme an das Problem mit %x%y in den Links ist damit noch nicht gelöst, das kann ich grad schlecht testen, ich muss jetzt auch los, deswegen markiere ich den Thread noch nicht als gelöst aber vielen Dank schonmal an euch :)

edit: Das mit dem HTTPClient werde ich auch mal testen.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 13.06.14 12:40 
Das klingt nach Url Encoding. In der System.Web.HttpUtility Klasse findest du alles zum codieren/decodieren.

Für diesen Beitrag haben gedankt: Zenu
Zenu Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 13.06.14 14:35 
Funktioniert jetzt alles wie ich es mir gewünscht habe, vielen Dank nochmal und Gruß! :dance2: