Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Windows telefon
  • Koliko karaktera ima unicode tabeli. Unicode na webu: Uvod za početnike

Koliko karaktera ima unicode tabeli. Unicode na webu: Uvod za početnike

Unicode ili Unicode (od engleske riječi Unicode) je standard za kodiranje znakova. Omogućava kodiranje gotovo svih pisanih jezika.

U kasnim 1980-im, uloga standarda je dodijeljena 8-bitnim znakovima. 8-bitna kodiranja su bila predstavljena raznim modifikacijama, čiji je broj stalno rastao. To je uglavnom bio rezultat aktivnog širenja spektra jezika koji se koriste. Postojala je i želja programera da smisle kodiranje koje zahtijeva barem djelomičnu univerzalnost.

Kao rezultat toga, postalo je neophodno riješiti nekoliko problema:

  • problemi sa prikazivanjem dokumenata u pogrešnom kodiranju. To bi se moglo riješiti ili dosljednim uvođenjem metoda za specificiranje korištenog kodiranja, ili uvođenjem jedinstvenog kodiranja za sve;
  • problemi ograničenja paketa znakova, riješeni ili zamjenom fontova u dokumentu, ili uvođenjem proširenog kodiranja;
  • problem pretvaranja kodiranja iz jednog u drugi, za koji se činilo da je moguće riješiti bilo korištenjem posredne transformacije (treće kodiranje) koje uključuje znakove različitih kodiranja, ili kompajliranjem tablica konverzije za svaka dva kodiranja;
  • problemi umnožavanja pojedinačnih fontova. Tradicionalno, pretpostavljalo se da svako kodiranje ima svoj vlastiti font, čak i kada se kodiranja potpuno ili djelomično podudaraju u skupu znakova. Problem je donekle riješen uz pomoć "velikih" fontova iz kojih su potom birani znakovi potrebni za određeno kodiranje. Ali da bi se utvrdio stepen usklađenosti, bilo je potrebno stvoriti jedinstveni registar simbola.

Stoga se na dnevnom redu našlo pitanje potrebe za stvaranjem "širokog" unificiranog kodiranja. Činilo se da je kodiranje promjenjive dužine znakova korišteno u jugoistočnoj Aziji preteško za primjenu. Stoga je naglasak stavljen na korištenje znaka koji ima fiksnu širinu. 32-bitni znakovi su se činili previše glomazni i 16-bitni su na kraju pobijedili.

Standard je internetskoj zajednici 1991. godine predložila neprofitna organizacija "Unicode konzorcijum". Njegova upotreba omogućava kodiranje velikog broja znakova različitih vrsta pisanja. U Unicode dokumentima, ni kineski znakovi, ni matematički simboli, ni ćirilica, ni latinica nisu u neposrednoj blizini. U isto vrijeme, kodne stranice ne zahtijevaju nikakvo prebacivanje tokom rada.

Standard se sastoji od dva glavna odjeljka: univerzalnog skupa znakova (engleski UCS) i porodice kodiranja (u engleskoj interpretaciji - UTF). Univerzalni skup znakova definira nedvosmislenu proporcionalnost kodovima znakova. Kodovi su u ovom slučaju elementi kodne sfere, koji su nenegativni cijeli brojevi. Funkcija familije kodiranja je da definiše mašinski prikaz niza UCS kodova.

U Unicode standardu, kodovi su ocijenjeni u nekoliko područja. Područje sa kodovima koji počinju sa U+0000 i završavaju sa U+007F - uključuje znakove ASCII skupa sa potrebnim kodovima. Dalje se nalaze područja simbola različitih pisama, tehničkih simbola, znakova interpunkcije. Posebna serija kodova se čuva u rezervi za buduću upotrebu. Za ćirilicu su definisana područja znakova sa kodovima: U+0400 - U+052F, U+2DE0 - U+2DFF, U+A640 - U+A69F.

Vrijednost ovog kodiranja u web prostoru neumoljivo raste. Udio web lokacija koje koriste Unicode bio je skoro 50 posto početkom 2010.

Danas ćemo razgovarati s vama o tome odakle dolaze krakozyabri na web-mjestu i u programima, koja kodiranja teksta postoje i koja se trebaju koristiti. Pogledajmo pobliže istoriju njihovog razvoja, počevši od osnovnog ASCII-a, kao i njegovih proširenih verzija CP866, KOI8-R, Windows 1251, pa do modernih kodiranja Unicode konzorcijuma UTF 16 i 8. Sadržaj:

  • Proširene verzije Asuka - CP866 i KOI8-R kodiranja
  • Windows 1251 - varijacija ASCII-a i zašto se pojavljuju greške
Nekima se ova informacija može činiti suvišnom, ali znate koliko pitanja dobijam posebno u vezi s ispuzanim krakozyabrima (nečitljivim skupom znakova). Sada ću imati priliku uputiti sve na tekst ovog članka i samostalno potražiti svoje jambove. Pa, pripremite se da upijete informacije i pokušajte pratiti tok priče.

ASCII - osnovno kodiranje teksta za latinicu

