UTF8 |
Maandag, 30 mei 2005 |
UTF8 is wonderlijk.
Het is één codering die de Romeinse letters a-z aan kan, maar ook Russisch, Grieks en Arabisch.
Dat zijn andere letters, maar nog wel alfabetten van vergelijkbare groottes, elk een paar tientallen letters.
Wat me echt verbaast is dat al die tekens op één en dezelfde bladzijde kunnen staan.
Hoe kan dat?
De 256 mogelijke combinaties van de ASCII code houden toch een keertje op?
Het wordt nog bonter als op dezelfde bladzijde ook net zo vrolijk Chinese en Japanse karakters staan, talen met duizenden karakters.
- Hoe werkt UTF8?
- Hoe is het mogelijk dat 1 byte ASCII karakters op één pagina staan met multi byte karakters?
- Hoe kan dat werken?
Hoe werkt die UTF8 codering?
Wie de HTML source van
columbia.edu/kermit/utf8.html
met een ASCII editor bekijkt ziet allemaal vreemde karakters.
Het lijkt wel hexadecimale data, maar hoe is het gecodeerd?
- Zit er voor elk karakter een lengte byte of zo?
Nee, ASCII characters lijken gewoon zichzelf te zijn.
- Waar begint en eindigt een multi byte karakter?
Zit er voor elke serie soortgelijke karakters een start en stop teken?
Nee, niets te ontdekken.
- Hoe kan het dat die codering zo efficiënt is?
Hoe houdt UTF8 de karakters van verschillende lengtes uit elkaar?
Er komen karakters op het scherm zonder dat ik de truuk snap.
Aargh, reutel raheugh, UTF8 is een toverdoos!
De puzzel wordt nog groter.
Het lijkt onmogelijk om de tweede byte van een Japans karakter op een carriage return of een quote x'22' te laten lijken.
Een test PHP scriptje genereert waarden met x'2D' als laatste byte.
Wonderlijk genoeg lijkt UTF8 die gevaarlijke byte waardes over te slaan.
Het lukt niet om een gevaarlijk
karakter op het scherm te krijgen.
Een copy paste van gegenereerde browser tekst naar een hex editor laat geen gevaarlijke waardes zien.
Huh?
Waar is de x'2D' waarde gebleven in de laatste byte?
Deze puzzel moet opgelost worden.
Hoe werkt die codering van UTF8?
Uitleg van UTF8 codering
De
wikipedia verklaart de UTF8 codering.
- ASCII karakters van één byte beginnen altijd met een 0 bit.
- De eerste byte van een karakters met lengte twee begint altijd met de bits 110.
- De eerste byte van een karakters met lengte drie begint altijd met de bits 1110.
- De eerste byte van een karakters met lengte vier begint altijd met de bits 11110.
- Een vervolg byte van een multi byte karakter begint altijd met 10.
Het is daardoor uitgesloten dat een vervolg byte op een carriage return of een quote lijkt.
Deze codering lijkt wat verkwistend met bits maar is
erg zuinig met bytes.
- De meeste ASCII karakters passen in 1 byte.
De grote groep van Engelse teksten heeft dus maar 1 byte per karakter nodig.
- De meest gebruikte multi byte karakters van andere talen passen in twee of drie bytes.
- Alleen de echt weinig gebruikte karakters hebben 4 of meer bytes nodig.
Maar ja, dat is een kleine minderheid.
Conclusie
- UTF8 is dus wonderlijk efficiënt.
- Het lijkt veel op ASCII voor talen met Romeinse karakters en gebruikt slechts 2 bytes per karakter voor de meeste andere talen.
- Het geeft geen problemen met speciale karakters.
Een byte die eruit ziet als een carriage return is ook een carriage return.
Tot
de volgende noot,
Henk Jan Nootenboom
Met grote dank aan de heren van
4uIT voor de UTF8 research.