Naprej Nazaj Kazalo

1. Uvod

1.1 Zakaj Unicode?

Ljudje v različnih deželah uporabljajo različne črkopise za predstavitev besed v njihovih maternih jezikih. Dandanes je večina aplikacij, vključno s sistemi za elektronsko pošto in spletnimi brskalniki, čisto 8-bitnih, 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.

Na svetu obstaja 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 se od časa do časa uvede kakšen nov znak. Uporabnik lahko naleti na naslednje probleme:

Rešitev tega problema je sprejetje po vsem svetu uporabnega nabora znakov. Tak nabor znakov se imenuje Unicode ( http://www.unicode.org/). Za več informacij o Unicode vtipkajte `man 7 unicode' (to je priročniška stran, vsebovana v paketu man-pages-1.20).

1.2 Kodiranja po Unicode

Unicode resda lahko odpravi probleme različnih kodnih strani, prinese pa tehnični problem: kako zapisati Unicode znake 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 preko protokola TCP/IP. Uporaba enega zloga za predstavitev enega znaka je zgodovinsko naključje, predvsem posledica dejstva, da se je razvoj računalništva pričel v Evropi in ZDA, kjer je 96 znakov zadostovalo za dolgo vrsto let.

V osnovi obstajajo štirje načini za kodiranje Unicodovih znakov v zloge:

UTF-8

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 drugimi kitajski in japonski znaki). Ostalih 2147418112 znakov (ki še niso povsem določeni) se lahko kodira z uporabo 4, 5 ali 6 zlogov. Za več informacij o UTF-8 vtipkajte `man 7 utf-8' (priročniška stran, ki je del paketa ldpman-1.20).

UCS-2

Vsak znak je predstavljen z dvema zlogoma. Ta način kodiranja lahko predstavi le prvih 65536 znakov iz Unicode.

UTF-16

To je razširitev UCS-2, ki lahko predstavi 1112064 znakov iz Unicode. Prvih 65536 znakov je predstavljenih z dvema zlogoma, ostali s štirimi.

UCS-4

Vsak znak je predstavljen s štirimi zlogi.

Prostorske zahteve za kodiranje besedil v primerjavi s trenutno uporabljanimi (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 krčenja.

UTF-8

Nobene spremembe za US ASCII, samo nekaj odstotkov več za ISO-8859-1, 50% več za kitajske, japonske oz. korejske znake, 100% več za grške in cirilične znake.

UCS-2 in UTF-16

Nobene spremembe za kitajske, japonske oz. korejske znake. 100% več za US ASCII, ISO-8859-1, ISO-8859-2, grške in cirilične znake.

UCS-4

100% več za kitajske, japonske oz. 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 "prizadane" evropske in severnoameriške uporabnike, se ne zdi verjetno, da bi omenjeni načini kodiranja kdaj bili sprejeti za široko uporabo. Microsoftov programerski vmesnik Win32 podpira UCS-2 vsaj od leta 1995, vendar ta način kodiranja še ni bil široko sprejet za uporabo, saj npr. na Japonskem še vedno prevladuje SJIS.

Po drugi strani se zdi, da ima UTF-8 svetlejšo prihodnost pri široki uporabi, ker ne "kaznuje" evropskih in severnoameriških uporabnikov in ker precej programov za urejanje besedil sploh ne bo potrebno zamenjati zaradi podpore za UTF-8.

V nadaljevanju bomo opisali, kako si nastavite vaš sistem Linux, da bo besedila kodiral po UTF-8.

Opombe za programerje v C/C++

Microsoftov pristop Win32 razvijalcem olajša izdelavo različic programov, ki podpirajo Unicode. Na začetku programa je potrebno vnesti #define UNICODE in potem tako dolgo spreminjati `char' v `TCHAR', dokler se program ne prevede brez opozoril. Problem je, da na koncu dobite dve različici programa: ena "razume" po UCS-2 kodiran tekst, ne "razume" pa 8-bitnih kodiranj, druga pa "razume" samo stara 8-bitna kodiranja.

Še več, pri UCS-2 in UCS-4 nastopi š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 obraten "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 se najprej pojavijo 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 US ASCII tekst ne glede na vse spremenljivke okolja in bo prepoznal tekst kodiran tako po ISO 8859-1 ali UTF-8, če je spremenljivka okolja LANG nastavljena pravilno.

1.3 Viri dodatnih informacij

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

Primeri po UTF-8 kodiranih datotek:


Naprej Nazaj Kazalo