Razvoj kodiranja teksta dogodio se istovremeno sa formiranjem IT industrije, a za to vrijeme uspjeli su pretrpjeti dosta promjena. Istorijski gledano, sve je počelo sa EBCDIC-om, koji je bio prilično neskladan u ruskom izgovoru, koji je omogućio da se slova latinice, arapski brojevi i znakovi interpunkcije kodiraju kontrolnim znakovima. Ali ipak, polaznu tačku za razvoj modernog kodiranja teksta treba smatrati poznatim ASCII(Američki standardni kod za razmjenu informacija, koji se na ruskom obično izgovara kao "aski"). Opisuje prvih 128 znakova koje najčešće koriste korisnici engleskog govornog područja - latinična slova, arapski brojevi i znakovi interpunkcije. Čak iu ovih 128 znakova opisanih u ASCII-u, bilo je nekih uslužnih znakova kao što su zagrade, crtice, zvjezdice, itd. Zapravo, možete ih i sami vidjeti:
Upravo ovih 128 znakova iz originalne verzije ASCII-a su postali standard, a u bilo kojem drugom kodiranju ćete ih sigurno susresti i oni će stajati tim redoslijedom. Ali činjenica je da je uz pomoć jednog bajta informacije moguće kodirati ne 128, već čak 256 različitih vrijednosti​​(dva na stepen osmice jednako je 256), pa nakon osnovne verzije Asuka, čitav niz proširena ASCII kodiranja, u kojem je, pored 128 osnovnih znakova, bilo moguće kodirati i simbole nacionalnog kodiranja (na primjer, ruski). Ovdje, vjerovatno, vrijedi reći nešto više o sistemima brojeva koji se koriste u opisu. Prvo, kao što svi znate, kompjuter radi samo sa brojevima u binarnom sistemu, odnosno sa nulama i jedinicama (“Boolean algebra”, ako je neko studirao na institutu ili u školi). Jedan bajt se sastoji od osam bitova, od kojih je svaki dvojka na stepen dva, počevši od nule, pa do dva u sedmom:
Nije teško shvatiti da od svih mogućih kombinacija nula i jedinica u takvoj konstrukciji može biti samo 256. Pretvaranje broja iz binarnog u decimalni broj je prilično jednostavno. Samo treba da saberete sve stepene dvojke, nad kojima postoje jedinice. U našem primjeru, ovo je 1 (2 na stepen nule) plus 8 (dva na stepen od 3), plus 32 (dva na peti), plus 64 (na šesti), plus 128 (na sedmi) . Ukupno dobiva 233 u decimalnom zapisu. Kao što vidite, sve je vrlo jednostavno. Ali ako bolje pogledate tabelu sa ASCII znakovima, vidjet ćete da su predstavljeni u heksadecimalnom kodiranju. Na primjer, "zvjezdica" odgovara u Asci heksadecimalnom broju 2A. Vjerovatno znate da pored arapskih brojeva, heksadecimalni brojevni sistem koristi i latinična slova od A (što znači deset) do F (što znači petnaest). Pa, za pretvoriti binarni u heksadecimalni pribjegavajte sljedećoj jednostavnoj i vizualnoj metodi. Svaki bajt informacija podijeljen je na dva dijela od četiri bita, kao što je prikazano na gornjoj slici ekrana. To. u svakom polubajtu, samo šesnaest vrijednosti može se kodirati u binarnom kodu (dva na četvrti stepen), koji se lako može predstaviti kao heksadecimalni broj. Štaviše, u lijevoj polovini bajta bit će potrebno ponovo brojati stepene, počevši od nule, a ne kao što je prikazano na snimku ekrana. Kao rezultat, jednostavnim proračunima dobijamo da je broj E9 kodiran na snimku ekrana. Nadam se da su vam tok mog razmišljanja i rješenje ove zagonetke bili jasni. Pa, hajde sada da nastavimo, zapravo, da pričamo o kodiranju teksta.

Proširene verzije Asuke - CP866 i KOI8-R kodiranja sa pseudografijom

Dakle, počeli smo da pričamo o ASCII-u, koji je bio, takoreći, polazna tačka za razvoj svih modernih kodiranja (Windows 1251, Unicode, UTF 8). U početku je sadržavao samo 128 znakova latinične abecede, arapske brojeve i još nešto, ali u proširenoj verziji postalo je moguće koristiti svih 256 vrijednosti koje se mogu kodirati u jednom bajtu informacije. One. postalo je moguće dodati znakove slova vašeg jezika u Asci. Ovdje će biti potrebno ponovo skrenuti pažnju da objasnim - zašto su vam uopšte potrebna kodiranja teksta i zašto je to toliko važno. Simboli na ekranu vašeg računara formiraju se na osnovu dve stvari - skupova vektorskih oblika (reprezentacija) svih vrsta znakova (nalaze se u fajlovima sa fontovima koji su instalirani na vašem računaru) i koda koji vam omogućava da izvučete upravo taj iz ovog skupa vektorskih oblika (fajl fonta).znak koji treba umetnuti na ispravnu lokaciju. Jasno je da su fontovi odgovorni za same vektorske forme, ali operativni sistem i programi koji se u njemu koriste su odgovorni za kodiranje. One. bilo koji tekst na vašem računaru će biti skup bajtova, od kojih svaki kodira samo jedan karakter ovog teksta. Program koji prikazuje ovaj tekst na ekranu (uređivač teksta, pretraživač itd.), prilikom raščlanjivanja koda, čita kodiranje sljedećeg znaka i traži odgovarajući vektorski oblik u željenoj datoteci fonta koji je povezan za prikaz ovog teksta dokument. Sve je jednostavno i banalno. To znači da za kodiranje bilo kojeg znaka koji nam je potreban (na primjer, iz nacionalne abecede), moraju biti ispunjena dva uslova - vektorski oblik ovog znaka mora biti u fontu koji se koristi, a ovaj znak može biti kodiran u proširenim ASCII kodovima u jednom bajtu. Stoga postoji čitava gomila takvih opcija. Samo za kodiranje znakova ruskog jezika postoji nekoliko varijanti proširene Aske. Na primjer, u početku je bilo CP866, u kojem je bilo moguće koristiti znakove ruskog alfabeta i to je bila proširena verzija ASCII-a. One. njen gornji dio se u potpunosti poklapao sa osnovnom verzijom Asuke (128 latiničnih znakova, brojeva i drugih sranja), što je prikazano na snimku ekrana odmah iznad, ali donji dio tabele sa CP866 kodiranjem imao je oblik prikazan na snimku ekrana ispod i dozvoljeno je kodiranje još 128 znakova (ruska slova i sve vrste pseudografije tamo):
Vidite, u desnoj koloni brojevi počinju sa 8, jer brojevi od 0 do 7 odnose se na ASCII osnovni dio (pogledajte prvi snimak ekrana). To. rusko slovo "M" u CP866 imat će kod 9C (nalazi se na presjeku odgovarajućeg reda sa 9 i kolone sa brojem C u heksadecimalnom brojevnom sistemu), koji se može napisati u jednom bajtu informacije, i ako postoji odgovarajući font sa ruskim znakovima, ovo slovo će se bez problema prikazati u tekstu. Odakle je došao ovaj iznos? pseudografija u CP866? Stvar je u tome što je ovo kodiranje za ruski tekst razvijeno još tih krznenih godina, kada nije bilo takve distribucije grafičkih operativnih sistema kao što je sada. I u Dosi, i sličnim tekstualnim operativnim sistemima, pseudografika je omogućila da se na neki način diverzificira dizajn tekstova, pa stoga obiluje CP866 i svim ostalim vršnjacima iz kategorije proširenih verzija Asuke. CP866 je distribuirao IBM, ali osim toga, razvijen je niz kodiranja za ruske znakove, na primjer, isti tip (prošireni ASCII) se može pripisati KOI8-R:
Princip njegovog rada ostaje isti kao i kod CP866 opisanog malo ranije - svaki znak teksta je kodiran jednim bajtom. Snimak ekrana prikazuje drugu polovinu tabele KOI8-R, jer prva polovina u potpunosti odgovara osnovnoj Asuki, koja je prikazana na prvom snimku ekrana u ovom članku. Među karakteristikama KOI8-R kodiranja, može se primijetiti da ruska slova u njegovoj tablici nisu po abecednom redu, kao što je, na primjer, učinjeno u CP866. Ako pogledate prvi snimak ekrana (osnovnog dijela, koji je uključen u sva proširena kodiranja), primijetit ćete da se u KOI8-R ruska slova nalaze u istim ćelijama tabele kao i slova suglasnika latinice sa njima iz prvog dela tabele. Ovo je učinjeno radi pogodnosti prebacivanja s ruskih na latinične znakove odbacivanjem samo jednog bita (dva na sedmu potenciju ili 128).

