Naprej Nazaj Kazalo

6. Kaj storiti, da se bodo vaši programi "zavedali" standarda Unicode

6.1 C/C++

C-jevski tip `char' je 8-bitni in bo tak tudi ostal, ker je tolikšna najmanjša naslovljiva podatkovna enota. Na voljo je več pripomočkov:

Za običajno ravnanje z besedilom

Standard ISO/ASCII obsega v skladu z dopolnili iz leta 1995 tip "širokega znaka" (angl. "wide character") `wchar_t', nabor "dvojnikov" funkcij iz <string.h> in <ctype.h> (deklarirane so v <wchar.h> in <wctype.h>) in nabor funkcij za pretvorbo iz enega tipa v drugega (deklarirane so v <stdlib.h>).

Dobre reference za ta programerski vmesnik so

Prednosti uporabe tega programerskega vmesnika:

Pomanjkljivosti tega programerskega vmesnika:

Opombe o prenosljivosti

Tip `wchar_t' je lahko ali pa tudi ne kodiran po Unicode. To je odvisno od sistema in včasih tudi od nastavitev locale. Enako velja za kodiranje večzložne sekvence `char *' po UTF-8.

Podrobneje o tipu 'wchar_t pravi Single Unix specification tole : Vse kode za "široke" znake v danem procesu so sestavljene iz enakega števila bitov. To je v nasprotju z znaki, ki so lahko sestavljeni iz spremenljivega števila zlogov. Zlog ali zaporedje zlogov, ki predstavlja znak, je lahko predstavljen tudi kot koda "širokega" znaka. Kode "širokih" znakov tako omogočajo uniformno velikost za ravnanje s tekstovnimi podatki. Koda "širokega" znaka, pri kateri so vsi biti enaki 0, je znak 'null' za "široke" znake in označuje konec niza iz "širokih" znakov. Vrednost "širokega" znaka za vsakega člana prenosnega nabora znakov (tj. ASCII) bo enaka svoji vrednosti, ko se jo uporabi kot osamljen znak v celoštevilski znakovni konstanti. Kode "širokih" znakov za druge znake so odvisne od locale in od izvedbe. Zlogi za stanje premika nimajo predstavitve med "širokimi" znaki.

Posledica tega je, da v prenosljivih programih ne smete uporabljati ne-ASCII znakov v konstantnih nizih. To pomeni, da četudi poznate kodi Unicode za dvojni narekovaj (U+201C in U+201D), v programih v jeziku C ne smete zapisati niza "\u201cLep pozdrav,\u201d je rekel" ali "\xe2\x80\x9cLep pozdrav,\xe2\x80\x9d" je rekel". Namesto tega uporabite GNU gettext in isto stvar napišite kot gettext("'Lep pozdrav,' je rekel") in naredite zbirko podatkov sporočil sl.po, ki "'Lep pozdrav,' je rekel" prevede v "\u201cLep pozdrav,\u201d je rekel".

Sledi prikaz prenosljivosti pripomočkov za ISO/ANSI C med različnimi vrstami Unixa. GNU glibc-2.2 podpira vse izmed njih, trenutna slika pa je taka.

GNU glibc-2.0.x, glibc-2.1.x

AIX 4.3

Solaris 2.7

OSF/1 4.0d

Irix 6.5

HP-UX 11.00

Posledično se priporoča uporaba funkcij wcsr in mbsr, ki ju je mogoče znova pognati in sta primerni za večnitno delovanje, pozabite pa na sisteme, ki teh funkcij nimajo (Irix, HP-UX, AIX), in uporabljajte vtičnico za locale, ki podpira UTF-8 - libutf8_plug.so (gl. spodaj) v sistemih, ki dovoljujejo prevajanje programov, ki uporabljajo ti funkciji wcsr in mbsr (Linux, Solaris, OSF/1).

Podobno svetuje tudi Sun v http://www.sun.com/software/white-papers/wp-unicode/, v razdelku "Internationalized Applications with Unicode":

Za pravilno krajevno prilagoditev programov upoštevajte naslednje napotke:

  1. Izogibajte se neposrednemu dostopu z Unicode. To je opravilo za lokalizacijski del vašega sistema.
  2. Uporabljajte model POSIX za vmesnik do večzložnih in "širokih" znakov.
  3. Uporabljajte samo programerske vmesnike, ki jih pozna lokalizacijski okvir za operacije z jezikovnimi in kulturnimi posebnostmi.
  4. Ostanite neodvisni od nabora znakov.

