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:
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:
setlocale(LC_ALL,"");
.Pomanjkljivosti tega programerskega vmesnika:
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.
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:
Č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.
Prenosljiva izvedba programerskega vmesnika ISO/ANSI C, ki podpira 8-bitne in UTF-8 locale, je v libutf8-0.7.3.tar.gz.
Prednosti:
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:
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.
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.
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.
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 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.
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.
Na voljo sta dve vrsti knjižnic za pretvorbo, ki podpirata UTF-8 in precej 8-bitnih naborov znakov:
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 avtorja Françoisa Pinarda se dobi na naslovu ftp://ftp.gnu.org/pub/gnu/recode/recode-3.5.tar.gz.
Prednosti:
Pomanjkljivosti:
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:
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:
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().
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.
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).
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.
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.
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.
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.