Windows 1251 - moderna verzija ASCII i zašto krakozyabry ispuzati

Dalji razvoj kodiranja teksta bio je zbog činjenice da su grafički operativni sistemi postajali sve popularniji i da je potreba za korištenjem pseudografije u njima vremenom nestala. Kao rezultat toga, nastala je cijela grupa, koje su, u suštini, još uvijek bile proširene verzije Asuke (jedan tekstualni znak je kodiran sa samo jednim bajtom informacije), ali bez upotrebe pseudografskih znakova. Pripadali su takozvanim ANSI kodovima, koje je razvio Američki institut za standarde. U običnom govoru, naziv ćirilica korišten je i za varijantu s podrškom za ruski jezik. Primjer takvog može biti Windows 1251. Povoljno je u poređenju sa ranije korišćenim CP866 i KOI8-R po tome što su mesto pseudografskih simbola u njemu zauzeli nedostajući simboli ruske tipografije (osim znaka akcenta), kao i simboli koji se koriste u slavenskim jezicima bliskim ruski (ukrajinski, bjeloruski, itd.):
Zbog tolikog obilja kodiranja ruskog jezika, proizvođači fontova i softveri su stalno imali glavobolju, a mi, dragi čitaoci, često smo izlazili naopako. krakozyabry kada je došlo do zabune sa verzijom korištenom u tekstu. Vrlo često su izlazile prilikom slanja i primanja poruka e-poštom, što je dovelo do stvaranja vrlo složenih tabela konverzije, koje, zapravo, nisu mogle riješiti ovaj problem u korijenu, a često su korisnici koristili transliteraciju latiničnih slova za dopisivanje kako bi se izbjegao ozloglašeni krakozyabry pri korištenju ruskih kodiranja poput CP866, KOI8-R ili Windows 1251. U stvari, greške koje su se pojavile umjesto ruskog teksta bile su rezultat pogrešne upotrebe kodiranja ovog jezika, koje nije odgovaralo onaj u kojem je tekstualna poruka izvorno kodirana. Na primjer, ako pokušate prikazati znakove kodirane pomoću CP866 pomoću tablice kodova Windows 1251, tada će se pojaviti ti isti krakozyabry (besmisleni skup znakova) koji će u potpunosti zamijeniti tekst poruke. Slična situacija se vrlo često dešava prilikom kreiranja i konfigurisanja sajtova, foruma ili blogova, kada je tekst sa ruskim znakovima greškom sačuvan u pogrešnom kodiranju koje se podrazumevano koristi na sajtu, ili u pogrešnom uređivaču teksta koji dodaje nevidljivi gag kodu. golim okom. Na kraju, mnogi ljudi su se umorili od takve situacije s puno kodiranja i stalnog izvlačenja krakozyabryja, postojali su preduvjeti za stvaranje nove univerzalne varijacije koja bi zamijenila sve postojeće i konačno bi riješila problem s pojavom nečitljivih tekstova . Osim toga, postojao je problem jezika poput kineskog, gdje je znakova jezika bilo mnogo više od 256.

Unicode (Unicode) - univerzalna kodiranja UTF 8, 16 i 32

