UTF-8: Razlika med redakcijama

Izbrisana vsebina Dodana vsebina
UTF-8 prestavljeno na UTF-8/Znaki
 
prestavljeno iz UTF-8/Znaki in popravljen uvod
Vrstica 1:
'''UTF-8''' je eden izmed načinov kodiranje mednarodnega nabora znakov [[unicode]], pri katerem znaki [[ASCII]] ostanejo enozložni, ostali znaki pa lahko zasedajo več zlogov.
#REDIRECT [[UTF-8/Znaki]]
 
== Iz zgodovine ==
 
Nabor je iznašel [[Kenneth Thompson|Kenneth »Ken« Thompson]] [[2. september|2. septembra]] [[1992]] med večerjo s svojim sodelavcem [[Rob Pike|Robom »Commanderjem« Pikom]]. Moža nista bila zadovoljna z izvirnim naborom [[UTF]], ki je temeljil na standardu ISO 10646. Ob obedu si je Thompson zamislil bitno pakiranje (''bit-packing'') novega nabora, ki bi omogočal 16-[[bit]]ne znake. Še isto noč je Thompson napisal [[izvorna koda|kodo]], Pike pa se je silovito poglobil v zapis [[programski jezik C|C]] in grafične knjižnice. Naslednji dan je bila koda pripravljena in začela sta pretvarjati besedilne datoteke v samem sistemu. Od tu naprej so zgodbo pisali drugi, saj se tvorca nista ukvarjala z zgodovino. (''Povzeto po [http://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt Pikovem elektronskem zapisu, 30. april 2003 ]'')
 
Zgled dveh funkcij <tt>wctomb()</tt> in <tt>mbtowc()</tt>, ki kažeta [[algoritem|algoritme]] za obojestransko pretvorbo med tedaj obstoječim sistemom UCS in novim.
 
typedef struct {
int cmask;
int cval;
int shift;
long lmask;
long lval; } Tab;
static Tab tab[] = {0x80,0x00,0*6,0x7F,0, /* 1 byte sequence */
0xE0,0xC0,1*6,0x7FF,0x80, /* 2 byte sequence */
0xF0,0xE0,2*6,0xFFFF,0x800, /* 3 byte sequence */
0xF8,0xF0,3*6,0x1FFFFF,0x10000, /* 4 byte sequence */
0xFC,0xF8,4*6,0x3FFFFFF,0x200000, /* 5 byte sequence */
0xFE,0xFC,5*6,0x7FFFFFFF,0x4000000, /* 6 byte sequence */
0, /* end of table */
};
int mbtowc(wchar_t *p, char *s, size_t n) {
long l;
int c0, c, nc;
Tab *t;
if(s == 0)
return 0;
 
nc = 0;
if(n <= nc)
return -1;
c0 = *s & 0xff;
l = c0;
for(t=tab; t->cmask; t++) {
nc++;
if((c0 & t->cmask) == t->cval) {
l &= t->lmask;
if(l < t->lval)
return -1;
*p = l;
return nc;
}
if(n <= nc)
return -1;
s++;
c = (*s ^ 0x80) & 0xFF;
if(c & 0xC0)
return -1;
l = (l<<6) | c;
}
return -1;
}
int wctomb(char *s, wchar_t wc) {
long l;
int c, nc;
Tab *t;
if(s == 0)
return 0;
l = wc;
nc = 0;
for(t=tab; t->cmask; t++) {
nc++;
if(l <= t->lmask) {
c = t->shift;
*s = t->cval | (l>>c);
while(c > 0) {
c -= 6;
s++;
*s = 0x80 | ((l>>c) & 0x3F);
}
return nc;
}
}
return -1;
}
 
== Glej tudi ==
 
* [[UTF-8/Znaki|Seznam znakov v UTF-8]]
 
[[cs:UTF-8]]
[[de:UTF-8]]
[[en:UTF-8]]
[[es:UTF-8]]
[[fr:UTF-8]]
[[ja:UTF-8]]
[[pl:UTF-8]]
[[sv:UTF-8]]