unsigned char Array in Unicode String



  • Was steht denn in deinem unsigned char Array drin? Ist das vllt schon UTF 16?
    Wenn das so ist müsste das hier gehen:

    unsigned char displayBuffer[2048] = { ... };
    String vcl_string = reinterpret_cast<wchar_t*>( displayBuffer );
    


  • @Zero01 sagte in unsigned char Array in Unicode String:

    Ich bin auch einen Schritt weiter in meiner Verständnisfrage gekommen. In dem char Array steht an jeder 2. Stelle der Ascii Code des Zeichens und an letzter Stelle eine 0, also ist das ganze demnach 0-terminiert.

    naja im allgemeinen hat man unicode so entwickelt, dass die zeichen 0x00 - 0x7F dem ascii-code entsprechen und weil der 16-bit unicode eben 16 bit breite zeichen hat, haben die ascii-zeichen die tatsächlichen werte 0x0000 - 0x007F. am ende müsstest du übrigens 2 nullen (wegen 0x0000) haben.......



  • Doc, chapeau!

    Kannst du mir bitte erklären warum ein reinterpret_cast nach char* hier nicht funktioniert. Wie eingangs erwähnt, hatte ich diesen Gedanken schon aufgegriffen und getestet. Allerdings gibt er mir beim Cast nach char* immer nur den Anfangsbuchstabe und schneidet dann ab.

    Deine Beispiel funktioniert nun, auch mit Umlauten.



  • @Wade1234

    Genau, am Ende waren es mehrere Nullen. Ojeeee - diese ganze Theorie fehlt mir komplett 😞



  • Ahhh glaube es zu verstehen...... aufgrund der 16 Bit "Breitzeichen" im unsigned char Array hat der cast nach char* nur die ersten 8 Bit berücksichtigt und die darauffolgende und eigentlich zum 16 Bit Zeichen gehörende 0 wie ein Steuerzeichen abschneiden lassen, richtig?



  • im grunde ist das wie mit normalen strings, mit dem unterschied, dass jedes zeichen 2 byte breit ist und daher mehr zeichen dargestellt werden können. wenn du bei windows zeichentabelle eingibst, kannst du dir auch angucken, welches zeichen welcher zahl entspricht.



  • @Zero01 sagte in unsigned char Array in Unicode String:

    Ahhh glaube es zu verstehen...... aufgrund der 16 Bit "Breitzeichen" im unsigned char Array hat der cast nach char* nur die ersten 8 Bit berücksichtigt und die darauffolgende und eigentlich zum 16 Bit Zeichen gehörende 0 wie ein Steuerzeichen abschneiden lassen, richtig?

    das kann gut sein, ja.



  • Wobei man bei UTF-16 noch warnen muss, dass es auch 4 Byte lange Zeichen gibt. Das heißt, dass man in manchen Fällen 2 wchars für ein Zeichen braucht! <rant>UTF-16 ist eigentlich eine bescheuerte Kodierung, die viel komplizierter zu verstehen/implementieren ist als UTF-8 und im Regelfall auch noch mehr Platz verbraucht</rant>



  • @wob sagte in unsigned char Array in Unicode String:

    Wobei man bei UTF-16 noch warnen muss, dass es auch 4 Byte lange Zeichen gibt. Das heißt, dass man in manchen Fällen 2 wchars für ein Zeichen braucht! <rant>UTF-16 ist eigentlich eine bescheuerte Kodierung, die viel komplizierter zu verstehen/implementieren ist als UTF-8 und im Regelfall auch noch mehr Platz verbraucht</rant>

    In Redmond gibt´s bestimmt einige Leute, die das mit dir diskutieren möchten 😉
    Wichtig ist hier aber nur, dass die richtige Überladung des Konstruktors von UnicodeString benutzt wird. Der soll sich dann um die Eigenheiten von UTF16 kümmern. Und da er intern die Windows API benutzt gehe ich davon aus, dass das auch funktioniert.



  • Naja, ob man heute noch auf UTF-16 setzen würde, ist fraglich. Ich glaube eher, dass das inzwischen Konsens ist - aber man kann die Entscheidung ja schlecht Rückgängig machen.

    Und ich halte das Wissen schon für wichtig, weil viele Fehler (auch in diversen Bibliotheken) genau dadurch zustande gekommen sind. Sobald man von Hand das wchar-Array versucht zu manipulieren, schleichen sich leicht Fehler ein.



  • Leute, vielen herzlichen Dank. Ich habe heute eine gute Lektion gelernt und baue darauf weiter auf.


Anmelden zum Antworten