Ove hiljade znakova grupe jezika jugoistočne Azije ne bi se mogle opisati ni na koji način u jednom bajtu informacija, koji je bio dodijeljen za kodiranje znakova u proširenim verzijama ASCII-a. Kao rezultat toga, konzorcij je pozvao Unicode(Unicode - Unicode Consortium) uz saradnju mnogih lidera IT industrije (onih koji proizvode softver, koji kodiraju hardver, koji kreiraju fontove), koji su bili zainteresovani za nastanak univerzalnog kodiranja teksta. Prva varijacija koja je objavljena pod okriljem Unicode konzorcijuma bila je UTF-32. Broj u nazivu kodiranja označava broj bitova koji se koristi za kodiranje jednog znaka. 32 bita su 4 bajta informacija koje će biti potrebne za kodiranje jednog znaka u novom UTF-u za univerzalno kodiranje. Kao rezultat toga, isti fajl sa tekstom, kodiran u proširenoj verziji ASCII-a i u UTF-32, u potonjem slučaju će imati četiri puta veću veličinu (težinu). Ovo je loše, ali sada imamo priliku da pomoću UTF-a kodiramo broj znakova jednak dva na stepen od trideset druge ( milijarde znakova, koji će pokriti svaku zaista potrebnu vrijednost sa velikom marginom). Ali mnoge zemlje sa jezicima evropske grupe uopšte nisu trebale da koriste toliki broj znakova u kodiranju, međutim, kada se koriste UTF-32, dobile bi četvorostruko povećanje težine tekstualnih dokumenata uzalud, a kao rezultat, povećanje obima internet saobraćaja i količine pohranjenih podataka. Ovo je mnogo, i niko si nije mogao priuštiti takav otpad. Kao rezultat razvoja Unicode-a, UTF-16, koji se pokazao toliko uspješnim da je prihvaćen kao zadani osnovni prostor za sve znakove koje koristimo. Koristi dva bajta za kodiranje jednog znaka. Hajde da vidimo kako ova stvar izgleda. U operativnom sistemu Windows možete ići putem "Start" - "Programi" - "Dodatna oprema" - "Uslužni programi" - "Tabela znakova". Kao rezultat, otvorit će se tabela sa vektorskim oblicima svih fontova instaliranih u vašem sistemu. Ako odaberete Unicode skup znakova u "Naprednim opcijama", možete vidjeti za svaki font pojedinačno cijeli niz znakova koji su uključeni u njega. Usput, klikom na bilo koji od njih, možete vidjeti njegov dvobajt kod u UTF-16 formatu, koji se sastoji od četiri heksadecimalne cifre: Koliko znakova se može kodirati u UTF-16 koristeći 16 bita? 65536 (dva na stepen šesnaest), a upravo je taj broj usvojen kao osnovni prostor u Unicode-u. Osim toga, postoje načini da se pomoću njega kodira oko dva miliona znakova, ali ograničeno na prošireni prostor od milion karaktera teksta. Ali čak ni ova uspješna verzija Unicode kodiranja nije donijela veliko zadovoljstvo onima koji su, recimo, pisali programe samo na engleskom, jer se nakon prelaska sa proširene verzije ASCII-a na UTF-16 težina dokumenata udvostručila (jedan bajt po jedan znak u Asci i dva bajta po istom znaku u UTF-16). To je to na zadovoljstvo svih i svega u Unicode konzorcijumu odlučeno je smisliti kodiranje varijabilna dužina. Zove se UTF-8. Uprkos osmici u nazivu, zaista ima promjenjivu dužinu, tj. svaki karakter teksta može se kodirati u niz od jednog do šest bajtova. U praksi se u UTF-8 koristi samo raspon od jednog do četiri bajta, jer iza četiri bajta koda ništa nije moguće čak ni teoretski zamisliti. Svi latinični znakovi u njemu su kodirani u jednom bajtu, baš kao u dobrom starom ASCII-u. Zanimljivo je da će u slučaju kodiranja samo latinice, čak i oni programi koji ne razumiju Unicode i dalje čitati ono što je kodirano u UTF-8. One. osnovni dio Asuke jednostavno je prešao u ovu zamisao Unicode konzorcijuma. Ćirilični znakovi u UTF-8 su kodirani u dva bajta, a, na primjer, gruzijski znakovi u tri bajta. Unicode konzorcij, nakon kreiranja UTF-a 16 i 8, riješio je glavni problem - sada imamo fontovi imaju jedan kodni prostor. A sada ih njihovi proizvođači mogu ispuniti samo vektorskim oblicima tekstualnih znakova na osnovu njihovih snaga i mogućnosti. U „Tablici znakova“ iznad možete vidjeti da različiti fontovi podržavaju različit broj znakova. Neki fontovi bogati Unicode-om mogu biti veoma veliki. Ali sada se ne razlikuju po tome što su kreirani za različita kodiranja, već u činjenici da je proizvođač fontova do kraja ispunio ili nije ispunio jedinstveni prostor koda jednim ili drugim vektorskim oblikom.

Krakozyabry umjesto ruskih slova - kako popraviti

Pogledajmo sada kako se krakozjabre pojavljuju umjesto teksta, ili, drugim riječima, kako se bira ispravno kodiranje za ruski tekst. Zapravo, postavlja se u programu u kojem kreirate ili uređujete ovaj isti tekst, odnosno kod koristeći fragmente teksta. Za uređivanje i kreiranje tekstualnih fajlova lično koristim veoma dobar, po mom mišljenju, Html i PHP editor Notepad++. Međutim, može naglasiti sintaksu još dobrih stotinu programskih i markup jezika, a također ima mogućnost proširenja pomoću dodataka. Pročitajte detaljnu recenziju ovog divnog programa na linku ispod. U gornjem meniju Notepad ++ nalazi se stavka "Kodiranja", gde ćete imati priliku da konvertujete postojeću opciju u onu koja se podrazumevano koristi na vašem sajtu:
U slučaju stranice na Joomli 1.5 i novijoj, kao iu slučaju bloga na WordPress-u, kako biste izbjegli pojavu grešaka, odaberite opciju UTF8 bez BOM-a. Šta je prefiks BOM? Činjenica je da kada je razvijeno UTF-16 kodiranje, iz nekog razloga su odlučili da mu pridruže nešto kao što je mogućnost pisanja koda znakova, kako u direktnom nizu (na primjer, 0A15) tako iu obrnutom (150A) . A da bi programi razumjeli kojim redoslijedom čitati kodove, izmišljen je BOM(Byte Order Mark ili, drugim riječima, potpis), što je izraženo u dodavanju tri dodatna bajta na sam početak dokumenata. U UTF-8 kodiranju, u Unicode konzorcijumu nije predviđena BOM, pa stoga dodavanje potpisa (ova najozloglašenija dodatna tri bajta na početak dokumenta) jednostavno sprečava neke programe da čitaju kod. Stoga, kada snimamo datoteke u UTF, uvijek moramo odabrati opciju bez BOM-a (bez potpisa). Dakle, napreduj zaštitite se od puzanja krakozyabry. Zanimljivo je da neki programi u Windows-u ne znaju kako to učiniti (ne mogu sačuvati tekst u UTF-8 bez BOM-a), na primjer, isti ozloglašeni Windows Notepad. Dokument sprema u UTF-8, ali i dalje dodaje potpis (tri dodatna bajta) na njegov početak. Štaviše, ovi bajtovi će uvijek biti isti - čitajte kod u direktnom nizu. Ali na serverima, zbog ove sitnice, može nastati problem - krakozyabry će izaći. Stoga, nikako nemojte koristiti običan Windows notepad za uređivanje dokumenata Vašeg sajta, ako ne želite da izgleda krakozyabrov. Već spomenuti uređivač Notepad ++ smatram najboljom i najjednostavnijom opcijom, koja praktično nema nedostataka i sastoji se samo od prednosti. U Notepad++, kada odaberete kodiranje, imat ćete opciju da konvertujete tekst u UCS-2 kodiranje, što je inherentno vrlo blisko Unicode standardu. Također u Notepad-u će biti moguće kodirati tekst u ANSI, tj. u odnosu na ruski jezik, ovo će biti Windows 1251, koji smo već malo gore opisali.Odakle ti podaci? Zapisano je u registru vašeg Windows operativnog sistema - koji kodiranje odabrati u slučaju ANSI, koji odabrati u slučaju OEM (za ruski jezik će to biti CP866). Ako instalirate drugi zadani jezik na svom računaru, onda će ovi kodovi biti zamijenjeni sličnim iz ANSI ili OEM kategorije za isti jezik. Nakon što snimite dokument u Notepad ++ u kodiranju koji vam je potreban ili otvorite dokument sa stranice za uređivanje, možete vidjeti njegov naziv u donjem desnom kutu uređivača: Da biste izbjegli krakozyabrov, pored gore opisanih radnji, bit će korisno napisati informacije o ovom kodiranju u njegovo zaglavlje izvornog koda svih stranica web-mjesta kako ne bi došlo do zabune na serveru ili lokalnom hostu. Općenito, u svim jezicima za označavanje hiperteksta osim Html-a, koristi se posebna xml deklaracija koja specificira kodiranje teksta.< ? xml version= "1.0" encoding= "windows-1251" ? >Prije raščlanjivanja koda, pretraživač zna koja se verzija koristi i kako tačno treba tumačiti kodove znakova tog jezika. Ali ono što je izvanredno, ako sačuvate dokument u zadanom unicode-u, onda se ova xml deklaracija može izostaviti (kodiranje će se smatrati UTF-8 ako nema BOM-a ili UTF-16 ako postoji BOM). U slučaju dokumenta na HTML jeziku, kodiranje se koristi za specifikaciju Meta element, koji je napisan između početne i završne oznake Head: < head> . . . < meta charset= "utf-8" > . . . < / head>Ovaj unos se prilično razlikuje od standarda u Html 4.01, ali je u potpunosti u skladu sa novim Html 5 standardom koji se polako uvodi, i biće 100% ispravno shvaćen od strane svih pretraživača koji se trenutno koriste. U teoriji, Meta element sa Html kodiranjem dokumenta bi bilo bolje staviti što je više moguće u zaglavlju dokumenta tako da bi u trenutku susreta u tekstu prvog znaka koji nije iz osnovnog ANSI (koji će se uvijek čitati ispravno i u bilo kojoj varijaciji) pretraživač već trebao imati informacije o tome kako tumačiti kodove ovih znakova. Link do prvog

