Gutes Tutorial fuer UTF8 Handling in C++ ?



  • Hi,

    ich muss UTF8-kodierte Files verarbeiten, habe mit dem Thema bisher nichts zu tun gehabt und weiss sehr wenig darueber. Kennt jemand eine gute Beschreibung / Tutorial dazu ? (Muss ich die mit Wide-Characters verarbeiten ?, etc. etc.) Beim googeln und auch hier finde ich zwar viel Details, aber ich kann damit nichts anfangen, da eben der Ueberblick fehlt.

    (Es geht NICHT darum, C++ Souircen in UTF8 zu kodieren, die sollen schoen in ASCII bleiben).



  • Tutorials fände ich auch sehr interessant. Obwohl ich mir das jetzt nicht so schwierig vorstelle, du musst doch nur die Daten mit der richtigen Kodierung einlesen und intern die Unicode-Strings handeln. Beim raus-schreiben einfach wieder UTF8-en und das wars.



  • Die C++-Norm kennt kein UTF-8. Was brauchst du erstmal? Du brauchst (wenn du auf C++-Norm-Ebene bleiben willst) einen codecvt der UTF-8 verarbeitet. Der std::codecvt kann das nicht. Einen codecvt für UTF-8 gibts von Dinkumware und Boost hat auch einen eigenen codecvt_utf8, für seine eigenen Libraries. Habe aber selber keinen von beiden bisher ausprobiert.

    Wenn dir alles egal ist, und du irgendwie UTF-8 verarbeiten willst, mußt du mal die Suchmaschinen bemühen. Diverse Libraries verarbeiten UTF-8, Qt, gtk, wxWidgets usw. Evtl. tun es auch Betriebssystem-APIs.

    EDIT: Achja, mit C++0x wird alles besser. 😃



  • Poco kann auch UTF-8



  • @Artchi: Danke fuer den codecvt - Link !

    Mehr Info zu meiner Aufgabenstellung: In einem Batch-Programm lese ich diverse Text-Dateien (in UTF8-Format) ein, nach der Verarbeitung des Inhalts muss ich eine Postscript-Datei erzeugen. Das Programm soll moeglichst plattform-unabhaengig sein und kein spezielles Framework voraussetzen. Auf jeden Fall soll es unter Linux und Windows laufen

    Fuer die Umkodierung der Sonderzeichen (deutsche + osteuropäische Zeichen) in PostScript-Glyphen verwende ich eine
    map<char, string>. . In dem key-Teil steht eben das Sonderzeichen, der string-Teil enthaelt die PostScript-Umsetzung (in ASCII). Die map initialisiere ich durch Einlesen aus einer Ini-Datei, in der eben steht:

    Ä Adieresis
    Ö Odieresis
    Ü Udieresis
    ä adieresis
    ö odieresis
    ü udieresis
    ß germandbls 
    ... etc
    

    Wenn mich nicht alles taeuscht, muss ich den key-Teil als wchar deklarieren, oder ?



  • Diogenes77 schrieb:

    Wenn mich nicht alles taeuscht, muss ich den key-Teil als wchar deklarieren, oder ?

    Intern sollte dann alles über wchar_t und wstring laufen.

    Btw: Die Sonderzeichen würde ich nicht mit 'ö' usw in den Code schreiben, je nachdem in welcher Codepage dein Sourcecode abgespeichert wird, ergeben sich dafür unterschiedliche Werte (meine ich es so gewesen sei).



  • @Badestrand:

    Btw: Die Sonderzeichen würde ich nicht mit 'ö' usw in den Code schreiben, je nachdem in welcher Codepage dein Sourcecode abgespeichert wird, ergeben sich dafür unterschiedliche Werte (meine ich es so gewesen sei).

    Klar, die Sonderzeichen stehen nicht in Code, sondern in der erwaehnten ini-Datei.



  • Airdamn schrieb:

    Poco kann auch UTF-8

    Vollständigkeit wegen: http://pocoproject.org/



  • Diogenes77! Die Schwierigkeit ist doch nicht die Ersetzung zur Laufzeit. Das hast du ja praktisch schon mit der map<wchar_t, std::wstring> in einem guten Ansatz. Die Schwierigkeit ist, wie bekommt man UTF-8 von der Datei in den Speicher und umgekehrt. Und da brauchst du auf jeden Fall eine externe Library oder im einfachsten Fall, eine Header-Datei mit dem entsprechenden codecvt. Boost bietet sowas schon an. Und das ist plattformneutral, genauso wie POCO u.a. Libraries.



  • @Artchi: Genau, um das ist mir gegangen: Wie bekomme ich UTF8 rein und raus.
    Vielen Dank fuer die sehr brauchbaren Hinweise!! Ich werde mir POCO und Boost mal dahingehend reinziehen 🙂 cu, Diogenes


Log in to reply