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 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:
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 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.
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:
Č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.
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:
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:
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.
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.
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.
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 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.
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.
Na voljo sta dve vrsti knjižnic za pretvorbo, ki podpirajo UTF-8 in precej 8-bitnih naborov znakov:
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 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/
(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:
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:
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().
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.
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).
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.
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 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.
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.