Če iz takega ali drugačnega razloga v delu programa zares morate predpostaviti, da je `wchar_t' Unicode (npr. če želite posebno obdelavo nekaterih znakov iz Unicode), morate ta kos programa narediti pogojno odvisen od rezultata funkcije is_locale_utf8(). Drugače boste pomešali vedenje programa v različnih localih in sistemih. Funkcija is_locale_utf8 je deklarirana v utf8locale.h in definirana v utf8locale.c.

Knjižnica libutf8

Prenosljiva izvedba programerskega vmesnika ISO/ANSI C, ki podpira 8-bitne in UTF-8 locale, je v libutf8-0.7.3.tar.gz.

Prednosti:

Rešitev pri Plan9

Operacijski sistem Plan9 (zvrst Unixa) uporablja UTF-8 za kodiranje znakov v vseh programih. Njegov tip za "široke" znake se imenuje `Rune' in ne `wchar_t'. Deli njegove knjižnice, avtor je Rob Pike, so dostopni na ftp://ftp.cdrom.com/pub/netlib/research/9libs/9libs-1.0.tar.gz. Podobna knjižnica avtorja Alistairja G. Crooksa je na ftp://ftp.cdrom.com/pub/NetBSD/packages/distfiles/libutf-2.10.tar.gz. V obeh knjižnicah je iskalnik po regularnih izrazih, ki se zaveda UTF-8.

Pomanjkljivost tega programerskega vmesnika:

Za grafični uporabniški vmesnik

