Naprej Nazaj Kazalo

6. Kaj narediti, 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 s tekstom

Standard ISO/ASCII vsebuje 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 med tipoma (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 sekvence `char *' po UTF-8.

Podrobneje o tipu 'wchar_t pravi Single Unix specification tole : Vse kode za "široke" znake v danem procesu se sestojijo iz enakega števila bitov. To je v nasprotju z znaki, ki se lahko sestojijo 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, kjer 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 (t. j. ASCII) bo enaka svoji vrednosti, ko se jo uporabi kot osamljen znak v celoštevilski znakovni konstanti. Kode "širokih" znakov za ostale 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 Unicode kodi za dvojni narekovaj (U+201C in U+201D), v programih v jeziku C ne smete zapisati niza L"\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 podatkovno bazo 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 takšna.

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 ponovno pognati in sta primerni za večnitno delovanje, pozabite pa na sisteme, ki teh funkcij nimajo (Irix, HP-UX, AIX) in uporabljate vtičnico za locale, ki podpira UTF-8 - libutf8_plug.so (gl. spodaj) na 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 lokalizacijo 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 kakršnega koli 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(). Sicer boste pomešali obnašanje 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, se nahaja 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 se nahaja na ftp://ftp.cdrom.com/pub/NetBSD/packages/distfiles/libutf-2.10.tar.gz. Obe knjižnici vsebujeta iskalnik po regularnih izrazih, ki se zaveda UTF-8.

Pomanjkljivost tega programerskega vmesnika:

Za grafični uporabniški vmesnik

Knjižnica Qt-2.0 ( http://www.troll.no/) vsebuje 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 s tekstom

Prej omenjene knjižnice izvedejo Unicoda zavedajoče se različice konceptov ASCII. Sedaj 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 med slovničnimi znamenji in simboli, 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 med malimi in velikim črkami, 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

Knižnica za C++ ustring ( http://ustring.charabia.net/) avtorja Rodriga Reyesa se ukvarja z lastnostmi znakov, pretvorbo med velikimi in malimi črkami, razstavljanjem, kombiniranjem razredov in vključuje š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/). IBMova zelo obsežna knjižnica za internacionalizacijo s podporo za nize po Unicode, združevanje sredstev, oblikovanje številk, časa, datuma, sporočil, povzemanje itd. Podprtih je veliko localov. Prenosljiva je na Unix in Win32, vendar se do konca (brez potrebnih naknadnih popravkov) prevede le pri libc6 na Linuxu, ne pa pri libc5.

libunicode

Gnomova knjižnica libunicode ( http://cvs.gnome.org/lxr/source/libunicode/) avtorja Toma Tromeya in ostalih pokriva pretvorbo med nabori znakov, lastnosti znakov in razstavljanje.

Za pretvarjanje

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

iconv

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

Prenosljiva izvedba avtorja Bruna Haibla se nahaja 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/ (glejte tudi http://oss.software.ibm.com/icu/icuhtml/API1.5/). IBMova knjižnica za internacionalizacijo ima tudi orodja za pretvorbo, ki so deklarirana v `ucnv.h'.

Prednosti:

Pomanjkljivosti:

Ostali pristopi

libutf-8

Libutf-8 avtorja G. Adama Stanislava ( adam@whizkidtech.net) vsebuje 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 za Unicode že vgrajeno v jezik. Tip 'char' predstavlja znak po Unicode in razred `java.lang.String' 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šcene pisave, ki so določene v tej datoteki. Da lahko npr. prikažete 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 vsebujeta 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. Tako kodirani nizi lahko vsebujejo znake NUL in kljub vsemu ni potrebno, 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 za 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 z 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 mrežnih priključkov se lahko določi preko parametra `:external-format'. Kodiranja za tty in privzeta kodiranja za datoteke, cevi oz.mrež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 ekvivalenten 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 preko parametra `:external-format', npr. '(:UTF-8)'. Omejitve: kodiranje se ne more uporabljati za vhodno izhodne operacije omrežnih priključkov. Z urejevalnikom ni mogoče urejati po UTF-8 kodiranih datotek.

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 vsebuje 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. Izvorne in prevedene izvorne datoteke ne morejo vsebovati konstantnih nizov z znaki iz Unicode.

Komercialna izvedba Common Lispa Allegro CL bo vsebovala podporo za 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 zunaje kodiranje širokih znakov. To vam omogoča uporabo UTF-8 tako v izvorni kodi kot tudi v vhodno/izhodnih operacijah programov. Da v programu aktivirate to možnost, uporabite "WCEM=8" v nizu FORM, ko odpirate datoteko in vklopite prevajalnikovo stikalo "-gnatW8", če je izvorna koda kodirana po UTF-8. Za podrobnosti si oglejte referenčna priročnika 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 vseboval podporo za 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. Za podrobnosti si oglejte 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 pričel uoporabljati 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. Za podrobnosti si oglejte Perl-i18n FAQ na naslovu http://rf.net/~james/perli18n.html.


Naprej Nazaj Kazalo