[C++] Umgang mit Unicode

Simple Directmedia Layer: Portable Spieleprogrammierung
Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: [C++] Umgang mit Unicode

Beitrag von Xin » So Okt 28, 2012 12:03 pm

Glocke hat geschrieben:Wie eingangs gesagt, weiß ich nicht wie ich die einzelnen Unicode-Chars korrekt sende. Wandle ich jeden char des Strings in einen unsigned int um (um den Zahlenwert zu erhalten), bekomme ich ihn auf der Gegenseite nicht wieder zusammengesetzt, weil ich nicht weiß wie. Wie gesagt: Der cast zum char wäre ja Quatsch.
Du sendest einen Datenblock. Der ist x Bytes groß, in C ist ein char 1 Byte groß, Du musst also x chars senden.

Bitte verwechsle "char" nicht mit ASCII-Buchstaben. Der Datentyp heißt char, weil mit einzelnen Bytes nunmal meistens ASCII-Zeichen gespeichert wird. Sendest Du ints, drückst Du alles unabhängig von der wirklichen Größe in ein 32-Bit breite Zeichen.
Glocke hat geschrieben:Und nein, auf beiden Seiten ist SDL-seitig Unicode aktiviert. Btw habe ich zu Testzwecken eine Variable mal direkt mit "asßdf" initialisiert. Dabei gibt es beim ß Probleme. Ich hole zeichenweise mit myString[index] die chars, caste die zum unsigned int und schicke die rüber. Für die Zeichenkette sendet er die Zahlen 97 ("a"), 115 ("s"), 4294967235, 4294967199, 100 ("d") und 102 ("f").
Wunderbar: UTF8. Sende sie als chars. Der String "asßdf" ist 6 Byte groß, 5 Buchstaben. Wenn Du die Zeichen nicht zu ints machst, musst Du sie auch nicht zurückformatieren.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

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

Re: [C++] Umgang mit Unicode

Beitrag von Glocke » So Okt 28, 2012 12:21 pm

Xin hat geschrieben:Wunderbar: UTF8. Sende sie als chars. Der String "asßdf" ist 6 Byte groß, 5 Buchstaben. Wenn Du die Zeichen nicht zu ints machst, musst Du sie auch nicht zurückformatieren.
Ich versuche jetzt mit den oben genannten Funktionen den multibyte string in einen widestring umzuwandeln. Dabei sendet er die einzelnen wchar_t als Zahlen :cry:

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

Re: [C++] Umgang mit Unicode

Beitrag von nufan » So Okt 28, 2012 12:25 pm

Ich hab mal einen Instant-Messenger in SDL geschrieben.

Gesendet hab ich folgendermaßen:

Code: Alles auswählen

SDLNet_TCP_Send( socket, message, sizeof( Uint16 ) * messageLength);
Wobei:
socket: SDL-Socket
message: Uint16-Array
messageLength: Anzahl der Zeichen in "message".

Empfangen (zeichenweise):

Code: Alles auswählen

  do
  {
    SDLNet_TCP_Recv( socket, &buffer, sizeof( Uint16 ));
    incoming_message += buffer;
  } while( buffer != SDLK_UNKNOWN );
Wobei:
socket: SDL-Socket
buffer: Ein einzelnes Uint16
incoming_message: Ein Uint16-String, siehe unten.

Tipp:
Definiere dir einen eigenen Typ "UnicodeString", mit dem du besser arbeiten kannst. Im einfachsten Fall sieht das so aus:

Code: Alles auswählen

typedef basic_string <Uint16> UnicodeString;

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

Re: [C++] Umgang mit Unicode

Beitrag von Glocke » So Okt 28, 2012 12:30 pm

Ich bin jetzt "zurück" zur bisherigen Variante, also mit nem Index durch den std::string durchgehen und jedes myString[index] zu senden. Keine Ahnung was ich anders gemacht habe aber jetzt kommt der String korrekt an.