V knjižnici Qt-2.0 ( http://www.troll.no/) je razred QString, ki pokriva celoten Unicode. Za pretvarjanje v/iz UTF-8 lahko uporabljate članski funkciji QString::utf8 in QString::fromUtf8. Funkcij QString::ascii in QString::latin1 se ne bi smelo več uporabljati.

Za naprednejše ravnanje z besedilom

Prej omenjene knjižnice izvedejo različice konceptov ASCII, ki se zavedajo Unicoda. Zdaj pa si oglejmo še knjižnice, ki imajo opravka s konceptom Unicode, npr. tretji tip črk (različen od malih in velikih črk), ločevanje slovničnih znamenj in simbolov, kanonična razgradnja, kombiniranje razredov, kanonično urejanje ipd.

ucdata-2.4

Knjižnica ucdata ( http://crl.nmsu.edu/~mleisher/ucdata.html) avtorja Marka Leisherja se ukvarja z lastnostmi znakov, pretvorbo iz malih v velike črke in nazaj, razstavljanjem in kombiniranjem razredov. Pridružen mu je tudi paket ure-0.5 ( http://crl.nmsu.edu/~mleisher/ure-0.5.tar.gz) za izvajanje regularnih izrazov pod Unicode.

ustring

Knjižnica za C++ ustring ( http://ustring.charabia.net/) avtorja Rodriga Reyesa se ukvarja z lastnostmi znakov, pretvorbo iz velikih v male črke in nazaj, razstavljanjem, kombiniranjem razredov in obsega še izvajalnik regularnih izrazov za Unicode.

ICU

ICU pomeni International Components for Unicode ( http://oss.software.ibm.com/icu/, glejte tudi http://oss.software.ibm.com/icu/icuhtml/API1.5/). Zelo obsežna knjižnica podjetja IBM za internacionalizacijo s podporo nizom po Unicode, združevanju sredstev, oblikovanju številk, časa in datuma, sporočilom, povzemanju itd. Podprtih je veliko localov. Prenosljiva je v Unix in Win32, vendar se do konca (brez potrebnih naknadnih popravkov) prevede le pri libc6 v Linuxu, ne pa pri libc5.

libunicode

Gnomova knjižnica libunicode ( http://cvs.gnome.org/lxr/source/libunicode/) avtorja Toma Tromeyja in drugih pokriva pretvorbo iz enega nabora znakov v drugega, lastnosti znakov in razstavljanje.

Za pretvarjanje

Na voljo sta dve vrsti knjižnic za pretvorbo, ki podpirata UTF-8 in precej 8-bitnih naborov znakov:

iconv

Izvedba knjižnice avtorja Ulricha Drepperja je v GNU glibc-2.1.3 ( ftp://ftp.gnu.org/pub/gnu/glibc/glibc-2.1.3.tar.gz). Priročniške strani so na ftp://ftp.win.tue.nl/pub/linux-local/manpages/man-pages-1.29.tar.gz.

Prenosljiva izvedba avtorja Bruna Haibla je na ftp://ftp.ilog.fr/pub/Users/haible/gnu/libiconv-1.3.tar.gz.

Prenosljiva izvedba avtorja Konstantina Čugejeva ( joy@urc.ac.ru) pa je na voljo na ftp://ftp.urc.ac.ru/pub/local/OS/Unix/converters/iconv-0.4.tar.gz.

Prednosti:

librecode

Librecode avtorja Françoisa Pinarda se dobi na naslovu ftp://ftp.gnu.org/pub/gnu/recode/recode-3.5.tar.gz.

Prednosti:

Pomanjkljivosti:

ICU

ICU pomeni International Components for Unicode in se ga dobi na http://oss.software.ibm.com/icu/ (glej tudi http://oss.software.ibm.com/icu/icuhtml/API1.5/). Knjižnica IBM za internacionalizacijo ima tudi orodja za pretvorbo, ki so deklarirana v `ucnv.h'.

Prednosti:

Pomanjkljivosti:

Drugi pristopi

libutf-8

Libutf-8 avtorja G. Adama Stanislava ( adam@whizkidtech.net) obsega nove funkcije za sprotno pretvorbo v/iz po UTF-8 kodiranih tokov `FILE*'. Dobite jo na http://www.whizkidtech.net/i18n/libutf-8-1.0.tar.gz.

Prednosti:

Pomanjkljivosti:

6.2 Java

Java ima podporo Unicodu že vgrajeno v jezik. Tip 'char' predstavlja znak po Unicode, razred `java.lang.String' pa predstavlja niz, sestavljen iz znakov Unicode.

Java lahko skozi svoj okenski sistem AWT prikaže katerikoli znak iz Unicode, če: 1. ustrezno nastavite Javino sistemsko lastnost "user.language", 2. so definicije pisav /usr/lib/java/lib/font.properties.jezik ustrezno nastavljene, 3. so nameščene pisave, ki so določene v tej datoteki. Da bi lahko npr. prikazali japonske znake, morate najprej namestiti japonske pisave in pognati "java -Duser.language=ja ...". Mogoče je kombinirati nabore pisav: če želite hkrati prikazati zahodnoevropske, grške in japonske znake, morate narediti kombinacijo datotek "font.properties" (pokriva ISO-8859-1), "font.properties.el" (pokriva ISO-8859-7) in "font.properties.ja" v eno datotek. ??To ni preizkušeno??

Vmesnika java.io.DataInput in java.io.DataOutput zajemata metodi `readUTF' in `writeUTF'. Upoštevajte pa, da ne uporabljata UTF-8. Namesto tega uporabljata spremenjeno kodiranje UTF-8: znak NUL je kodiran kot dvozložno zaporedje 0xC0 0x80 namesto 0x00 in zlog 0x00 se doda na koncu. V tako kodiranih nizih so lahko znaki NUL in kljub vsemu ni treba, da se jim na začetek doda polje length. Zato lahko z njimi manipulirajo tudi Cjevske funkcije iz <string.h>, npr. strlen() in strcpy().

6.3 Lisp

Standard Common Lisp določa dva znakovna tipa: `base-char' in `character'. Podpora Unicode je odvisna od izvedbe. Jezik določa tudi parameter za ključno besedo `:external-format' v `open' kot logično mesto za določanje nabora znakov ali kodiranja.

Med brezplačnimi izvedbami Common Lispa samo CLISP ( http://clisp.cons.org/) podpira Unicode. Potrebujete različico CLISPA iz marca 2000 ali novejšo ( ftp://clisp.cons.org/pub/lisp/clisp/source/clispsrc.tar.gz). Tipa `base-char' in `character' sta ekvivalentna 16-bitnemu Unicode. Funkciji char-width in string-width omogočata programerski vmesnik, primerljiv z wcwidth() in wcswidth(). Kodiranje za vhodno izhodne operacije datotek, cevi ali omrežnih priključkov se lahko določi prek parametra `:external-format'. Kodiranja za tty in privzeta kodiranja za datoteke, cevi ali omrežne priključke so odvisna od locale.

Med komercialnimi izvedbami Common Lispa:

LispWorks ( http://www.xanalys.com/software_tools/products/) podpira Unicode. Tip `base-char' je enakovreden ISO-8859-1, tip `simple-char' (podtip tipa `character') vsebuje vse znake iz Unicode. Kodiranje za vhod/izhod datotečnih operacij se lahko določi prek parametra `:external-format', npr. '(:UTF-8)'. Omejitve: kodiranja ni mogoče uporabljati za vhodno izhodne operacije omrežnih priključkov. Z urejevalnikom ni mogoče urejati datotek, kodiranih po UTF-8.

Eclipse ( http://www.elwood.com/eclipse/eclipse.htm) podpira Unicode. Oglejte si http://www.elwood.com/eclipse/char.htm. Tip `base-char' je enakovreden ISO-8859-1, tip `character' pa zajema vse znake Unicode. Kodiranje za vhodno izhodne operacije nad datotekami se lahko določi s kombinacijo parametrov `:element-type' in `:external-format' k `open'. Omejitve: funkcije za lastnosti znakov so odvisne od locale. V izvirnih in prevedenih izvirnih datotekah ne more biti konstantnih nizov z znaki iz Unicode.

Komercialna izvedba Common Lispa Allegro CL bo podpirala Unicode v prihajajoči različici 6.0.

6.4 Ada95

Ada 95 je bila izdelana za podporo Unicode in standardna knjižnica Ada95 pozna posebna podatkovna tipa Wide_Character in Wide_String za ISO 10646-1 kot tudi številne pridružene funkcije. Prevajalnik GNU Ada95 (gnat-3.11 ali novejši) podpira UTF-8 kot zunanje kodiranje širokih znakov. To vam omogoča uporabo UTF-8 tako v izvirni kodi kot tudi v vhodno/izhodnih operacijah programov. Da v programu sprožite to možnost, uporabite "WCEM=8" v nizu FORM, ko odpirate datoteko in vklopite stikalo "-gnatW8" prevajalnika, če je izvirna koda kodirana po UTF-8. Podrobnosti si oglejte v referenčnih priročnikih za GNAT ( ftp://cs.nyu.edu/pub/gnat/) in Ada95 ( ftp://ftp.cnam.fr/pub/Ada/PAL/userdocs/docadalt/rm95/index.htm).

6.5 Python

Python 2.0 ( http://starship.python.net/crew/amk/python/writing/new-python/new-python.html) bo podpiral Unicode. Imel bo tudi podatkovni tip `unicode', ki bo predstavljal niz v Unicode, modul `unicodedata' za lastnosti znakov in nabor pretvornikov za najpomembnejša kodiranja. Podrobnosti si oglejte na http://starship.python.net/crew/lemburg/unicode-proposal.txt.

6.6 JavaScript/ECMAscript

Od Javascripta različice 1.3 naprej so nizi vedno kodirani po Unicode. Znakovnega tipa ni, lahko pa uporabljate označbo \uXXXX za znake iz Unicode znotraj nizov. Ne opravi se nobena notranja normalizacija, zato se pričakuje sprejem Unicode Normalization Form C, ki ga priporoča W3C. Za podrobnosti si oglejte http://developer.netscape.com/docs/manuals/communicator/jsref/js13.html#Unicode in http://developer.netscape.com/docs/javascript/e262-pdf.pdf za popolno specifikacijo ECMAscript.

6.7 Tcl

Tcl/Tk je začel uporabljati Unicode kot osnovni nabor znakov v različici 8.1. Njegova notranja predstavitev nizov je UTF-8. Podpira označevanje \uXXXX za znake iz Unicode. Oglejte si http://dev.scriptics.com/doc/howto/i18n.html.

6.8 Perl

Perl 5.6 notranje shranjuje nize v zapisu UTF-8, če na začetku skripta vnesete

use utf8;
length() vrne število znakov v nizu. Če vas zanimajo podrobnosti, si oglejte Perl-i18n FAQ na naslovu http://rf.net/~james/perli18n.html.


Naprej Nazaj Kazalo