Durch Hexeditor UTF8 oder UTF16 erkennen?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Siehe dazu:

https://de.wikipedia.org/wiki/UTF-8#Algorithmus

und

https://de.wikipedia.org/wiki/UTF-16#Kodierung

---------------------------------------------

ist es richtig, dass UTF-8 von 0x00 bis 0x7F geht und UTF-16 von 0x00 bis 0xFF

Nein.

UTF16 geht erstmal von 0x0000 bis 0xFFFF, verwendet also zwei Bytes für jedes Zeichen. (Achte hierbei darauf, dass UTF16 sowohl als LE als auch als BE kodiert vorliegen kann.)

Bei UTF8 siehts etwas anders aus. Hier verrät die Anzahl der gesetzten Bits auf der "linken Seite" des ersten Bytes, ob das Zeichen mit einem, zwei, drei oder ganzen vier Bytes codiert wurde (und das für jedes Zeichen separat).

Beispiel "ä":

  • UTF16 BE: 0x00E4
  • UTF16 LE: 0xE400
  • UTF8: 0xC3A4

Vielen Dank, den Teil von utf 8 versteh ich aber nicht ganz, also mit der linken Seite, ist damit C3 allein gemeint oder könntest du mir da ein Beispiel geben wie man vom Binärwert von ä auf UTF 8 und UTF 16 kommt?

0
@lkeyz

Es beginnt damit, dass der Unicode-Zeichencode für "ä" 228 (0xE4 in Hexadezimal, 0b11100100 in Binär) ist.

Da in UTF16 Zeichencodes von 0 (0x0000, 0b0000000000000000) bis 65535 (0xFFFF, 0b1111111111111111) verwendet werden können, kommt es bei der codierten Darstellung nur darauf an, ob in LE (Little Endian; befrage dazu ggf. Google) oder BE (Big Endian) codiert wird.

Bei UTF8 wirds etwas komplizierter:

Zeichencodes von 0 (0x00) bis 127 (0x7F) können in einem einzigen Byte codiert werden, da das "vorderste" Bit den Wert 0 hat. (Hier liegt vermutlich auch die Ursache für deine Annahme mit 0x7F.)

Liegt der Zeichencode bei höher als 127, dann muss er in mehreren Bytes codiert werden, wobei die Bytes jeweils mit einer Folge von 1en abgeschlossen von einer 0 beginnen.

Wenn nun das erste Byte einer Sequenz mit den Bits 110 beginnt, dann bedeutet das: "Dieses Byte und das darauffolgende stellen zusammen ein Zeichen dar." (Hierbei muss das zweite Byte mit 10 beginnen.)

Also weiter mit dem "ä": Der blanke Zeichencode 0b11100100 beginnt mit einer 1, muss also in mindestens zwei Bytes codiert werden.

Wir nehmen also den Zeichencode und führen ein bitweises Und mit 0b00111111 durch, um definitiv die beiden ersten Bits auf 0 zu haben:

    0b11100100
UND 0b00111111
 =  0b00100100

Jetzt noch ein bitweises Oder mit 0b10000000, um den Präfix zu setzen:

     0b00100100
ODER 0b10000000
  =  0b10100100

Bedeutet: Das letzte Byte der Sequenz hat den Wert 0b10100100 (0xA4).

Jetzt brauchen wir aber noch die 11, die beim blanken Zeichencode ganz vorne dran war.

Die packen wir nun ganz ans Ende des vorletzten Bytes der Sequenz und erhalten 0b00000011.

Da wir hier keine 1 vorne haben, können wir direkt mit dem Präfix weitermachen:

     0b00000011
ODER 0b11000000
  =  0b11000011

Das vorletzte Byte hat also den Wert 0b11000011 (0xC3).

Vom Zeichencode ist nichts mehr zu codieren übrig, also lautet das codierte Ergebnis: 0xC3A4.

0
@Isendrak

Vielen, vielen Dank, das war die beste Erklärung dazu, die ich je gelesen habe! Dürfte ich dir vielleicht noch eine PN mit einer letzten Frage stellen?

0
@lkeyz

Wozu denn ne PN? o.O

Kannst doch auch hier machen.

0

Was möchtest Du wissen?