Umlaute beim Speichern



  • Hallo,

    ich erzeuge eine html Datei - siehe unten. Alle Zeilen werden zunächst in ein Memo geschrieben und dann gespeichert. Mit dem Editor sind die Umlaute sichtbar. Beim Anzeigen der Seite werden sie als Sonderzeichen dargestellt. <meta charset='utf-8'> ist dabei.
    Kopiere ich aber den Inhalt des Memofeldes in den Atom Editor und speichere es dort, wird es korrekt angezeigt.

    Hat jemand einen Tipp für mich ? Vielen Dank !

    	FILE *stream;
    	String sValue;
    	char msg[1000];
    
    	stream = _tfopen(sFileHTML.w_str(), _T ("w"));
    
    	for (int i = 0;  i < Memo12->Lines->Count; i++)
    	{
    		sValue = Memo12->Lines->Strings[i];
    		for (int j = 1; j < sValue.Length() + 1; j++)
    		{
    			fprintf(stream, "%s", sValue.SubString(j, 1).c_str());
    		}
    		fprintf(stream, "%s\n", "");
    	}
    	fclose(stream);
    
    


  • Sicher das die Strings im memo utf8 sind?
    Und falls die Strings utf8 sind, bist du dir sicher dass c_str den string nicht in eine lokale (ANSI) Codepage umwandelt (wenn das ganze unter Windows läuft)?

    Das sollte man sich gut in einem debugger anschauen können (in dem man sich die byte folge anschaut welche von c_str zurück geliefert wird).

    z.b. ein kleines ä wird in utf8 als zwei bytes kodiert. Hier die hexadezimale Darstellung:
    c3 a4



  • String ist ein typedef auf UnicodeString, und der benutzt das UTF16 Encoding. Es gibt einen UTF8String Datentyp, der verschiedene Konstruktorüberladungen hat, mit denen dann einfache Zuweisungen die Konvertierung zwischen UTF16 und UTF8 machen.
    Sehe ich das richtig, dass du in Zeile 12 für jedes Zeichen einen Substring erstellst, und den per fprintf wegschreibst? Warum schreibst du nicht den ganzen String en-bloc, für einen 200 Zeichen langen String 200 Substrings mit einem Zeichen Länge zu erzeugen ist der Performance-Killer schlechthin. Angesehen davon, dass der Format Specifier %s ohnehin nicht auf wchar_t passt.
    Da du C++ und nicht C machst rate ich dir zu std::wofstream. Oder mit den VCL Bordmitteln: Memo12->Lines->SaveToFile(...)


Log in to reply