Home Unicode Unicode en Windows 95 UTF_7 en de 7/8-bits economie

UTF_8

Het idee van de UTF is om alle tekens die met 7-bits uit de voeten kunnen onveranderd te laten qua opslag [meestal in 8-bits] en dat wat meer nodig heeft die 2 maal 8-bits te gunnen. Kortom wij willen geen last hebben van wat zij daar in Oost-Europa en Azië doen. Het systeem wat daarvoor werd ingezet was heel simpel. De getallen direct boven de 127 gebruiken we als adres en aan elk adres kennen we b.v. 256 tekens toe. De lettertekens van Unicode boven de 127 verdelen we in brokken van elk 256 tekens. Komen we dus in onze tekst een [8-bits] teken boven de 127 tegen dan weten we dat het samen met de daaropvolgende 8-bit moet worden geinterpreteerd als een hoog Unicode / ISO 10646 teken. De algorithmes heen en weer zijn de UTF's [Unicode Transformation Format].

Het grote nadeel van deze manier van UTF is dat we nog steeds niet 1-duidig weten of een los byte als ASCII geinterpreteerd moet worden of in combinatie met een adres-byte als Unicode.

UTF was deviced to leave unchanged the 7-bit characters [ASCIII 000-127] and to have those characters that needed it to be stored in a 3-byte coding. In other words, as long as we are not bothered with the characters of Eastern Europe or Asia, it's alright with us.

The system is very easy: the numbers just above 127 will be used for reference purposes and within each address some 256 [at the most] characters will be placed. So split up the above 127 characters of the Unicode space into portions of 64 / 128 / 256. Everytime we find an above 127 value we know we have to combine it with the following byte[s] and interprete this as a 'high' Unicode / ISO 10646 character. The algoritms for encoding and decoding are called the UTF's [Unicode Transformation Format].

A disadvantage of such an encoding/decoding device might be that we won't know for sure when to interprete a loose byte as ASCII and when a combination as Unicode.


UTF-8 komt grotendeels tegemoet aan dat bezwaar en heft de beperking van 16-bits [2 bytes] op:

Aan de eerste bits is te zien in hoeveel bytes het teken is gecodeerd.

Met 4 bytes [en dus 21 bits] zijn ruim 1 miljoen combinaties te maken. En dat zou voldoende moeten zijn, maar theoretisch kunnen we verder!

Er kan geen enkele byte ten onrechte als 'laag'nummer [dus ASCII] worden opgevat omdat het eerste bit altijd '1' is. En wel met een waarde liggend tussen [hexadecimaal] 80 en 7F. Ook is altijd de eerste byte te onderscheiden van de volgende.

The UTF-8 algorithm overcomes most disadvantages. You can tell by the first bits how may bytes will follow.

A 4-byte code [i.e. 21 bits] should be sufficient for a million combinations. An even wider code will give us even more!

Not a single byte can be interpreted as a 'low' or ASCII value as the first bit is always a '1'. The byte-value will never surpass the 80 - 7F [hexadecimal] limits. And also the first byte differs from the rest.


bytes       bits        representatie

     1       7          0vvvvvvv
     2      11          110vvvvv 10vvvvvv
     3      16          1110vvvv 10vvvvvv 10vvvvvv
     4      21          11110vvv 10vvvvvv 10vvvvvv 10vvvvvv
     5      26          111110vv 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv
     6      31          1111110v 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv 10vvvvvv

For the programmers among us / Voor de programmeurs onder ons:

putwchar(c)
{
  if (c < 0x80) {
    putchar (c);
  }
  else if (c < 0x800) {
    putchar (0xC0 | c>>6);
    putchar (0x80 | c & 0x3F);
  }
  else if (c < 0x10000) {
    putchar (0xE0 | c>>12);
    putchar (0x80 | c>>6 & 0x3F);
    putchar (0x80 | c & 0x3F);
  }
  else if (c < 0x200000) {
    putchar (0xF0 | c>>18);
    putchar (0x80 | c>>12 & 0x3F);
    putchar (0x80 | c>>6 & 0x3F);
    putchar (0x80 | c & 0x3F);
  }
}


Hoe zien de UTF-codes er in de praktijk uit? Het zoeken op het Internet leverde enkele bruikbare HTML-files

[met als tag: <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8"> ]

op met tegelijk een goed overzicht van de Poolse ogonki. Het systeem levert voor de hele reeks van lettertekens het volgende op

How do these UTF-codes look like in practice? Searching the Internet for practical HTML-files

[having the <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8"> tag]

I came up with some useful Polish texts. Three bytes cover the following range.


Unicode # bytes bits total
0000 - 0127 1 byte 0vvvvvvv [= 0 -127] 128
0128 - 2175 2 bytes 110vvvvv [= 192-223] 10vvvvvv [= 128-191] 32x64 = 2048
2176 - 67712 3 bytes 1110vvvv [=224-239] 10vvvvvv [=128-191] 10vvvvvv [=128-191] 16x64x64 = 65536

Voor de Poolse ogonki zijn de volgende codes / The Polish ogonki have the following codes:

letterteken / character hexadecimal Unicode
Aogonek C4 84 U+0104
aogonek C4 85 U+0105
Cacute C4 86 U+0106
cacute C4 87 U+0107
Eogonek C4 98 U+0118
eogonek C4 99 U+0119
Lslash C5 81 U+0141
lslash C5 82 U+0142
Nacute C5 83 U+0143
nacute C5 84 U+0144
Oacute C3 93 U+00D3
oacute C3 B3 U+00F3
Sacute C5 9A U+015A
sacute C5 9B U+015B
Zacute C5 B9 U+0179
zacute C5 BA U+017A
Zdot C5 BB U+017B
zdot C5 BC U+017C


De internationale acceptatie [lees: anglosaksische] van Unicode zal van US-ASCII slechts via UTF-8 gaan lopen. UTF-8 is één van de mogelijke UTF's en het kunnen hanteren van UTF-8 is al voor alle vanaf 01.01.1999 te verschijnen mail-programma's 'verplicht'.

It looks like the international acceptance [read: anglosaxon] of Unicode will depend on the acceptance of UTF-8. Although it's just one of the UTF, it has several advantages and leaves US-ASCII unbothered! It's supposed to be obligatory for all new mailers from now onwards.


Vereenvoudigde UTF8 decodering/codering:

Unicode nummer N:

als N < 128 dan één byte P  = N
als N < 2048 en is N =  X * 64  + Y
     met X in [2,31], Y in [0,63] dan twee bytes P, Q
                P =  192 + X    P in  [192, 223]
                Q =  128 + Y    Q in [128, 191]
als N< 65536 en is N  = X * 64 **2 + Y * 64 +Y
     met X  in [0,15], Y in [0,63], Z in [0, 63]dan drie bytes P, Q, R
                P = 224 + X     P in [224, 239]
                Q =128 + Y      Q in [128, 191]
                R = 128 + Z     R in [128, 191]


Copyright © Rein Bakhuizen van den Brink
Last updated on 26 december 2000

Home Unicode Unicode en Windows 95 UTF_7 en de 7/8-bits economie