Unicode und UTF

  • Allgemein

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Unicode und UTF

    Hallo,

    Ich habe ein Bytearray, welches ich nach Strings durchsuchen will. Dabei weiß ich nicht, ob es sich innerhalb des Arrays um ASCII oder Unicode handelt (oder gemischt). Außerdem weiß ich nicht, ob Unicode in UTF8, 16 oder 32 vorliegt.

    Wie kann man da am besten vorgehen?

    PS: Wieso kann man bei System.Text.Encoding kein UTF16 wählen, nur UTF7?
    Für ein Mindestmaß an Rechtschreibung, Interpunktion und Majuskeln!

    bla schrieb:

    Außerdem weiß ich nicht,
    Das ist ganz ganz schlecht. ;(
    Wenn die Bytes gemischter Kultur sind, sehe ich wenig Chancen, das zu lesen.
    Wenn das Unicode ist und nicht gerade chinesisch oder solch fernöstliche Sprachen ist (praktisch) jedes 2. Byte Null. Da musst Du nur loch testen, ob big oder little endian.
    Die Ansi-Codes kannst Du nur nach Verdacht encoden (englisch, westeuropäisch, kyrillisch) und testen, ob was sinnvolles bei rauskommt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    bla schrieb:

    PS: Wieso kann man bei System.Text.Encoding kein UTF16 wählen, nur UTF7?
    UTF-16 wird nochmals in zwei Teile aufgeteilt, Little- und Big Endian.
    BigEndianUnicode = UTF-16BE
    Was mit Little Endian (also UTF-16LE) ist weiß ich auch nicht genau, sollte aber mit Unicode gehen.
    Ok,
    Es reicht, wenn nur die Standartzeichen gefunden werden (a-Z!?123.[)
    Beispiel "hallo" (mit System.Text.Encoding ausprobiert)

    ASCII/UTF7/UTF8: 104;97;108;108;111
    Unicode: 104;0;97;0;108;0;108;0;111;0;
    UTF32: 104;0;0;0;97;0;0;0;108;0;0;0;108;0;0;0;111;0;0;0

    Wie sieht denn UTF 16 aus? Mit 2x 0er-Bytes angehängt?

    Könnte ich dann das Bytearray durchlaufen, schauen, ob 4x 0er-Bytes nacheinanderkommen und dann weiß ich, dass dann ein neues Wort beginnt? Dort lösch ich dann die 0er-Bytes heraus und bekomme ein Wort?!
    Für ein Mindestmaß an Rechtschreibung, Interpunktion und Majuskeln!
    ein neues Wort beginnt nicht hinter einem 0-Byte. Sondern hinter einem Space-Char oder Tab-Char oder NewLine oder Interpunktion.

    Aber was du machen kannst, ist: einfach alle 0-Bytes weghauen, und dann mw mit encoding.Ascii decodieren.

    Es ist und bleibt hanebüchen, und mit ü und ö wirds Ärger geben.

    bla schrieb:

    UTF 16
    hat vorn dran entweder &HFF, &HFE oder &HFE, &HFF als Kennung für Big bzw. little endian.
    Die Zuordnung musst Du bitte mal nachschlagen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Normalerweise liegen da die Daten als ANSI-Format oder Unicode-String vor, nicht als Byte-Array, wenn das nicht extra so spezifiziert wird. In .Net liegen Strings in Unicode vor, d.h. jeder Buchstabe außer Surrogaten-Paare ist 2 Byte lang. Surrogaten-Paare werden aber ebenfalls als zwei getrennte Buchstaben aufgefasst. Bei den meisten Programmen geht man auch davon aus, dass das Encoding Unicode ist, wenn es nicht .Net ist; da gibt's allerdings Ausnahmen.
    Ansonsten müsste das Format eben von der Zielanwendung bereitgestellt werden, da eben alle Möglichen Byte-Kombinationen in Strings quasi möglich wären und ohne eindeutige Angabe des Formats die Bestimmung nicht möglich ist.

    Gruß
    ~blaze~