wxWidgets: Einzelne Zeile einlesen
-
Hi,
ich habe folgenden Code der von einem Socket eine Zeile auslesen soll:
wxString tmp; for (char c = ' '; c != '\n'; clients[i]->Read(&c, 1)) { tmp += c; } wxMessageBox(tmp);
Funktioniert soweit, aber sobald ich Umlaute oder überhaupt UTF8 verwenden will kommen nur Kästchen an. Wo ist der Fehler in meinem Code?
Danke
Martini
-
Martini schrieb:
Funktioniert soweit, aber sobald ich Umlaute oder überhaupt UTF8 verwenden will kommen nur Kästchen an.
Meinst du vielleicht, dass nur Kästchen ausgegeben werden, also das Ausgabemedium mit UTF8 bzw Umlauten nicht klarkommt?
-
Es muss sich um einen Programmierfehler handeln, denn normalerweise müsste wxWidgets damit klar kommen.
Die Frage ist natürlich: Wo liegt dieser Programmierfehler? Bin echt ratlos...
-
Ich kenne wxString nicht, evtl wird da alles über ASCII (was ja z.B. keine Umlaute spezifiziert) als mehrere Bytes gespeichert? Wie wird der Text auf der anderen Seite gesendet?
-
Hm, du könntest das auch alles auf einmal in einen buffer einlesen.
Wie sieht es aus wenn du in einen wchar einliest?phlox
-
Wie wurde wxWidgets kompiliert? Als UNICODE?
Wie wird die Datei eingelesen? Mit wxFile?
Hast du UTF-8 als Systemlokale? Wenn nein, dann erzeug mal einen UTF-8 string mit wxString(utf8string, *wxConvUTF8) oder ähnlich hab grade keine Doku zur Hand.
wxString nimmt immer die Codierung des Systems an, unter Windows also UCS2 und unter Linux was halt eingestellt ist. Wenn du also unter Windows UTF-8 einliest, musst du es entsprechend codieren afaik.
rya.
-
Badestrand schrieb:
Ich kenne wxString nicht, evtl wird da alles über ASCII (was ja z.B. keine Umlaute spezifiziert) als mehrere Bytes gespeichert? Wie wird der Text auf der anderen Seite gesendet?
Ich nutze zum Testen PuTTY und habe das Codeset auf UTF-8 gestellt.
phlox81 schrieb:
Hm, du könntest das auch alles auf einmal in einen buffer einlesen.
Wie sieht es aus wenn du in einen wchar einliest?phlox
Wenn ich in ein
wxChar
einlese, dann verändert sich gar nichts. Lese ich aber mehrere Zeichen auf einmal ein, dann klappt es.Ich lese Zeichenweise ein, da mein Protokoll Zeilenorientiert ist. Leider habe ich keine Funktion
ReadLine
gefunden und versuche mir sie so selber zu schreiben...Scorcher24 schrieb:
Wie wurde wxWidgets kompiliert? Als UNICODE?
Wie wird die Datei eingelesen? Mit wxFile?
Hast du UTF-8 als Systemlokale? Wenn nein, dann erzeug mal einen UTF-8 string mit wxString(utf8string, *wxConvUTF8) oder ähnlich hab grade keine Doku zur Hand.
wxString nimmt immer die Codierung des Systems an, unter Windows also UCS2 und unter Linux was halt eingestellt ist. Wenn du also unter Windows UTF-8 einliest, musst du es entsprechend codieren afaik.
rya.Es handelbt sich um die Unicode-Version. Es handelt sich um einen Socket von dem gelesen wird. Ich kann auch ohne Probleme Unicode ausgeben, etc...
Ich denke, da ich nur 1 Zeichen einlese kommen Zeichen, wie Umlaute falsch an, da sie anders dargestellt werden? Allerdings muss das doch irgendwie klappen? Bin noch immer ratlos...
Viele Grüße
Martini
-
Also zeilenbasiertes Protokoll heisst ja nicht, das du auch das Socket zeilenbasiert lesen musst.
Einfach alles lesen, und dann den Buffer zeilenweise auslesen. (ginge z.b. mit getline und stringstream).wxTextInputStream bietet z.b. eine Readline an, wxSocketInputStream hat diese nicht.
Einfach weil es nicht sinnvoll ist.Oh, und wenn du mit char unicode einliest, wieso wunderst du dich dann über das Ergebnis?
char ist nicht für unicode gedacht, was passiert bei wchar?
-
Für UTF8 ist char ausreichend.
rya.
-
Scorcher24 schrieb:
Für UTF8 ist char ausreichend.
rya.Stimmt, hatte nur den Unicode + wxWidgetsteil da wahrgenommen. Wenn er UTF8 bekommt, ist char natürlich ausreichend.
Dann könnte es am charset bzw. der locale liegen.
-
@TE
http://utfcpp.sourceforge.net/
Lad das hier mal runter und teste die ankommenden daten damit. Das geht recht einfach:// Auszug aus deren HP: string::iterator end_it = utf8::find_invalid(line.begin(), line.end()); if (end_it != line.end()) { cout << "Invalid UTF-8 encoding detected at line " << line_count << "\n"; cout << "This part is fine: " << string(line.begin(), end_it) << "\n"; }
Dann weisst du, ob da was falsch ankommt.
Aber wie bereits geschrieben: wxString hat auf Windows standardmäßig UTF-16 als Kodierung, das ist etwas anderes als utf8...The UTF-8 build must handle this case correctly, so we need to provide interface for iterating over characters and not bytes. Note that such interface would be useful for Win32 Unicode build as well: Win32 uses UTF-16 encoding for wide strings and so the above code is incorrect for it as well, because it only works for Plane 0 Unicode characters.
http://wiki.wxwidgets.org/Development:_UTF-8_Support
Ist mir gerade noch so eingefallen
rya.
-
Hi,
ich konnte das Problem durch Benutzung von wxTextInputStream lösen. Vielen Dank
Allerdings stehe ich nun vor einem neuen Problem. Also die Zeile lese ich ja ein, da sie eine Art Header ist in der wichtige Informationen stehen.
Unter anderem soll dort auch die Länge des Inhaltes angegeben werden, aber da ist auch mein Problem: Es reicht wahrscheinlich nicht, wenn ich nur die Länge angebe, oder? Schließlich belegen einige Zeichen ja mehr bzw. weniger Byte, je nach Zeichensatz? Ich habe für wxString leider keine Funktion gefunden, um an die Bytes zu kommen und alle Funktionen, die ich probiert habe, geben nur die Länge des Strings zurück: Len, Length, size, ...Wie soll ich mein Protokoll also nun aufbauen? Vereinfacht soll das später so ausschauen:
CONTENT_SIZE CONTENT
Wie würdet ihr vorgehen, was sollte ich beachten?
Vielen Dank
Martini
-
Hm, eine Alternative zu den wxSockets wäre asio:
http://tenermerx.com/Asio/asio-1.3.1/doc/asio/overview/core/line_based.htmlGibts auch in einer boost version. Ich denke das ich in zukunft eher asio einsetzen werde, als die sockets von wxWidgets.
phlox
-
phlox81 schrieb:
Hm, eine Alternative zu den wxSockets wäre asio:
http://tenermerx.com/Asio/asio-1.3.1/doc/asio/overview/core/line_based.htmlGibts auch in einer boost version. Ich denke das ich in zukunft eher asio einsetzen werde, als die sockets von wxWidgets.
phlox
Ich hab schon drauf gewartet, dass einer mit boost ankommt :p
Hat aber lange gedauert, hihi, im C++ Forum wärs die erste Antwort gewesen *duck und renn*
rya.