Ljudje v različnih deželah zapisujejo svojo materinščino z različnimi črkopisi. Dandanes je večina aplikacij, skupaj s sistemi za elektronsko pošto in spletnimi brskalniki, čisto 8-bitna, kar pomeni, da lahko pravilno prikažejo besedilo, če je napisano v enem izmed 8-bitnih naborov znakov, npr. ISO-8859-1 ali ISO-8859-2.
Po svetu je v rabi precej več kot 256 znakov, pomislite samo na cirilico, hebrejščino, arabščino, kitajščino, japonščino, korejščino in tajščino, še vedno pa tu in tam uvedejo tudi kak nov znak. Uporabnik lahko naleti na naslednje težave:
Rešitev te težave je sprejetje po vsem svetu uporabnega nabora znakov. Tak
nabor znakov se imenuje Unicode
(
http://www.unicode.org/).
Če vas zanimajo podrobnosti o Unicode, vtipkajte `man 7 unicode
' (to je
priročniška stran, zajeta v paketu man-pages-1.20).
Unicode resda lahko odpravi probleme različnih kodnih strani, prinese pa tehnično težavo: kako zapisati znake Unicode z 8-bitnimi zlogi? 8-bitni zlog je pri večini računalnikov najmanjša naslovljiva enota in tudi osnovna enota pri omrežnih povezavah prek protokola TCP/IP. Uporaba enega zloga za predstavitev enega znaka je zgodovinsko naključje, predvsem posledica dejstva, da se je razvoj računalništva začel v Evropi in ZDA, kjer je 96 znakov zadostovalo za dolgo vrsto let.
V osnovi poznamo štiri načine kodiranja znakov Unicode v zloge:
128 znakov se kodira z uporabo enega zloga (znaki ASCII).
1920 znakov se kodira z uporabo dveh zlogov (rimski, grški, cirilični,
koptski, armenski, hebrejski in arabski znaki).
63488 znakov se kodira z uporabo treh znakov (med drugim kitajski in
japonski znaki).
Preostalih 2147418112 znakov (ki še niso povsem določeni) se lahko kodira z
uporabo 4, 5 ali 6 zlogov.
Če vas podrobneje zanima UTF-8, vtipkajte `man 7 utf-8
' (priročniška
stran, ki je del paketa ldpman-1.20).
Vsak znak je predstavljen z dvema zlogoma. Tako kodiranje lahko predstavi le prvih 65536 znakov iz Unicode.
To je razširitev UCS-2, ki lahko predstavi 1112064 znakov iz Unicode. Prvih 65536 znakov je predstavljenih z dvema zlogoma, drugi s štirimi.
Vsak znak je predstavljen s štirimi zlogi.
Prostorske zahteve za kodiranje besedil v primerjavi s trenutno rabljenimi (8-bitni za evropske jezike, več za kitajščino/japonščino/korejščino) so razvidne iz spodnjega opisa. Pri tem gre za porabo prostora na disku in hitrost prenašanja po omrežju, če ni uporabljena nobena oblika stiskanja.
Nobene spremembe za US ASCII, samo nekaj odstotkov več za ISO-8859-1, 50 % več za kitajske, japonske ali korejske znake, 100 % več za grške in cirilične znake.
Nobene spremembe za kitajske, japonske ali korejske znake. 100 % več za US ASCII, ISO-8859-1, ISO-8859-2, grške in cirilične znake.
100 % več za kitajske, japonske ali korejske znake. 300 % več za US ASCII, ISO-8859-1, ISO-8859-2, grške in cirilične znake.
Ker uporaba UCS-2, UTF-16 in UCS-4 "prizadene" evropske in severnoameriške uporabnike, se ne zdi verjetno, da bi bili omenjeni načini kodiranja kdaj sprejeti za široko rabo. Microsoftov programerski vmesnik Win32 podpira UCS-2 vsaj od leta 1995, vendar tako kodiranje še ni bilo splošno sprejeto, saj npr. na Japonskem še vedno prevladuje SJIS.
Po drugi strani se zdi, da ima UTF-8 svetlejšo prihodnost, kar zadeva široko rabo, ker ne "kaznuje" evropskih in severnoameriških uporabnikov in ker precej programov za urejanje besedil sploh ne bo treba zamenjati zaradi podpore UTF-8.
V nadaljevanju bomo opisali, kako si nastavite sistem Linux, da bo besedila kodiral po UTF-8.
Microsoftov pristop Win32 razvijalcem olajša izdelovanje različic programov, ki
podpirajo Unicode. Na začetku programa je treba vnesti
#define UNICODE
in potem tako dolgo spreminjati `char
' v
`TCHAR
', dokler se program ne prevede brez opozoril. Težava je v tem,
da na koncu dobite dve različici programa: ena "razume" besedilo, kodirano po UCS-2, ne
"razume" pa 8-bitnih kodiranj, druga pa "razume" samo stara 8-bitna kodiranja.
Še več, pri UCS-2 in UCS-4 nastane še problem vrstnega reda zlogov. Register naborov znakov IANA na naslovu http://www.isi.edu/in-notes/iana/assignments/character-sets pravi o ISO-10646-UCS-2: "zlogi morajo biti podani v omrežnem vrstnem redu: standard tega namreč ne določa". Omrežni vrstni red je "big endian" (najprej zlogi z večjo utežjo, pri arhitekturah, ki temeljijo na Intelu, se uporablja ravno nasproten "little endian", op. pr.). RFC 2152 je še jasnejši: "ISO/IEC 10646-1:1993(E) določa, da je oblika UCS-2 predstavljena v 8-bitnih zlogih tako, da najprej nastopijo zlogi z večjo utežjo". Microsoft pa po drugi strani v svojih razvojnih orodjih C/C++ priporoča uporabo strojno odvisnega vrstnega reda zlogov (npr. "little endian" pri procesorjih x86) in/ali oznako za vrstni red zlogov na začetku dokumenta ali neke vrste statistično hevristiko(!).
Pristop UTF-8 po drugi strani ohrani `char*
' kot standarden tip za
nize v jeziku C. Rezultat tega je, da bo vaš program obravnaval besedilo US ASCII
ne glede na vse spremenljivke okolja in bo prepoznal besedilo, kodirano tako po
ISO 8859-1 ali UTF-8, če je spremenljivka okolja LANG nastavljena pravilno.
Markus Kuhn redno vzdržuje seznam virov dodatnih informacij:
Roman Czyborra ima stran s pregledom programov, ki podpirajo Unicode, UTF-8: http://czyborra.com/utf/#UTF-8
Zgledi datotek, kodiranih po UTF-8:
iso10646
v paketu trans-1.1.1 Koste Kostisa
ftp://ftp.nid.ru/pub/os/unix/misc/trans111.tar.gz