Allerdings hapert es jetzt "nur" noch an der Darstellung. Verwende ich TTF_RenderUNICODE_Solid statt TTF_RenderText_Solid, ist der zweite Parameter (statt const char *) const Uint16 *. Ich muss mir noch was überlegen, wie ich meinen String da reinwürfle :mrgreen:

LG Glocke

/EDIT: Wie oben besprochen, sind meine Chars ja UTF-8 - da wäre ich mit TTF_RenderUTF8_Solid besser dran :D

/EDIT 2: Und mit TTF_RenderUTF8_Solid läuft es xD

Danke für Eure Hilfe =)

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

Re: [C++] Umgang mit Unicode

Beitrag von nufan » So Okt 28, 2012 12:43 pm

Blöde Frage... aber wie liest du deine Zeichen überhaupt ein? Über die Konsole? Sonst ist mir nicht klar, wie du auf UTF8 kommst.

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

Re: [C++] Umgang mit Unicode

Beitrag von Glocke » So Okt 28, 2012 12:54 pm

nufan hat geschrieben:Blöde Frage... aber wie liest du deine Zeichen überhaupt ein? Über die Konsole? Sonst ist mir nicht klar, wie du auf UTF8 kommst.
Ich hab die zu Testzwecken erstmal im Code initialisiert
string test = "asßdf";

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

Re: [C++] Umgang mit Unicode

Beitrag von nufan » So Okt 28, 2012 1:41 pm

Glocke hat geschrieben:
nufan hat geschrieben:Blöde Frage... aber wie liest du deine Zeichen überhaupt ein? Über die Konsole? Sonst ist mir nicht klar, wie du auf UTF8 kommst.
Ich hab die zu Testzwecken erstmal im Code initialisiert
string test = "asßdf";
Ja, das habe ich schon verstanden. Aber was hast du vor? Wie soll das mal funktionieren? Du wirst ja nicht alle Texte statisch festlegen. Gibst du die Texte dann über ein SDL-Fenster ein, oder über die Konsole?

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

Re: [C++] Umgang mit Unicode

Beitrag von Glocke » So Okt 28, 2012 1:46 pm

Ach das meinst du :D
Ich habe mir eine "InputField"-Klasse geschrieben, die sich selber malt und die Eingabe bereitstellt. Dabei wird event.key.keysym.unicode ausgewertet.

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

Re: [C++] Umgang mit Unicode

Beitrag von nufan » So Okt 28, 2012 1:52 pm

Glocke hat geschrieben:Ich habe mir eine "InputField"-Klasse geschrieben, die sich selber malt und die Eingabe bereitstellt. Dabei wird event.key.keysym.unicode ausgewertet.
Ok, dann hast du das ziemlich gleich wie in meinem ersten Beitrag.

Dann hast du 2 Möglichkeiten:
1) Du hast Unicode nicht aktiviert und kannst folgende Werte verwenden: http://www.libsdl.org/docs/html/sdlkey.html
2) Du hast Unicode aktiviert, das in der SDL aber UTF-16 (Uint16) ist, nicht UTF-8 wie du es jetzt verwendest.

Ich würde das mal mit deiner Eingabe-Klasse ausprobieren, nicht über einen statischen String.

EDIT:
Sehs leider erst jetzt. So hast du eindeutig die 2. Möglichkeit und musst Uint16 verwenden, sonst verlierst du Informationen.
Übrigens hab ich das Thema mal ins SDL-Forum verschoben.

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

Re: [C++] Umgang mit Unicode

Beitrag von Glocke » So Okt 28, 2012 3:38 pm

nufan hat geschrieben:Sehs leider erst jetzt. So hast du eindeutig die 2. Möglichkeit und musst Uint16 verwenden, sonst verlierst du Informationen.
Übrigens hab ich das Thema mal ins SDL-Forum verschoben.
Also meine Eingabe ist UTF-16, also muss ich den Netzwerk-Teil auf UTF-16 umschreiben, oder?

Antworten