Wie kann man einen Text nach UTF8 konvertieren?



  • Artchi schrieb:

    Also das UCS-2 veraltet ist, ist mir neu. Es ist einfach ein 16bit-Codepage, und UCS-4 ist ein 32bit-Codepage. Nicht mehr und nicht weniger.

    Windows, Solaris und ich glaube auch MacOS X arbeiten intern mit UCS-2. Windows tut dies definitiv. Die anderen habe ich irgendwo mal nebenbei gelesen. Also veraltet kann es nicht sein.

    Aber wenn ich heute ein OS entwickeln würde, würde ich natürlich UCS-4 einsetzen. Von dem Punkt aus gesehen, wäre UCS-2 "veraltet". 😉

    Es geht hauptsächlich darum, dass man mit UCS-2 keine Zeichen oberhalb von 0xFFFF darstellen kann, weil man auf die feste Kodierung von 16 Bit pro Zeichen beschränkt ist. Mit UTF-8/UTF-16 unterliegt man dieser Beschränkung nicht, weil eine variable Zeichenbreite möglich ist.
    Zwischen UTF-32 und UCS-4 besteht dieser Unterschied natürlich nicht, weil damit in jedem Fall der Unicode-Raum abgedeckt werden kann.



  • Hallo,

    hab' mal eine kurze Frage die zum Thema passt:
    Was für ne Kodierung haben String-Literale wie "Hallo" oder L"Welt"?
    Schreibt der Standard da was vor oder hängt das vom Texteditor ab?

    Und wie ist das bei Ein-/Ausgabeströmen? Betriebssystemabhängig?



  • Konrad schrieb:

    Was für ne Kodierung haben String-Literale wie "Hallo" oder L"Welt"?
    Schreibt der Standard da was vor oder hängt das vom Texteditor ab?

    AFAIK (ohne jetzt in den Standard geschaut zu haben) handelt es sich beim einfachen String auf jeden Fall um US-ASCII. Wie wchar_t intern aussieht, ist hingegen nicht spezifiziert. In der Praxis dürfte das auf den meisten gängigen Systemen wohl UCS-2 sein.



  • @Artchi
    UCS-2 ist veraltet, da man damit einfach nicht mehr alle Unicode-Zeichen darstellen kann. UTF-16 ist ein Mapping von UCS-4 auf UCS-2.

    Benutzt Solaris intern Unicode? Ich denke die werden für das Unix-Zeugs UTF-8 nehmen, so wie es alle anderen Unices auch machen. Mac OS X nimmt für das Unix Zeugs definitiv UTF-8. In Cocoa/Carbon wird intern wohl UTF-16 verwendet.

    @Konrad
    das schreibt der Standard nicht vor und hängt vom Editor ab.



  • Bei gtkmm hat sich immer

    std::string Glib::locale_to_utf8(std::string)
    

    und

    std::string Glib::locale_from_utf8(std::string)
    

    angeboten.
    (Ok die nehmen genaugenommen beide einen Glib::ustring auf der utf8-Seite aber das lässt sich implizit konvertieren.



  • kann mir irgendjemand da helfen? ich komme nicht vorran:
    Das muss doch irgendwer schonmal implementiert haben.

    std::string UTf8_to_text(std::string utf8String)
    

    [/quote]



  • Du hast doch schon jede Menge Loesungen genannt bekommen, warum nutzt Du die nicht?



  • die meisten Lösungen hatten nur den Weg von iso nach utf8, aber nicht von utf8 nach iso.
    Die einzige Lösung, die das doch hat, ist diese hier: http://www.gnu.org/software/libiconv/

    Ich will aber keine ganze library, sondern eigentlich nur eine Funktion, die mein Ergebnis liefert und diese habe ich noch nicht gefunden.



  • vielleischt sowas?

    #define LOWER_6_BIT(u)    ((u) & 0x003f)
    #define BIT7(a)           ((a) & 0x80)
    #define BIT6(a)           ((a) & 0x40)
    
    // Converts UTF-8 to wide char
    int UTF8ToWcharT (char *lpSrcStr, int cchSrc, wchar_t *lpDestStr, int cchDest)
    {
       int nTB = 0;    
       int cchWC = 0;  
       char *pUTF8 = lpSrcStr;
       char UTF8;
    
       while ((cchSrc--) && ((cchDest == 0) || (cchWC < cchDest)))
       {
           if (BIT7(*pUTF8) == 0)
           {
               if (cchDest)
                   lpDestStr[cchWC] = (wchar_t)*pUTF8;
               cchWC++;
           }
           else if (BIT6(*pUTF8) == 0)
           {
               if (nTB != 0)
               {
                   nTB--;
                   if (cchDest)
                   {
                       lpDestStr[cchWC] <<= 6;
                       lpDestStr[cchWC] |= LOWER_6_BIT(*pUTF8);
                   }
                   if (nTB == 0)
                       cchWC++;
               }
           }
           else
           {
               if (nTB > 0)
               {
                   nTB = 0;
                   cchWC++;
               }
               else
               {
                   UTF8 = *pUTF8;
                   while (BIT7(UTF8) != 0)
                   {
                       UTF8 <<= 1;
                       nTB++;
                   }
                   if (cchDest)
                       lpDestStr[cchWC] = UTF8 >> nTB;
                   nTB--;
               }
           }
           pUTF8++;
       }
       return cchWC;
    }
    

    eingaben sind:
    - pointer auf den source string (UTF-8)
    - länge des source strings
    - pointer auf den ausgabespeicher (wchar_t)
    - grösse des ausgabespeichers

    btw: der code stammt übrigens von 'microsoft' :p



  • jo, danke.
    das hilft mir sehr, um noch etwas mehr zu verstehen.

    vielleicht nutze ich aber jetzt trotzdem eine andere Bibliothek.
    und zwar diese: http://www.icu-project.org/userguide/strings.html#cpp_strings_c


Anmelden zum Antworten