Seite 2 von 4

Re: [C++] Umgang mit Unicode

Verfasst: So Okt 28, 2012 12:03 pm
von Xin
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.

Re: [C++] Umgang mit Unicode

Verfasst: So Okt 28, 2012 12:21 pm
von Glocke
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:

Re: [C++] Umgang mit Unicode

Verfasst: So Okt 28, 2012 12:25 pm
von nufan
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;

Re: [C++] Umgang mit Unicode

Verfasst: So Okt 28, 2012 12:30 pm
von Glocke
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 =)

Re: [C++] Umgang mit Unicode

Verfasst: So Okt 28, 2012 12:43 pm
von nufan
Blöde Frage... aber wie liest du deine Zeichen überhaupt ein? Über die Konsole? Sonst ist mir nicht klar, wie du auf UTF8 kommst.

Re: [C++] Umgang mit Unicode

Verfasst: So Okt 28, 2012 12:54 pm
von Glocke
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";

Re: [C++] Umgang mit Unicode

Verfasst: So Okt 28, 2012 1:41 pm
von nufan
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?

Re: [C++] Umgang mit Unicode

Verfasst: So Okt 28, 2012 1:46 pm
von Glocke
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.

Re: [C++] Umgang mit Unicode

Verfasst: So Okt 28, 2012 1:52 pm
von nufan
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.

Re: [C++] Umgang mit Unicode

Verfasst: So Okt 28, 2012 3:38 pm
von Glocke
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?