[C++] Umgang mit Unicode

Simple Directmedia Layer: Portable Spieleprogrammierung
Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: [C++] Umgang mit Unicode

Beitrag von Glocke » So Okt 28, 2012 4:52 pm

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 :?

nufan
Wiki-Moderator
Beiträge: 2448
Registriert: Sa Jul 05, 2008 3:21 pm

Re: [C++] Umgang mit Unicode

Beitrag von nufan » So Okt 28, 2012 4:59 pm

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 :?
Wenn du keine Unicode-Zeichen verwendest (wovon ich dir sowieso abraten würde), kannst du ja einfach die vorher genannten Konvertierungs-Methoden verwenden.

Benutzeravatar
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

Beitrag von Bebu » So Okt 28, 2012 5:59 pm

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!

Benutzeravatar
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

Beitrag von Bebu » So Okt 28, 2012 6:10 pm

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!

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: [C++] Umgang mit Unicode

Beitrag von Glocke » So Okt 28, 2012 6:49 pm

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.

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
LG Glocke :)

nufan
Wiki-Moderator
Beiträge: 2448
Registriert: Sa Jul 05, 2008 3:21 pm

Re: [C++] Umgang mit Unicode

Beitrag von nufan » So Okt 28, 2012 9:37 pm

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 ^^
Würde ich dir auch so empfehlen ^^

Du kannst dich ja mal im Brett User-Vorstellungen vorstellen :)

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: [C++] Umgang mit Unicode

Beitrag von Glocke » So Okt 28, 2012 10:23 pm

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 :D 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 :?

nufan
Wiki-Moderator
Beiträge: 2448
Registriert: Sa Jul 05, 2008 3:21 pm

Re: [C++] Umgang mit Unicode

Beitrag von nufan » So Okt 28, 2012 10:31 pm

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 :D Was wäre die "einfachste" Möglichkeit, ohne für den Defaulttext mit lauter Zahlen um mich zu werfen?
Puh... ich glaube da kommst du nicht über das angeben des Zeichencodes hinweg.

Code: Alles auswählen

UnicodeString str;
str += (Uint16) 'a';
str += (Uint16) 's';
str += (Uint16) 0x00df;
str += (Uint16) 'd';
str += (Uint16) 'f';

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: [C++] Umgang mit Unicode

Beitrag von Glocke » So Okt 28, 2012 11:16 pm

Naja dann landet das erstmal auf der ToDo-Liste ...

Danke @all :)

Antworten