Unicode je vrlo velik i složen svijet, jer vam standard omogućava predstavljanje i rad na računaru sa svim glavnim skriptama svijeta. Neki sistemi pisanja postoje više od hiljadu godina, a mnogi od njih su se razvili gotovo nezavisno jedan od drugog u različitim dijelovima svijeta. Ljudi su smislili toliko toga i često su toliko različiti jedni od drugih da je bio izuzetno težak i ambiciozan zadatak spojiti sve to u jedan standard.

Da biste stvarno razumjeli Unicode, morate barem površno zamisliti karakteristike svih skripti s kojima vam standard dozvoljava da radite. Ali da li je to zaista neophodno svakom programeru? Reći ćemo ne. Da biste koristili Unicode u većini svakodnevnih zadataka, dovoljno je imati razuman minimum znanja, a zatim se po potrebi udubljivati ​​u standard.

U ovom članku ćemo govoriti o osnovnim principima Unicode-a i istaknuti ona važna praktična pitanja sa kojima će se programeri sigurno suočiti u svom svakodnevnom radu.

Zašto je potreban Unicode?

Prije pojave Unicodea, jednobajtna kodiranja su se gotovo univerzalno koristila, u kojima je granica između samih znakova, njihova reprezentacija u memoriji računala i prikaz na ekranu bila prilično uslovna. Ako ste radili sa jednim ili drugim nacionalnim jezikom, tada su na vašem sistemu instalirani odgovarajući fontovi za kodiranje, koji su vam omogućavali da izvlačite bajtove sa diska na ekranu na način da imaju smisla za korisnika.

Ako ste odštampali tekstualni fajl na štampaču i videli skup nerazumljivih krakozjabra na papirnoj stranici, to je značilo da odgovarajući fontovi nisu učitani u štampač i on tumači bajtove ne onako kako biste želeli.

Ovaj pristup općenito, a posebno jednobajtna kodiranja, imali su niz značajnih nedostataka:

  1. Moglo se raditi istovremeno sa samo 256 znakova, a prvih 128 je bilo rezervirano za latinicu i kontrolna slova, a u drugoj polovini, pored znakova nacionalnog alfabeta, trebalo je naći mjesto i za pseudografske znakove ( ╔ ╗).
  2. Fontovi su bili vezani za određeno kodiranje.
  3. Svako kodiranje predstavljalo je svoj skup znakova, a konverzija iz jednog u drugi bila je moguća samo uz djelomične gubitke, kada su nedostajući znakovi zamijenjeni grafički sličnim.
  4. Prijenos datoteka između uređaja na različitim operativnim sistemima bio je težak. Bilo je potrebno ili imati program za pretvaranje, ili nositi dodatne fontove uz fajl. Postojanje Interneta kakvog poznajemo bilo je nemoguće.
  5. U svijetu postoje neazbučni sistemi pisanja (hijeroglifsko pisanje), koji su u principu nereprezentativni u jednobajtnom kodiranju.

Osnove Unicode-a

Svi savršeno dobro razumijemo da kompjuter ne zna ni za kakve idealne entitete, već radi sa bitovima i bajtovima. Ali kompjuterske sisteme i dalje stvaraju ljudi, a ne mašine, i za vas i ja je ponekad zgodnije da operišemo spekulativnim konceptima, a zatim pređemo od apstraktnog ka konkretnom.

Bitan! Jedan od centralnih principa u filozofiji Unicode-a je jasna razlika između znakova, njihovog predstavljanja na računaru i njihovog prikaza na izlaznom uređaju.

Uvodi se koncept apstraktnog Unicode karaktera, koji postoji samo u obliku spekulativnog koncepta i dogovora među ljudima, utvrđenog standardom. Svakom Unicode karakteru je dodijeljen nenegativan cijeli broj koji se zove njegova kodna točka.

Tako, na primjer, Unicode znak U+041F je veliko ćirilično slovo P. Postoji nekoliko načina da se ovaj znak predstavi u memoriji računara, baš kao i nekoliko hiljada načina da se prikaže na ekranu monitora. Ali u isto vrijeme P, to će biti P ili U + 041F u Africi.

Ovo je dobro poznata inkapsulacija ili odvajanje interfejsa od implementacije - koncept koji se dokazao u programiranju.

