Unicode Bytelänge

Hallo unicode-Gurus,

Durch die Einführung von Unicode 5.1 sind 1.114.112 Zeichen standardisiert worden. Um all diese Zeichen zu kodieren werden 4 Bytes gebraucht. Ist es nicht möglich, diese Zeichen nur mit 3 Bytes zu kodieren, weil 3 Bytes 24 Bits machen. Daraus ergeben sich 2^24 = 16.777.216 Möglichkeiten. So könnte man doch 1 Byte sparen… Aber wieso werden 4 Bytes genommen?

Gruß

Sniper

Hallo Heckenschütze.

Durch die Einführung von Unicode 5.1 sind 1.114.112 Zeichen
standardisiert worden. Aber wieso werden 4 Bytes genommen?

Die Standardisierung von Datentpen berücksichtigt immer
auch die realen Rechnerarchitekturen, die diese Daten später
speichern sollen. Datenregister in Rechnern gibt es dabei
gewöhnlich nur mit 1, 2 oder 4 Bytes Länge. Da 2 Bytes nicht ausreichen für ein Unicode-Zeichen, muss man also das
nächsthöhere Datenregister zum Speichern verwenden, welches
4 Bytes umfasst.

Siehe z.B. http://de.wikipedia.org/wiki/Register_(Computer)

Gruß,
-Andreas.

Hallo Andreas,

vielen Dank für deine Antwort. Eine Sache ist mir aber noch unklar. In C gibt es z.B. Datentyp char, welcher nur 1-Byte belegt. Wenn man z.B. char str[3] anlegt, so hat man ja auch 3-Bytes belegt. Habe ich etwas falsch verstanden?

Gruß

Sniper

Hallo.

vielen Dank für deine Antwort. Eine Sache ist mir aber noch
unklar. In C gibt es z.B. Datentyp char, welcher nur 1-Byte
belegt. Wenn man z.B. char str[3] anlegt, so hat man ja auch
3-Bytes belegt. Habe ich etwas falsch verstanden?

Die 3 Bytes wandern aber gewöhnlich im Rechner mangels „3-Byte-Register“ in ein 4-Byte-Register. Du verschenkst bei so einem
Datentyp also 1 ganzes Byte.

Sieh Dir die elementaren Datentypen in den verschiedenen Programmiersprachen an, die müssen intern
auf die physikalischen Registergrößen und Busbreiten im Rechner
gemappt werden.

Deshalb wählt der Erfinder der Sprache gleich zu Beginn
passende Größen wie 1 Byte, 2 Bytes, 4 Bytes oder 8 Bytes
für seine Grunddatentypen weil dies dem Hardwareangebot entspricht.

Siehe:
http://www.space.unibe.ch/comp_doc/c_manual/C/CONCEP…
http://de.wikipedia.org/wiki/Wortbreite
http://de.wikipedia.org/wiki/Datentypen#Elementare_D…

Gruß,
-Andreas.

Hallo,

Durch die Einführung von Unicode 5.1 sind 1.114.112 Zeichen
standardisiert worden. Um all diese Zeichen zu kodieren werden
4 Bytes gebraucht. Ist es nicht möglich, diese Zeichen nur mit
3 Bytes zu kodieren, weil 3 Bytes 24 Bits machen. Daraus
ergeben sich 2^24 = 16.777.216 Möglichkeiten. So könnte man
doch 1 Byte sparen… Aber wieso werden 4 Bytes genommen?

Vergiss nicht, dass

  1. die Zeichen nicht am Stück liegen, sondern es zum Teil Lücken zwischen den Codepoints gibt
  2. Unicode keine Zeichenkodierung ist, sondern es verschiedene Kodierungen gibt, die je nach Anwendungsfall praktisch sind:

UTF-8 ist dann praktisch, wenn man ASCII-Kompatibel sein will solange keine Codepoints > 128 auftauchen. Ausserdem ist es sehr platzsparend wenn nur wenige Codepoints > 128 in einem Text sind (typsicher deutscher Text z.B.)
UTF-16 ist sehr praktisch, weil man für fast alle Fälle, die tatsächlich in der freien Wildbahn auftauchen nur zwei Byte braucht um beliebige Zeichen zu kodieren (Ausser man will gerade den Klingonen einen Nachricht schreiben). Das Gleiche gilt für UCS-2.
UTF-32 ist praktisch wenn man immer die gleiche Byte-Breite für jeden Codepoint benutzen will.

Jetzt könnte man anfangen ein UTF-24 zu definieren, aber wegen der erwähnten Registergrößen, die immer Zweierpotenzen sind, wird das kaum einen realen Vorteil gegenüber UTF-32 bieten (Bei der Speicherung kann man ja immer noch komprimieren).

Grüße,
Moritz

Hallo Sniper,

vielen Dank für deine Antwort. Eine Sache ist mir aber noch
unklar. In C gibt es z.B. Datentyp char, welcher nur 1-Byte
belegt. Wenn man z.B. char str[3] anlegt, so hat man ja auch
3-Bytes belegt. Habe ich etwas falsch verstanden?

Nun, was du in C schreibst ist das eine, was die CPU ausführt dann das andere !

Ich kenne keine gebräuchliche CPU, welche Maschinen-Befehle zum Speichern von 3 Byte kennt.
Also muss der Compiler dies mit drei 1-Byte-Zugriffen umsetzten oder ein Füllbyte anlegen um 4-Byte-Zugriffe verwenden zu können.

MfG Peter(TOO)