wchar_t und Unicode



  • Ich recycle hier mal meinen Thread von früher:
    Ich versuche gerade, diverse Sonderzeichen in einem String zu speichern. Da die Zeichen im UTF-8-Format vorliegen, habe ich also einen wchar_t-String erstellt.
    Nun habe ich jedoch das Problem, dass mein String gewisses Fehlverhalten zeigt, wenn ich z.B.

    wchar_t string[200] = "ein gaaaa....aanz langer Text";
    int i = 55;
    string[i] = 1083;   //das müsste irgendein kyrillisches Zeichen sein
    

    Ich bin mir nicht sicher, ob in diesem kurzen Beispiel der Fehler noch enthalten ist, aber es kommt mir so vor, als würde der String beim Beschreiben einer Zelle mit einer großen Zahl verschwinden. Zumindest ist er danach entweder leer oder noch schlimmer...
    Ich hoffe mal, dass mir diesmal jemand helfen kann :).



  • Noch ein kleiner Behelfspost, damit die Antwortwahrscheinlichkeiten steigen. Ich hoffe, das ist nicht allzu schlimm.



  • Und wie überprüfst du, ob die Ausgabe korrekt ist? Welches Betriebssystem nutzt du?

    Wenn du versuchst das unter Windows auf der Konsole auszugeben, dann wird das vermutlich zu Problemen führen, da die Windowskonsole nicht so gut mit anderen Zeichensätzen klar kommt.

    In diesem Fall solltest du eine MessageBox zum Debuggen nutzen.

    Ansonsten gib mal mehr Informationen raus.



  • wchar_t string[200] = "ein gaaaa....aanz langer Text";

    muss heißen

    wchar_t string[200] = L"ein gaaaa....aanz langer Text";

    warum? das L vor einem Stringliteral sagt dem Compiler, dass der String Unicode enthält.

    also würde mit dem L aus deinem Text sowas:
    "e\0i\0n\0 \0g\0a\0a\0a\0a\0.\0.\0.\0.\0a\0a\0n\0z\0 \0l\0a\0n\0g\0e\0r\0 \0T\0e\0x\0t\0"

    das liegtd aran, dass wchar_t so groß ist wie 2 char.
    da die normalen ASCII Zeichen aber nur ein char brauchen, ist das 2. Byte immer eine \0.

    wenn du nun aber das L weglässt, passiert z.B. folgendes:
    wchar_t erstes_zeichen = 'e' + ('i' * 256);

    also kurz: immer 2 Zeichen werden zusammengeschmissen.
    dadurch kommen dann krüptische Zeichen heraus 😉

    also platzer einfach ein L vor deinem Unicode String und es sollte funktionieren



  • Stiefel2000 schrieb:

    Da die Zeichen im UTF-8-Format vorliegen, habe ich also einen wchar_t-String erstellt.

    UTF-8 Format != wchar_t.
    UTF-8 Strings werden in gewöhnlichen char Arrays gespeichert. Im wchar_t Format ginge zwar auch kannst du nicht so viel mit anfangen; für die Bearbeitung/Fehlerprüfung/Adressierung etc. von UTF-8 Strings ist eine Byteweise In-/Dekrementierung erforderlich.



  • @ BBBB: Ich habe das ganze unter Linux geschrieben und getestet, die Ausgabe kann ich nicht überprüfen, da die Strings nach der Änderung ja zu verschwinden scheinen. Ich habe mich mittlerweile ein wenig belesen, wie Unicode aufgebaut ist und denke nun darüber nach, wie ich den hexadezimalen Code, der vorhanden ist, günstig in Unicode konvertieren kann.

    Ich sehe den ausgegebenen String weder auf der Konsole, noch in einer Datei (Hexeditor, normaler Editor,...).

    Mir geht es darum, aus den Hex-Abfolgen eine Textdatei im Unicode-Format zu machen. Leider gebe ich die Strings nicht von Hand ein, sondern lese sie aus. Es entstehen also Strings wie "xA72", die in der Ausgabe als entsprechendes Symbol dargestellt werden sollen. Wie kann ich die entsprechende Zuordnung korrekt durchführen?

    EDIT: Ich habe mir gerade http://www.utf8-zeichentabelle.de/unicode-utf8-table.pl?start=1024&number=1024&utf8=dec angeschaut - sollte ich die hex-Unicode-Sachen jetzt einfach in zwei-Byte-Blöcken ordnen und dann hoffen, dass ich die korrekten Sachen sehe?

    Letzter EDIT: Ich habe mich gestern etliche Stunden mit dem Aufbau des Unicodes beschäftigt und letztenendes einen Konverter fertig bekommen - Empfänger für die resultierenden Zeichen ist nur wirklich ein Char-Array, da ich beim wchar_t nicht wusste, wie ich die einzelnen Bytes ansprechen sollte.


Anmelden zum Antworten