Ispostavilo se da, vodeći se standardom, bilo koji tekst može biti kodiran kao niz Unicode znakova

Pozdrav U+041F U+0440 U+0438 U+0432 U+0435 U+0442

zapišite to na komad papira, zapakirajte u kovertu i pošaljite na bilo koji dio Zemlje. Ako znaju za postojanje Unicode-a, onda će tekst percipirati na potpuno isti način kao i mi s vama. Neće imati ni najmanje sumnje da je pretposljednji znak upravo mala ćirilica e(U+0435) umjesto da kažem latinica mala e(U+0065). Primijetite da nismo rekli ni riječi o bajt reprezentaciji.

Unicode kodni prostor

Unicode kodni prostor se sastoji od 1,114,112 kodnih tačaka u rasponu od 0 do 10FFFF. Od toga je devetoj verziji standarda samo 128.237 dodijeljene vrijednosti. Dio prostora je rezerviran za privatnu upotrebu, a Unicode konzorcij obećava da nikada neće dodijeliti vrijednosti pozicijama iz ovih posebnih područja.

Radi pogodnosti, cijeli prostor je podijeljen na 17 ravni (trenutno ih je uključeno šest). Donedavno je bilo uobičajeno reći da ćete najvjerovatnije morati imati posla samo sa Basic Multilingual Plane (BMP), koji uključuje Unicode znakove od U+0000 do U+FFFF. (Naprijed malo: znakovi iz BMP-a su predstavljeni u UTF-16 sa dva bajta, a ne četiri). U 2016. ova teza je već dovedena u pitanje. Tako se, na primjer, popularni Emoji znakovi mogu naći u korisničkoj poruci i morate biti u mogućnosti da ih ispravno obradite.

Kodiranja

Ako želimo da šaljemo tekst preko Interneta, onda moramo kodirati niz Unicode znakova kao niz bajtova.

Unicode standard uključuje opis niza Unicode kodiranja, kao što su UTF-8 i UTF-16BE/UTF-16LE, koji omogućavaju da se cijeli prostor kodnih tačaka kodira. Konverzija između ovih kodiranja može se slobodno izvršiti bez gubitka informacija.

Takođe, niko nije otkazao jednobajtna kodiranja, ali vam omogućavaju da kodirate svoj individualni i veoma uski deo Unicode spektra - 256 ili manje kodnih pozicija. Za takva kodiranja postoje tabele koje su dostupne svima, gdje je svaka vrijednost jednog bajta pridružena Unicode karakteru (pogledajte, na primjer, CP1251.TXT). Uprkos ograničenjima, jednobajtna kodiranja su se pokazala vrlo praktičnim kada je u pitanju rad sa velikim nizom jednojezičnih tekstualnih informacija.

Od Unicode kodiranja na Internetu, UTF-8 je najčešći (osvojio je palmu 2008. godine), uglavnom zbog svoje ekonomičnosti i transparentne kompatibilnosti sa sedmobitnim ASCII-jem. Latinski i uslužni simboli, osnovni znaci interpunkcije i brojevi - tj. svi sedmobitni ASCII karakteri su kodirani u UTF-8 sa jednim bajtom, isto kao u ASCII. Simboli mnogih osnovnih pisama, osim nekih rjeđih hijeroglifskih znakova, u njemu su predstavljeni sa dva ili tri bajta. Najveća pozicija koda definisana standardom - 10FFFF - je kodirana sa četiri bajta.

Imajte na umu da je UTF-8 kodiranje varijabilne dužine. Svaki Unicode znak u njemu predstavljen je nizom kvanta koda sa minimalnom dužinom od jednog kvanta. Broj 8 označava bitnu dužinu kvanta koda (kodna jedinica) - 8 bita. Za UTF-16 familiju kodiranja, veličina kvanta koda je 16 bita. Za UTF-32 - 32 bita.

Ako HTML stranicu sa ćiriličnim tekstom šaljete preko mreže, onda UTF-8 može dati vrlo opipljivu dobit, jer. sve oznake, kao i JavaScript i CSS blokovi, će efektivno biti kodirani u jednom bajtu. Na primjer, glavna stranica Habra u UTF-8 zauzima 139Kb, au UTF-16 već 256Kb. Poređenja radi, ako koristite win-1251 uz gubitak mogućnosti spremanja nekih znakova, tada će se veličina smanjiti za samo 11Kb.

16-bitna Unicode kodiranja se često koriste za pohranjivanje string informacija u aplikacijama zbog svoje jednostavnosti, kao i činjenice da su znakovi najvećih svjetskih sistema pisanja kodirani u jednom šesnaest-bitnom kvantu. Tako, na primjer, Java uspješno koristi UTF-16 za interno predstavljanje stringova. Operativni sistem Windows interno takođe koristi UTF-16.

U svakom slučaju, sve dok ostajemo u Unicode prostoru, nije bitno kako se informacije stringova pohranjuju unutar jedne aplikacije. Ako vam format interne memorije omogućava ispravno kodiranje svih više od milion pozicija koda i nema gubitka informacija na granici aplikacije, na primjer, prilikom čitanja iz datoteke ili kopiranja u međuspremnik, onda je sve u redu.

Da biste ispravno protumačili tekst pročitan s diska ili mrežne utičnice, prvo morate odrediti njegovo kodiranje. Ovo se radi ili pomoću meta-informacija koje daje korisnik, napisanih u tekstu ili pored njega, ili se određuje heuristički.

U suvoj materiji

Informacija ima puno i ima smisla dati kratak rezime svega što je gore napisano:

  • Unicode postulira jasnu razliku između znakova, njihovog predstavljanja na računaru i njihovog prikaza na izlaznom uređaju.
  • Unicode kodni prostor se sastoji od 1,114,112 kodnih tačaka u rasponu od 0 do 10FFFF.
  • Osnovna višejezična ravan uključuje Unicode znakove U+0000 do U+FFFF, koji su kodirani u UTF-16 kao dva bajta.
  • Bilo koje Unicode kodiranje vam omogućava da kodirate cijeli prostor Unicode kodnih pozicija, a konverzija između različitih takvih kodiranja se izvodi bez gubitka informacija.
  • Jednobajtna kodiranja kodiraju samo mali dio Unicode spektra, ali mogu biti korisna kada radite s velikom količinom jednojezičnih informacija.
  • UTF-8 i UTF-16 kodiranja imaju promjenjivu dužinu koda. U UTF-8, svaki Unicode znak može biti kodiran kao jedan, dva, tri ili četiri bajta. U UTF-16, dva ili četiri bajta.
  • Interni format za pohranjivanje tekstualnih informacija unutar posebne aplikacije može biti proizvoljan, pod uslovom da ispravno radi sa cijelim prostorom Unicode kodnih pozicija i da nema gubitaka prilikom prekograničnog prijenosa podataka.

