Ich schreibe gerade an einem kleinen Stückchen Code, das Nachrichten über das Netzwerk verschicken und empfangen kann.
Dieses Stückchen Code sollte so portabel wie möglich sein, also auf allen gängigen Systemen laufen, in möglichst vielen Ländern mit möglichst vielen Sprachen. Um dieses Ziel zu realisieren, habe ich in diesem Code für allen Text, der vom User kommen oder für den User bestimmt sein könnte als std::wstring definiert.
In der Annahme, meine Strings wären nun doppelt so groß wie normalerweise habe ich glücklich weiterprogrammiert. Bis ich eines Tages durch Zufall folgende Entdeckung gemacht habe:
Code: Alles auswählen
#include <iostream>
#include <string>
int main()
{ std::cout<<"sizeof(wchar_t): "<<sizeof(wchar_t)<<'\n'; }
Auf Linux staunte ich allerdings nicht schlecht:sizeof(wchar_t): 2
4 Bytes?? Ein Zeichen und vier Bytes? "Wow", dachte ich mir. Das ist ziemlich viel. Aber na gut, damit kann ich leben dachte ich mir. So groß sollten die Nachrichten auch wieder nicht sein. Irgendwie hatte ich den Unterschied zwischen den beiden Plattformen unterschlagen, und jedes Zeichen einfach in die entsprechende Anzahl von Bytes verpackt und verschickt. Auf der Empfängerseite kam alles so an wie es sollte. Ich habe ja nur auf Linux getestet.sizeof(wchar_t): 4
Tjo, und wie ich heute dazu komme meine Verpack- und Entpackroutinen neu zu schreiben kam ich darauf, dass das ganze nicht so naiv und unproblematisch ist.
Folgendes Problem:
Situation a)
sizeof(wchar_t)(Sender) == sizeof(wchar_t)(Empfänger)
Kein Problem, einfach alle Bytes eines Zeichens in die Nachricht packen und dann wieder alle Bytes aus der Nachricht in die Zeichen.
Situation b)
sizeof(wchar_t)(Sender) > sizeof(wchar_t)(Empfänger)
Tja... Da kommt nun eine Nachricht mit mehr bytes pro Zeichen als ich verarbeiten kann. Wohin damit? Einfach abschneiden? Konvertieren? Wie? Mit was?
Situation c)
sizeof(wchar_t)(Sender) < sizeof(wchar_t)(Empfänger)
Mein Zeichen hat nun mehr Bytes als ich aus dem Netzwerk bekomme. Was mache ich mit den Fehlenden? Einfach ausnullen?
Erwähnt sein noch, dass ich vorhatte Unicode als Zeichenkodierung zu verwenden.
Meine Frage:
Was sollte ich eurer Meinung nach tun? Soll ich überschüssiges abschneiden und fehlendes einfach mit Nullen ersetzen? Funktioniert das auch mit der Unicode kodierung? Muss ich jetzt nachsehen wie UTF-16 und UTF-32 kodiert ist und eigene Konvertierungsroutinen schreiben?
Sollte ich vielleicht sogar einen eigenen Stringtyp definieren, dessen Zeichengröße auf jeder Plattform gleich ist? Wie groß dann? 4 oder 2 Bytes?
Kurz: Was soll ich tun?
In Hoffnung auf gute Ratschläge,
fat-lobyte
edit: ps.: Könnte vielleicht jemand der nicht Linux und nicht Windows hat (z.B. Mac) das kurze Programm kompilieren und laufen lassen? Wüsste zu gern, wie groß sizeof(wchar_t) beispielsweise auf einem Mac ist.