[C++] Umgang mit Unicode
Re: [C++] Umgang mit Unicode
Das nächste Problem was ich sehe (wenn ich auf den UTF-16 String umsteige) ist, dass die open-Methode von Filestreams offenbar einen UTF-8 String voraussetzt
Rage - ein "modernes" Rogue-like (C++11, SFML)
Re: [C++] Umgang mit Unicode
Wenn du keine Unicode-Zeichen verwendest (wovon ich dir sowieso abraten würde), kannst du ja einfach die vorher genannten Konvertierungs-Methoden verwenden.Glocke hat geschrieben:Das nächste Problem was ich sehe (wenn ich auf den UTF-16 String umsteige) ist, dass die open-Methode von Filestreams offenbar einen UTF-8 String voraussetzt
- Bebu
- Beiträge: 562
- Registriert: Mi Okt 21, 2009 6:19 pm
- Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!
Re: [C++] Umgang mit Unicode
Wenn du sicher bist, das der Inhalt deiner Variablen UTF16 codiert ist, dann hätte ich etwas für dich, das ich mal dank Xin erarbeitet habe, ich muss es nur kurz suchen gehen. Please stand by
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!
- Bebu
- Beiträge: 562
- Registriert: Mi Okt 21, 2009 6:19 pm
- Wohnort: In der Nähe von Salzburg - Bin aber kein Österreicher!
Re: [C++] Umgang mit Unicode
So, ganz schlecht, ich finde es im Moment nicht wieder, aber du kannst es durch Bitoperationen hinbekommen. Ich muss mal suchen, ob ich den Code dazu mal ins Dedupe Repo eingecheckt habe. Auf meiner Festplatte ist es leider nicht mehr Kann ein bisschen dauern
Wer immer nach dem Unerreichbaren jagt, der wird irgendwann auf die Schnauze fallen!
Re: [C++] Umgang mit Unicode
Ich hab jetzt in detailierter Kleinarbeit alle Stellen überdacht, an denen ich bisher Strings verwendet habe. Prinzipiell bleibe ich bei der Verwendung von std::string, da ich viele Dinge zur Laufzeit aus .ini-Dateien lese und im Quellcode einige Strings kombiniert werden. Das auf meine Klasse Unicode umzumünzen (und entsprechende operator+ Methoden zu schreiben) ist mir jetzt ehrlich gesagt zu viel Aufwand.
Alle Stellen die mit User-Eingaben, Bildschirm-Ausgaben oder Netzwerk zu tun haben, verwende ich meine von basic_string abgeleitete Unicode-Klasse. Für das Lesen und Schreiben von Primitivtypen via Socket habe ich mir zwei template-Funktionen geschrieben (die sizeof(T) entsprechend mit berücksichtigen). Für meinen Unicode gibt es jeweils eine Lese- und Schreibe-Methode. Allerdings habe ich die etwas abgeändert: Ich schreibe erst die Länge des Strings auf den Socket und dann die einzelnen Chars - beim Lesen weiß ich dann wie oft ich vom Socket nen Uint16 lesen muss. Probiert habe ich das aber noch nicht abschließend.
Für die Umwandlung std::string nach Unicode und umgekehrt verwende ich die oben vorgeschlagenen Methoden. Zusätzlich habe ich (zum Konvertieren von Primitivtypen) die Funktionen toString, fromString für std::string und toUnicode, fromUnicode für Unicode implementiert. Die funktionieren schonmal
Sobald ich den Rest getestet habe, melde ich ich nochmal. Was das FileHandling angeht: Ich verwende dabei einfach std::string, auch für die zu lesenden Zeichenketten. Das reicht mir für meine Zwecke vollkommen aus. Ich mag auch keine Dateien mit Sonderzeichen oder sowas ^^ Und in den .ini-Files verwende ich eh englische Sprache, z.B.
LG Glocke
Alle Stellen die mit User-Eingaben, Bildschirm-Ausgaben oder Netzwerk zu tun haben, verwende ich meine von basic_string abgeleitete Unicode-Klasse. Für das Lesen und Schreiben von Primitivtypen via Socket habe ich mir zwei template-Funktionen geschrieben (die sizeof(T) entsprechend mit berücksichtigen). Für meinen Unicode gibt es jeweils eine Lese- und Schreibe-Methode. Allerdings habe ich die etwas abgeändert: Ich schreibe erst die Länge des Strings auf den Socket und dann die einzelnen Chars - beim Lesen weiß ich dann wie oft ich vom Socket nen Uint16 lesen muss. Probiert habe ich das aber noch nicht abschließend.
Für die Umwandlung std::string nach Unicode und umgekehrt verwende ich die oben vorgeschlagenen Methoden. Zusätzlich habe ich (zum Konvertieren von Primitivtypen) die Funktionen toString, fromString für std::string und toUnicode, fromUnicode für Unicode implementiert. Die funktionieren schonmal
Sobald ich den Rest getestet habe, melde ich ich nochmal. Was das FileHandling angeht: Ich verwende dabei einfach std::string, auch für die zu lesenden Zeichenketten. Das reicht mir für meine Zwecke vollkommen aus. Ich mag auch keine Dateien mit Sonderzeichen oder sowas ^^ Und in den .ini-Files verwende ich eh englische Sprache, z.B.
Code: Alles auswählen
[init]
width=640
height=480
fullscreen=off
title=Isometric Engine Demo
[interface]
debug=on
fps=100
font=FreeSans
fontsize=14
[server]
port=14000
Rage - ein "modernes" Rogue-like (C++11, SFML)
Re: [C++] Umgang mit Unicode
Würde ich dir auch so empfehlen ^^Glocke hat geschrieben:Prinzipiell bleibe ich bei der Verwendung von std::string, da ich viele Dinge zur Laufzeit aus .ini-Dateien lese und im Quellcode einige Strings kombiniert werden.
[...]
Alle Stellen die mit User-Eingaben, Bildschirm-Ausgaben oder Netzwerk zu tun haben, verwende ich meine von basic_string abgeleitete Unicode-Klasse.
[...]
Was das FileHandling angeht: Ich verwende dabei einfach std::string, auch für die zu lesenden Zeichenketten. Das reicht mir für meine Zwecke vollkommen aus. Ich mag auch keine Dateien mit Sonderzeichen oder sowas ^^
Du kannst dich ja mal im Brett User-Vorstellungen vorstellen
Re: [C++] Umgang mit Unicode
Soooo. An für sich läuft das jetzt mit dem Senden so wie ich es will. Für das Senden von std::strings hab ich zusätzlich noch die Send-Methode überladen (sie erzeugt dann das Unicode Objekt und verfährt wie bereits beschrieben).
Allerdings habe ich noch folgendes Problem:
Ich erzeuge im Code mein Eingabefeld und gebe seiner text-Variable (die vom Typ meines Unicode-Strings Unicode ist) einen Default-Wert mit Sonderzeichen (z.B. asßdf). Da die im Code angegebene Zeichenkette automatisch UTF-8 ist, müsste ich sie ja in mein Format umwandeln. Dabei geht aber das ß flöten Was wäre die "einfachste" Möglichkeit, ohne für den Defaulttext mit lauter Zahlen um mich zu werfen?
Wenn der Unicode-Text einmal als Variable korrekt vorliegt, kann ich den versenden und rendern und bla ^^ Btw funktioniert natürlich auch das Schreiben im Feld richtig (ich kann zur Laufzeit also das ß eingeben und es erscheint korrekt). Nur das mit dem Defaultwert is bissel doof
Allerdings habe ich noch folgendes Problem:
Ich erzeuge im Code mein Eingabefeld und gebe seiner text-Variable (die vom Typ meines Unicode-Strings Unicode ist) einen Default-Wert mit Sonderzeichen (z.B. asßdf). Da die im Code angegebene Zeichenkette automatisch UTF-8 ist, müsste ich sie ja in mein Format umwandeln. Dabei geht aber das ß flöten Was wäre die "einfachste" Möglichkeit, ohne für den Defaulttext mit lauter Zahlen um mich zu werfen?
Wenn der Unicode-Text einmal als Variable korrekt vorliegt, kann ich den versenden und rendern und bla ^^ Btw funktioniert natürlich auch das Schreiben im Feld richtig (ich kann zur Laufzeit also das ß eingeben und es erscheint korrekt). Nur das mit dem Defaultwert is bissel doof
Rage - ein "modernes" Rogue-like (C++11, SFML)
Re: [C++] Umgang mit Unicode
Puh... ich glaube da kommst du nicht über das angeben des Zeichencodes hinweg.Glocke hat geschrieben:Ich erzeuge im Code mein Eingabefeld und gebe seiner text-Variable (die vom Typ meines Unicode-Strings Unicode ist) einen Default-Wert mit Sonderzeichen (z.B. asßdf). Da die im Code angegebene Zeichenkette automatisch UTF-8 ist, müsste ich sie ja in mein Format umwandeln. Dabei geht aber das ß flöten Was wäre die "einfachste" Möglichkeit, ohne für den Defaulttext mit lauter Zahlen um mich zu werfen?
Code: Alles auswählen
UnicodeString str;
str += (Uint16) 'a';
str += (Uint16) 's';
str += (Uint16) 0x00df;
str += (Uint16) 'd';
str += (Uint16) 'f';
Re: [C++] Umgang mit Unicode
Naja dann landet das erstmal auf der ToDo-Liste ...
Danke @all
Danke @all
Rage - ein "modernes" Rogue-like (C++11, SFML)