Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

07.10.2015, 15:25

Der Debugger hilft da sicher weiter ;)
Wahrscheinlich liegt es an der Ausgabe in die Konsole, welche eine andere Codepage verwendet.
Du kannst ja dein Projekt auf Unicode umstellen und entsprechend wstring, wcout etc benutzen.

12

07.10.2015, 16:11

@birdfreeyahoo: Statt der Umlaute werden andere Zeichen angezeigt. Beim ä Z.b. ein großes A mit Welle drüber und dahinter ein viereck. Ich gebe die strings in einen stringstream, welcher dann über sf::Text (von SFML) angezeigt wird.

@Sacaldur: Ausgabe wie oben beschrieben, aber da dürfte es kein Problem geben. Wenn ich den Text nämlich in den Code schreib, funktioniert das ganze mit den Umlauten.

Strings direkt in den Stringstream

C-/C++-Quelltext

1
stream << "Ein Text mit Umlauten: Äüööäöääüöüöä" << endl;


Wenn ich die Strings aus dem String-Loader hole gehts nicht mehr.

Strings aus dem Stringloader

C-/C++-Quelltext

1
stream << g_pStringContainer->m_Strings[STRING_BLABLA] << endl;


Wo seh ich denn, welche Kodierung in der XML verwendet wird? Im Eigenschaftsfenster wird Unicode(UTF-8 ) angezeigt.

@Roflo: Wie gesagt, die Ausgabe kann es eigentlich nicht sein. Wie genau meinst du das mit wstring?

13

07.10.2015, 16:46

@birdfreeyahoo: Statt der Umlaute werden andere Zeichen angezeigt. Beim ä Z.b. ein großes A mit Welle drüber und dahinter ein viereck. Ich gebe die strings in einen stringstream, welcher dann über sf::Text (von SFML) angezeigt wird.

Dann ist deine XML-Datei wohl als UTF-8 kodiert und deine interne Kodierung ist ISO-8859-1/CP-1252.

sf::String akzeptiert eine std::locale im Konstruktor. Die musst du dann wohl richtig angeben...
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

14

07.10.2015, 21:21

Ich benutz aber gar nicht sf::String, sondern std::string. Oder gibts da auch sowas?

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

15

07.10.2015, 22:24

Doch du benutzt sf::String weil das im Konstruktor von sf::Text verlangt ist, eine Konvertierung findet statt. sf::String benutzt standardmäßig eine UTF-32-Kodierung, kann also jedes Zeichen speichern und unterstützt automatische Konversionen. Also ich weiß nicht was deine Quelle ist, aber in sf::String sollte der Fehler nicht liegen.

16

08.10.2015, 12:57

Ok, ich konnte das Problem jetzt genauer lokalisieren. Ich hab mir die strings mal jeweils nach einer Operation ausgeben lassen und das hat gezeigt, dass die strings korrekt aus der xml gelesen und auch korrekt im String-Container gespeichert werden, also mit Umlauten.
Wenn ich jetzt aber den string in einen std::stringstream eingelesen habe und diesen ausgegeben, trat das Problem mit den Umlauten auf. Lese ich den string aber direkt ein, funktioniert es ohne Probleme.
Nochmal konkret:

  • m_pLog->WriteToLog(g_pStringContainer->m_Strings[50]);... -> funktioniert
  • stream << "ÄÖÜÖÖÜöüäöö" << endl; m_pLog->WriteToLog(stream); ...-> funktioniert
  • stream << g_pStringContainer->m_Strings[50] << endl; m_pLog->WriteToLog(stream); ... ->funktioniert nicht
Das heißt doch, dass das Problem an der Stelle liegt, wo der string in den stringstream eingelesen wird.

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

17

08.10.2015, 23:43

Ich glaub ich habe da so ein bisschen was gefunden, da ich in Sachen Kodierung und Zeichensätze noch sehr frisch dran bin, korrigiert mich bitte, wenn ich falsch liege:


Der Unterschied ist doch, dass verschiedene Datentypen dem Stream übergeben werden.
Bei dem funktionierenden Beispiel ist es ein const char [], bei dem nicht-funktionierenden ein string.
Ein char sollte bei dir mit der Latin-1 Codepage kodiert sein (1 Byte), also sollte auch problemlos die Umlaute darstellen was ja auch funktioniert.

Ein string speichert ja wie gesagt die Bytes die du reingibst unabhängig von der Kodierung. Ich nehme nun an, dass du die Umlaute UTF-8 kodiert in den string schreibst.
Da ein Umlaut in UTF-8 2 Bytes zur Darstellung braucht, werden für die Umlaute auch 2 Bytes gespeichert.
Deine Ausgabe hat von der Kodierung keine Ahnung, sie ist aus dem String ja auch nicht ersichtlich, es ist Interpretationssache was man damit jetzt anstellt.
Die Ausgabe liest also Byte für Byte, in der Annahme jeder würde einem Zeichen entsprechen (ein Iterator über dem string würde auch nur Byte für Byte, statt char für char gehen, aus bereits erwähnten Gründen).
Somit erhältst du statt einem Umlaut 2 Zeichen, welche nicht viel mit diesem zu tun haben.

Ich habe das schon überprüft, die Ausgabe die du beschrieben hast dürfte passen. Die 2 Bytes die das Ä in UTF-8 braucht, habe ich in der Latin-1 Tabelle nachgeschlagen und tatsächlich ist das erste ein A mit Welle und das zweite ein nicht belegter Platz, da Vierecke sonst nicht vorkommen, würde auch das passen.

Was kann man dagegen tun? Ich weiß nicht inwiefern du deinem Log sagen kannst, welche Kodierung er zu erwarten hat. Oder du wandelst das gelesene in einen ISO 8859-1 konformen String um.
Wie das genau funktioniert weiß ich nicht, aber eine Umwandlung in einen 32-bit Unicode string, mit anschließendem Verwerfen der höherwertigen Code-Points sollte funktionieren.


Das war das was ich mit ein bisschen Recherche herausfinden konnte, ich hoffe ich liege richtig und konnte helfen.

mfg

18

09.10.2015, 11:58

Vielen Dank birdfreeyahoo, dass du dir die Mühe gemacht hast und das ganze recherchiert hast. Da ich bis jetzt kaum Anunung von Kodierung etc. hatte, hätte das bei mir wahrscheinlich um einiges länger gedauert :)
Die XML kodiert jetzt in ISO 8859-1 und damit funktioniert es ohne Probleme.

<?xml version="1.0" encoding="iso-8859-1"?>

Frage nochmal an alle: Ist das zu einfach? Kommen dadurch jetzt noch irgendwelche anderen Probleme auf, oder kann man das tatsächlich einfach so lösen?
Ansonsten vielen Dank an alle, die geholfen haben :)

19

09.10.2015, 13:19

Du solltest dein Projekt lieber auf Unicode umstellen.

Werbeanzeige