unicode Pitfalls



  • Nachdem man im C++-Forum nur noch mit "Benutz Boost" zugeworfen wird und keiner mehr auf die eigentliche Frage eingeht, versuch ichs mal bei euch :).
    Ich hoffe, dass mir mal jemand mit UNICODE helfen kann. Mir will das nicht ganz in den Kopf.

    Ich habe eine String-Klasse. Diese verwendet als internen Buffer wchar_t. Der Typ ist 32bit breit. Soweit so gut. Aber wie unterscheide ich nun zwischen UTF-8, ISO8996-1 etc? Wie speicher ich in den versch. Zeichensätzen korrekt (windows und Linux)? Ich würde gerne die komplette Klasse als UTF-8 aufbauen, da das doch ausreichen sollte als "Universal-Speicherung"? Aber was ist dann mit Arabisch etc?
    Oder hab ich was falsch verstanden?
    (Und bitte, ich möchte das verstehen, keine neuen Libs installieren )
    Grüsse



  • wchar_t ist nur 16 Bit groß...



  • In Win32 zumindest.
    Ansonsten gibt es fuer dich AFAIK nur 2 Moeglichkeiten um Unicode-Konvertierungen zu machen, wenn du keine weiteren Libs benutzen willst: Entsprechende Funktionen des Betriebssystems benutzen, dann bist du hier falsch, oder den Kram selbst schreiben, dann darfst du deine Lieblingssuchmaschine auch selbst bedienen, um entsprechende Spezifikationen zu finden.



  • _Buster schrieb:

    Nachdem man im C++-Forum nur noch mit "Benutz Boost" zugeworfen wird

    don't try to fix it. boost it!

    _Buster schrieb:

    Diese verwendet als internen Buffer wchar_t.

    utf-8 ist komprimiertes unicode. die zeichen haben eine variable anzahl an bytes. es würde also besser passen, wenn du 'char' als basistyp nimmst.
    --> http://en.wikipedia.org/wiki/Utf-8
    🙂



  • "Die komplette Klasse als UTF-8 aufbauen" bietet sich im Übrigen nicht an. wchar_t hat eine feste Breite größer als char, damit eben keine Verrenkungen mit Zeichensätzen nötig sind, wo unterschiedliche Zeichen unterschiedliche Breiten haben. Unter Windows (sizeof wchar_t == 2) wird IMHO der UCS-2 Zeichensatz verwendet.

    Extern solltest Du einen Zeichensatz zur Kommunikation vereinbaren. Aufgrund der oben genannten Eigenschaft bietet sich hier tatsächlich UTF-8 an, da es potentiell viel Platz einsparen kann.

    Unterscheiden kannst Du Zeichensätze anhand der Eingabe so gut wie garnicht. Du musst wissen, was kommt.

    Um etwas konkreter zu werden, könnte sowas (in C) wie folgt aussehen:

    my_string* s = my_string_create_char( "hallö, welt", iso88591 ); // erzeugung aus narrow String
    my_string* t = my_string_create_wchar( L"hallö, welt", ucs2 ); // erzeugung aus wide String
    
    char c[ my_string_length( s ) * 2 ];
    my_string_convert( s, &c, &len_c, utf8 ); // ausgabe als utf-8
    
    wchar_t* x = my_string_get( s ); // der interne puffer
    
    ...
    


  • Danke für eure Antworten, die haben mir wirklich weitergeholfen. Nachdem sich das heute alles ein wenig gesetzt hat:
    Konvertierung nach UTF-8 sollte ja ohne Probleme mit libiconv möglich sein, die Abhängigkeit habe ich bereits durch GNU gettext (welches ich wirklich liebe.. es gibt dafür auch keinen Ersatz den ich jetzt wüsste), so entsteht da nix zusätzlich.

    Einzigster Task ist dann das wechseln des internen buffers meiner Klasse nach char, aber das ist kein prob, da ist nur ein #define und ein paar kleine Änderungen nötig (:.

    Unterscheiden kannst Du Zeichensätze anhand der Eingabe so gut wie garnicht. Du musst wissen, was kommt.

    Das macht mir noch etwas Sorgen, aber vllt verstehe ich das auch gerade nicht ganz richtig.
    Ich melde mich, wenn akut ein Problem auftritt.
    Eingabe von der Konsole erwarte ich keine, ich erwarte nur "Eingaben" von API-Funktionen unter Windows und Linux.

    Danke nochmal und may the Source be with you.
    mfg
    _Buster



  • Unterscheiden kannst Du Zeichensätze anhand der Eingabe so gut wie garnicht. Du musst wissen, was kommt.

    Manchmal kann man sich Tricks ausdenken, mit denen der Eingabe-Zeichensatz
    variabel wird. ZB die Byte Order Mark oder die Art und Weise,
    wie XML-Dateien gleich am Anfang ihre Kodierung angeben.

    Eingabe von der Konsole erwarte ich keine, ich erwarte nur "Eingaben" von API-Funktionen unter Windows und Linux.

    Für den Fall müßte man nochforschen können, wie die Eingabe kodiert sein wird.

    Nachdem man im C++-Forum nur noch mit "Benutz Boost" zugeworfen wird und keiner mehr auf die eigentliche Frage eingeht, versuch ichs mal bei euch :).

    Hehe. Daß ich das noch erlebe!



  • Aber was ist dann mit Arabisch etc?
    Oder hab ich was falsch verstanden?
    (Und bitte, ich möchte das verstehen, keine neuen Libs installieren )

    Kennst du eigentlich das da?


Anmelden zum Antworten