Kratka napomena o kodiranju

Može doći do zabune sa terminom kodiranje. Unutar Unicode-a, kodiranje se dešava dva puta. Prvi put kada se Unicode skup znakova (skup znakova) kodira, u smislu da je svakom Unicode znaku dodijeljen odgovarajući kodni položaj. Kao dio ovog procesa, Unicode skup znakova se pretvara u kodirani skup znakova. Drugi put kada se sekvenca unicode znakova konvertuje u niz bajtova, ovaj proces se naziva i kodiranje.

U engleskoj terminologiji postoje dva različita glagola kodirati i kodirati, ali se čak i izvorni govornici često zbune u njima. Osim toga, termin skup znakova ili skup znakova koristi se kao sinonim za termin skup znakova kodiranih.

Sve ovo kažemo na činjenicu da ima smisla obratiti pažnju na kontekst i razlikovati situacije kada je u pitanju kodna pozicija apstraktnog Unicode znaka i kada je u pitanju njegova bajt reprezentacija.

Konačno

Postoji toliko mnogo različitih aspekata Unicode-a da je nemoguće pokriti sve u jednom članku. Da, i nepotrebno. Gore navedene informacije su sasvim dovoljne da se ne zbunite u osnovnim principima i radite s tekstom u većini svakodnevnih zadataka (čitaj: bez odlaska dalje od BMP-a). U sljedećim člancima ćemo govoriti o normalizaciji, dati potpuniji povijesni pregled razvoja kodiranja, govoriti o problemima terminologije Unicode na ruskom jeziku, a također ćemo napraviti materijal o praktičnim aspektima korištenja UTF-8 i UTF- 16.

Unicode: UTF-8, UTF-16, UTF-32.

Unicode je skup grafičkih znakova i način njihovog kodiranja za kompjutersku obradu tekstualnih podataka.

Unicode ne samo da dodjeljuje jedinstveni kod svakom znaku, već također definira različite karakteristike tog znaka, na primjer:

    tip karaktera (veliko slovo, malo slovo, broj, interpunkcijski znak, itd.);

    atributi znakova (prikaz slijeva nadesno ili zdesna nalijevo, razmak, prijelom reda, itd.);

    odgovarajuće veliko ili malo slovo (za mala i velika slova);

    odgovarajuću numeričku vrijednost (za numeričke znakove).

    Standardi UTF(skraćenica za Unicode Transformation Format) za predstavljanje znakova:

UTF-16: Windows Setup, Acceleration, Vista FAQ koristi UTF-16 kodiranje za predstavljanje svih Unicode znakova. U UTF-16, znakovi su predstavljeni sa dva bajta (16 bita). Ovo kodiranje se koristi u Windows-u jer 16-bitne vrijednosti mogu predstavljati znakove koji čine abecede većine jezika na svijetu, što omogućava programima da brže obrađuju nizove i izračunavaju njihovu dužinu. Međutim, 16 bita nije dovoljno za predstavljanje abecednih znakova u nekim jezicima. U takvim slučajevima, UTE-16 podržava "surogat" kodiranja, omogućavajući da se karakteri kodiraju u 32 bita (4 bajta). Međutim, postoji nekoliko aplikacija koje se moraju baviti znakovima takvih jezika, tako da je UTF-16 dobar kompromis između uštede memorije i lakoće programiranja. Imajte na umu da su u .NET Frameworku svi znakovi kodirani korištenjem UTF-16, tako da korištenje UTF-16 u Windows aplikacijama poboljšava performanse i smanjuje potrošnju memorije prilikom prosljeđivanja nizova između izvornog i upravljanog koda.

UTF-8: U UTF-8 kodiranju, različiti znakovi mogu biti predstavljeni sa 1,2,3 ili 4 bajta. Znakovi sa vrijednostima manjim od 0x0080 komprimirani su na 1 bajt, što je vrlo zgodno za američke znakove. Znakovi koji odgovaraju vrijednostima u rasponu 0x0080-0x07FF pretvaraju se u 2-bajtne vrijednosti, što dobro funkcionira s evropskim i bliskoistočnim alfabetima. Znakovi s većim vrijednostima se pretvaraju u vrijednosti od 3 bajta, što je zgodno za rad sa jezicima srednje Azije. Konačno, "surogat" parovi su napisani u 4-bajtnom formatu. UTF-8 je izuzetno popularno kodiranje. Međutim, manje je efikasan od UTF-16 ako se često koriste znakovi sa vrijednostima 0x0800 ili više.

UTF-32: U UTF-32, svi znakovi su predstavljeni sa 4 bajta. Ovo kodiranje je pogodno za pisanje jednostavnih algoritama za nabrajanje znakova bilo kojeg jezika koji ne zahtijevaju obradu znakova predstavljenih različitim brojevima bajtova. Na primjer, kada koristite UTF-32, možete zaboraviti na "surogate", jer je bilo koji znak u ovom kodiranju predstavljen sa 4 bajta. Jasno je da je UTF-32 daleko od idealnog u smislu upotrebe memorije. Stoga se ovo kodiranje rijetko koristi za prijenos nizova preko mreže i njihovo spremanje u datoteke. Po pravilu, UTF-32 se koristi kao interni format za predstavljanje podataka u programu.

UTF-8

U bliskoj budućnosti, poseban Unicode (i ISO 10646) format tzv UTF-8. Ovo "derivativno" kodiranje koristi nizove bajtova različitih dužina (od jednog do šest) za pisanje znakova, koji se konvertuju u Unicode kodove pomoću jednostavnog algoritma, sa kraćim nizovima koji odgovaraju uobičajenijim znakovima. Glavna prednost ovog formata je kompatibilnost sa ASCII ne samo u smislu vrijednosti koda, već i u smislu broja bitova po karakteru, budući da je jedan bajt dovoljan za kodiranje bilo kojeg od prvih 128 znakova u UTF-8 (iako, na primjer, za ćirilična slova su potrebna dva bajta).

