UTF-8: Razlika med redakcijama

Izbrisana vsebina Dodana vsebina
m Koda ven [glej pogovor]
Vrstica 5:
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 ]'')
 
ZgledV dvehomenjenem funkcijviru <tt>wctomb()</tt>je inzgled <tt>mbtowc()</tt>[[izvorna kode|kode]], ki kažetanakazuje [[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|Seznamseznam znakov v UTF-8]]
 
 
[[cs:UTF-8]]