Text dekodieren



  • Hallo,

    ß => ß

    Wie kann ich sowas dekodieren?

    Danke,
    Newb

    P.S.: Das stammt aus einem xml File, in dem
    <?xml version="1.0" encoding="UTF-8" ?>
    steht aber Utf-8 kann das nicht sein, denn dafür habe ich schon ne Funktion:

    CString utf8_decode(CString utf8text)
    	{
    		CString ansitext;
    
    		char m[500];
    		WCHAR w[500];
    
    		strcpy(m, utf8text);
    		MultiByteToWideChar(CP_UTF8, 0, m, -1, w, sizeof(w) / sizeof(WCHAR));
    		WideCharToMultiByte(CP_ACP, 0, w, -1, m, sizeof(m), 0, 0);
    
    		ansitext = m;
    
    		return ansitext;
    	}
    


  • Misst, der Browser interpretiert das Zeichen schon von allein

    UND#223; => ß



  • Wenn ich wenigstens wüsste, wie das heißt, womit der Text kodiert ist.

    Es ist kein utf-8 aber was ist es?



  • Okay, es handelt sich also um unicode ... wie kriege ich das jetzt in "ü"



  • vielleicht hilft dir DAS HIER ?

    mfg,
    julian



  • Okay, die Erleuchtung kam spät aber aber sie kam.
    Ich habe jetzt selbst eine Funktion geschrieben:

    CString CSherlockDlg::html_decode(CString encodedStr)
    	{
    		// Variablen
    		CString s1, s2, str_code, replace_str,  replace_old;
    		int		p1, p2, int_code;
    
    		// Die Event-Schleife
    		s1 = "&#";	s2 = ";";
    		p1 = 0;		p2 = 0;
    
    		while(true)
    		{
    			p1 = encodedStr.Find(s1, p2);
    			p2 = encodedStr.Find(s2, p1+1);
    
    			if(p1==-1 || p2==-1) 
    			break;
    
    			if(p2-p1<6)
    			{
    				// Hier wird das Zeichen als CString gespeichert
    				str_code	= encodedStr.Mid(p1+s1.GetLength(),p2-p1-s1.GetLength());
    				p2			= p2+1;
    
    				// Hier wird das Zeichen als int gespeichert
    				int_code	= atoi( (LPCTSTR) str_code );
    
    				// Konvertierung von int-Zeichen nach CString
    				replace_str = (CString) int_code;
    
    				// Die Zeichen, die ersetzt werden sollen
    				replace_old = s1+str_code+s2;
    
    				// Hier wird das Zeichen ersetzt
    				encodedStr.Replace(replace_old,replace_str);
    			}
    		}
    
    		return encodedStr;
    	}
    

    Bye bye,
    Michael

    P.S.:
    Bei Fragen zur Funktion: Hecker.Michae@gmx.de">Hecker.Michae@gmx.de





  • Ich hatte noch einen kleinen Bug drin.
    Hier jetzt die fertige Funktion:

    CString html_decode(CString encodedStr)
    	{
    		// Variablen
    		CString s1, s2, str_code, replace_str,  replace_old;
    		int		p1, p2, int_code;
    
    		// Die Event-Schleife
    		s1 = "&#";	s2 = ";";
    		p1 = 0;		p2 = 0;
    
    		while(true)
    		{
    			p1 = encodedStr.Find(s1, 0);
    			p2 = encodedStr.Find(s2, p1);
    
    			if(p1==-1 || p2==-1) 
    			break;
    
    			if(p2-p1<6)
    			{
    				// Hier wird das Zeichen als CString gespeichert
    				str_code	= encodedStr.Mid(p1+s1.GetLength(),p2-p1-s1.GetLength());
    
    				// Hier wird das Zeichen als int gespeichert
    				int_code	= atoi( (LPCTSTR) str_code );
    
    				// Konvertierung von int-Zeichen nach CString
    				replace_str = (CString) int_code;
    
    				// Die Zeichen, die ersetzt werden sollen
    				replace_old = s1+str_code+s2;
    
    				// Hier wird das Zeichen ersetzt
    				encodedStr.Replace(replace_old,replace_str);
    			}
    		}
    
    		return encodedStr;
    	}
    

    Liebe Grüße,
    Michael



  • Hab es mal kurz für STL Benutzer umgeschrieben ^^ Ist ein wenig kürzer ... wenn wahrscheinlich auch ein wenig ineffizient ... und ist ungetestet ... nur reingetippt ... sorry

    void html_decode(std::string& string)
    {
    	std::string::size_type	pos_begin		= std::string::npos;
    	std::string::size_type	pos_end			= std::string::npos;
    	std::string				string_letter;
    	std::string				string_replace;
    
    	while (((pos_begin = string.find_first_of("&#", 0)) != std::string::npos) && ((pos_end = string.find_first_of(';', pos_begin)) != std::string::npos))
    	{
    		if ((pos_end - pos_begin) < 6)
    		{
    			string_letter	= string.substr(pos_begin + 2, pos_end);
    			string_replace	= (char)atoi(string_letter.c_str());
    			string.replace(pos_begin, pos_end - pos_begin, string_replace);
    		}
    	}
    }
    

    Aja so wird man auch keine Fehlermeldung erhalten von wegen condition constant ...


Anmelden zum Antworten