UTF-8 format su izumili 2. septembra 1992. Ken Thompson i Rob Pike i implementirali ga u Plan 9. Sada je standard UTF-8 zvanično sadržan u dokumentima RFC 3629 i ISO/IEC 10646 Aneks D.

Za Web dizajnera, ovo kodiranje je od posebne važnosti, jer je deklarirano kao "standardno kodiranje dokumenta" u HTML-u od verzije 4.

Tekst koji se sastoji samo od znakova manjih od 128 konvertuje se u običan ASCII tekst kada je napisan u UTF-8. Suprotno tome, u UTF-8 tekstu, svaki bajt sa vrijednošću manjom od 128 predstavlja ASCII znak sa istim kodom. Preostali Unicode znakovi su predstavljeni kao nizovi od 2 do 6 bajtova dužine (u stvari samo do 4 bajta, pošto kodovi veći od 221 nisu planirani), u kojima je prvi bajt uvijek 11xxxxxx, a ostali 10xxxxxx.

Jednostavno rečeno, u UTF-8, latinični znakovi, interpunkcija i ASCII kontrolni znakovi su napisani kao US-ASCII kodovi, a svi ostali znakovi su kodirani pomoću nekoliko okteta sa najvažnijim bitom 1. Ovo ima dva efekta.

    Čak i ako program ne prepozna Unicode, latinična slova, arapski brojevi i znakovi interpunkcije će biti ispravno prikazani.

    U slučaju da latinična slova i najjednostavniji znaci interpunkcije (uključujući razmak) zauzimaju značajnu količinu teksta, UTF-8 daje povećanje u volumenu u odnosu na UTF-16.

    Na prvi pogled može izgledati da je UTF-16 praktičniji, jer je većina znakova u njemu kodirana u tačno dva bajta. Međutim, ovo je negirano potrebom da se podrže surogat parovi, koji se često zaboravljaju kada se koristi UTF-16, implementirajući samo podršku za UCS-2 znakove.

Standard je 1991. godine predložila neprofitna organizacija Unicode Consortium (English Unicode Consortium, Unicode Inc.). Upotreba ovog standarda omogućava kodiranje vrlo velikog broja znakova iz različitih pisama: kineski znakovi, matematički simboli, slova grčkog alfabeta, latinica i ćirilica mogu koegzistirati u Unicode dokumentima, dok mijenjanje kodnih stranica postaje nepotrebno.

Standard se sastoji od dva glavna odjeljka: univerzalnog skupa znakova (UCS, univerzalni skup znakova) i familije kodiranja (UTF, Unicode format transformacije). Univerzalni skup znakova specificira jedan-na-jedan korespondenciju znakova sa kodovima - elementi kodnog prostora koji predstavljaju nenegativne cijele brojeve. Porodica kodiranja definira mašinski prikaz niza UCS kodova.

Unicode standard je razvijen sa ciljem stvaranja jedinstvenog kodiranja znakova za sve moderne i mnoge drevne pisane jezike. Svaki znak u ovom standardu je kodiran sa 16 bita, što mu omogućava da pokrije neuporedivo veći broj znakova od prethodno prihvaćenih 8-bitnih kodiranja. Još jedna bitna razlika između Unicodea i drugih sistema kodiranja je u tome što on ne samo da svakom znaku dodeljuje jedinstveni kod, već i definiše različite karakteristike tog znaka, na primjer:

Vrsta znaka (veliko slovo, malo slovo, broj, interpunkcijski znak, itd.);

Atributi znakova (prikaz s lijeva na desno ili zdesna na lijevo, razmak, prijelom reda, itd.);

Odgovarajuće veliko ili malo slovo (za mala i velika slova, respektivno);

Odgovarajuća numerička vrijednost (za numeričke znakove).

Čitav raspon kodova od 0 do FFFF podijeljen je na nekoliko standardnih podskupova, od kojih svaki odgovara ili alfabetu nekog jezika, ili grupi specijalnih znakova koji su slični u svojim funkcijama. Dijagram ispod sadrži opštu listu podskupova Unicode 3.0 (slika 2).

Slika 2

Unicode standard je osnova za skladištenje i tekst u mnogim modernim računarskim sistemima. Međutim, nije kompatibilan sa većinom Internet protokola, jer njegovi kodovi mogu sadržavati bilo koju vrijednost bajtova, a protokoli obično koriste bajtove 00 - 1F i FE - FF kao servisne bajtove. Da bi se postigla kompatibilnost, razvijeno je nekoliko formata Unicode transformacije (UTF, Unicode Transformation Formats), od kojih je UTF-8 danas najčešći. Ovaj format definira sljedeća pravila za pretvaranje svakog Unicode koda u skup bajtova (od jednog do tri) pogodnih za transport putem Internet protokola.


Ovdje x,y,z označavaju bitove izvornog koda, koje treba izdvojiti, počevši od najmlađeg, i unijeti u bajtove rezultata s desna na lijevo, sve dok se ne popune sve navedene pozicije.

Dalji razvoj Unicode standarda povezan je sa dodavanjem novih jezičkih ravni, tj. znakova u rasponima 10000 - 1FFFF, 20000 - 2FFFF, itd., gdje bi trebalo uključiti kodiranje za skripte mrtvih jezika koji nisu uključeni u gornju tabelu. Za kodiranje ovih dodatnih znakova razvijen je novi UTF-16 format.

Dakle, postoje 4 glavna načina za kodiranje bajtova u Unicode formatu:

UTF-8: 128 znakova kodiranih u jednom bajtu (ASCII format), 1920 znakova kodiranih u 2 bajta ((rimski, grčki, ćirilični, koptski, armenski, hebrejski, arapski znakovi), 63488 znakova kodiranih u 3 bajta (kineski, japanski itd. .) Preostalih 2.147.418.112 znakova (još nisu korišteni) mogu se kodirati sa 4, 5 ili 6 bajtova.

UCS-2: Svaki znak je predstavljen sa 2 bajta. Ovo kodiranje uključuje samo prvih 65.535 znakova iz Unicode formata.

UTF-16: Ovo je proširenje UCS-2 i uključuje 1,114,112 Unicode znakova. Prvih 65.535 karaktera predstavljeno je sa 2 bajta, a ostali sa 4 bajta.

USC-4: Svaki znak je kodiran sa 4 bajta.

Top Related Articles