Internationalisierung/Unicode
-
Hallo,
ich will einige Projekte nach Unicode "umstellen" und habe da noch paar offene Fragen.
Die Programme sollen in zwei sprachen (deutsch und englisch) verfügbar sein und können auch auf Betiebssystemen (Windows u. Linux) mit unterschiedlichen Sprachen laufen. Zu Zeit nutze ich intern reine ansi std::strings.
Ein Problem, das ich habe ist, dass meine GUI Bibliothek (wxWidgets) ab der nächsten Version ansi strings nicht mehr (vernünftig) unterstützt. Ich habe wenigstens Problem mit dem ansi-build des aktuellen Snapshots.
Dann nutze ich noch andere Bibliotheken, die noch mit char-pointern für Dateinamen/Inhalt arbeiten.Ist eine Umstellung auf Unicode überhaupt sinnvoll?
Was ist wenn Dateinamen zum Beispiel Sonderzeichen enthalten und die dann zu charpointern konvertiert werden?Wo sollte ich welchen Stringtyp nutzen?
Intern wollte ich mit std::wstrings arbeiten und die dann für die alten Libs konvertieren (icu). Eine Alternative wäre intern mit ansistrings zu arbeiten und die nur für die GUI zu konvertieren.Vielleicht hat ja jemand paar Tips ob und wie man das machen kann.
-
Also... in aller Kürze
-
Einige Libraries bieten Funktionen an, denen du bereits geöffnete FILE* oder ähnliches mitgeben kannst. Damit kann man Limitierungen bei Dateinamen umgehen, da du die Dateien selbst aufmachen kannst.
-
Wenn alle Betriebssysteme die du unterstützen willst, es erlauben die Default-Codepage für einen Thread auf UTF-8 umzustellen, kannst du das ausnutzen um die Limitierung zu umgehen.
Du konvertierst deine Unicode-Strings dann einfach auf UTF-8, schaltest die Codepage auf UTF-8 um, und rufst dann die Funktion der Library auf die nur einen char* als Dateinamen akzeptiert. Und schaltest die Codepage danach evtl. gleich wieder auf das um, was sie vorher war.
Oder du schaltest die Codepage gleich bei Programmstart (und bei Start jedes Threads, falls dieser nicht die Codepage des erzeugenden Threads übernimmt) auf UTF-8 um, und lässt sie dann permanent auf UTF-8.
- Wenn das alles nicht gehen sollte, kannst du immer noch die GUI über Unicode lokalisieren. Deine Applikation hätte dann zwar die Einschränkung, dass nur Dateien verwendet werden können, deren Namen sich verlustfrei in die System-Default-Codepage konvertieren lässt. Aber das hindert dich ja nicht daran für diverse GUI Elemente trotzdem Unicode zu verwenden.
Wo sollte ich welchen Stringtyp nutzen?
Intern wollte ich mit std::wstrings arbeiten und die dann für die alten Libs konvertieren (icu). Eine Alternative wäre intern mit ansistrings zu arbeiten und die nur für die GUI zu konvertieren.Ich würde überall Unicode Strings verwenden wo du kannst.
Ob du std::wstring verwenden willst, ... hm. std::wstring verwendet wchar_t, und verschiedene Systeme verstehen unter wchar_t verschiedene Dinge. Windows üblicherweise UTF-16, Linux Systeme üblicherweise UTF-32.
Ich würde mir evtl. einen eigenen Stringtyp definieren der entweder UTF-32 ist, oder UTF-8. Wenn die "Haupt-Plattform" Windows ist macht u.U. auch UTF-16 Sinn. "Je nach Plattform" mal UTF-16 und mal UTF-32 zu verwenden halte ich nicht für die beste Idee - da muss man sonst ziemlich aufpassen keinen Unfug zu bauen.
-
-
@hustbaer
Ist es unter Windows nicht eher UCS2?
-
@rüdiger: Hihi
Klassiker
http://blogs.msdn.com/michkap/archive/2005/05/11/416552.aspx
Kurze Antwort: Jain