[C++] char to wchar_t Konvertierung

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Affje800, 12. Oktober 2013 .

Schlagworte:
  1. 12. Oktober 2013
    Hallo,

    ich habe mal wieder ein super nerviges Problem. Ich muss ein normales char in ein wchar_t konvertieren. Das zeichen hole ich mir aus einem String

    Code:
    string lit = ... // spielt keine Rolle
    char c = lit[0];
    
    Bei Zeichen, die einen Dezimalwert <= 127 haben, ist die Konvertierung zu einem int kein Problem. Das große Problem sind Unicode-Zeichen, die auch unterstützt werden sollen.

    Im Funktionsaufruf habe ich das Zeichen ß. Konvertiere ich das nach int (static oder reinterpret_cast, da hab ich schon alles versucht), schlägt das fehl und ich bekomme -97.

    Also habe ich etwas gegoogled und bin auf den Typ wchar_t gestoßen, der seine Arbeit ganz gut verrichtet.

    Schreibe ich nun zum Test

    Code:
    wchar_t c = L'ß';
    cout << c << endl;
    
    so wird mir auf der Konsole 223 ausgegeben, was dem Dezimalwert für das ß entspricht.
    Das Problem ist nun, dass ich natürlich vor dem String nicht einfach ein L schreiben kann.
    Ein einfacher Type-Cast mittels wchar_t g = wchar_t(lit[0]); funktioniert ebenfalls nicht (-61).

    Wie bekomme ich denn nun (plattform- und compilerunabhängig!) das korrekte Ergebnis?
    Würde mich über Hilfen sehr freuen.

    MfG
     
  2. 12. Oktober 2013
    Zuletzt bearbeitet: 12. Oktober 2013
    AW: [C++] char to wchar_t Konvertierung

    "ß" ist auch kein char, sondern zwei *hint*
     
  3. 12. Oktober 2013
    AW: [C++] char to wchar_t Konvertierung

    Ja ist mir ja schon klar. Deshalb die Minus-Zahl. Ich bin ja auf den wchar-t (2-4 Bytes) umgestiegen, doch weiss nicht, wie ich da ein einfaches char konvertieren kann.

    Bzw. ein string Zeichen für Zeichen in ein wchar_t-Array umwandeln, irgendeine Möglichkeit muss es doch geben, ohne das Prefix-L.
     
  4. 12. Oktober 2013
    Zuletzt bearbeitet: 12. Oktober 2013
    AW: [C++] char to wchar_t Konvertierung

    Der *hint* war wohl nicht deutlich genug...

    "ß" besteht aus zwei chars (nach UTF-8): 0xC3 0x9F

    So bekommst du den Codepoint raus für die zwei Bytes:
    (Achung hardcoded)

    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
     char sz_utf8[] = "ß";
     
     /* mit absicht nicht utf16 genannt! *HINT* (!!) */ 
     wchar_t sz_16bit = ((sz_utf8[0] & 0x1F) << 6) | (sz_utf8[1] & 0x3F);
     
     printf("%u\n", sz_16bit); /* 223 */
     
     return 0;
    }
    
    Für ein vollständiges decoden von UTF-8 Zeichen nach UTF-16/32 bitte entsprechend selber recherchieren.
     
  5. 12. Oktober 2013
    Zuletzt bearbeitet: 12. Oktober 2013
    AW: [C++] char to wchar_t Konvertierung


    Danke, funktioniert!

    Edit: Glaube doch nicht. Für "statische" Zuweisungen gehts, für dynamische Zuweisungen leider nicht.

    Code:
    const char* sz_utf8 = lit.c_str();
     wchar_t sz_16bit = ((sz_utf8[0] & 0x1F) << 6) | (sz_utf8[1] & 0x3F);
     int value = static_cast<int>(sz_16bit); //(int)..
     cout << value << endl;
    

    Drei Aufrufe, ',' und ß:

    448
    448
    223

    Korrekt wäre aber 39, 39 und 223, oder nicht?
    Ich HASSE dieses scheiss Zeiger-Umbiegen und Bitshifts in C++.
     
  6. 12. Oktober 2013
    Zuletzt bearbeitet: 12. Oktober 2013
    AW: [C++] char to wchar_t Konvertierung

    Du hast leider nicht verstanden was UTF-8 ist und wie man damit umgehen muss (mein Beispiel war hardcoded für die beiden octets von "ß").
    Vor allem hast du den zweiten *HINT* wieder ignoriert. UTF-8 nach UTF-16 geht anders.

    Bitte schau dir entsprechende Dokumentationen dazu an.
    utf-8
    utf-16
    [G]c++ utf-8 to utf-16[/G]

    Im übrigen ist dein Code anfällig für array-out-of-bounds Fehler.
     
  7. 12. Oktober 2013
    AW: [C++] char to wchar_t Konvertierung

    Ich habe doch aber explizit im Eröffnungspost geschrieben, dass hardcoded Stuff null probleme darstellt, nu eben absolut nicht das ist, was ich brauche. Hardcoded kann ich einfach über wchar_t c = L'ß'; int v = (int)c; gehen und habe das gleiche Ergebnis.

    Wofür dann den ganzen Kram mit Bitshifts? Das stackoverflow Beispiel werde ich mir mal anschauen, danke.

    Btw. bewerten kann ich erst orgen, hab dich zuletzt bewertet, habe andere bewertet und muss nun warten
     
  8. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.