Unicode ili Unicode (od engleske riječi Unicode) je standard za kodiranje znakova. Omogućuje kodiranje gotovo svih pisanih jezika.
Kasnih 1980-ih, 8-bitni znakovi postali su standard. 8-bitna kodiranja bila su predstavljena raznim modifikacijama, čiji je broj stalno rastao. To je uglavnom rezultat aktivnog širenja raspona jezika koji se koriste. Postojala je i želja programera da smisle kodiranje koje zahtijeva barem djelomičnu univerzalnost.
Kao rezultat toga, postalo je potrebno riješiti nekoliko problema:
- problemi s prikazom dokumenata u pogrešnom kodiranju. Može se riješiti ili dosljednim uvođenjem metoda za određivanje korištenog kodiranja ili uvođenjem jedinstvenog kodiranja za sve;
- problemi ograničenog paketa znakova, riješeni ili promjenom fontova u dokumentu, ili uvođenjem proširenog kodiranja;
- problemi pretvorbe kodiranja iz jednog u drugi, za koje se činilo da je moguće riješiti bilo korištenjem međupretvorbe (treće kodiranje), uključujući znakove različitih kodiranja, ili izradom tablica pretvorbe za svaka dva kodiranja;
- problemi umnožavanja pojedinih fontova. Tradicionalno, svako je kodiranje pretpostavljalo svoj vlastiti font, čak i kada su se kodiranja potpuno ili djelomično podudarala u skupu znakova. Donekle je problem riješen uz pomoć "velikih" fontova iz kojih su potom birani znakovi potrebni za određeno kodiranje. Ali kako bi se utvrdio stupanj usklađenosti, bilo je potrebno stvoriti jedinstveni registar simbola.
Stoga se na dnevnom redu postavilo pitanje potrebe za stvaranjem "širokog" unificiranog kodiranja. Kodiranja promjenjive duljine znakova korištena u jugoistočnoj Aziji bila su previše složena za korištenje. Stoga je naglasak stavljen na korištenje simbola fiksne širine. 32-bitni simboli djelovali su preglomazno, a na kraju su pobijedili 16-bitni.
Standard je internetskoj zajednici 1991. godine predložila neprofitna organizacija Unicode konzorcij... Njegova uporaba omogućuje kodiranje velikog broja znakova različitih vrsta pisanja. U Unicode dokumentima ni kineski znakovi, ni matematički simboli, ni ćirilica ni latinica nisu usko susjedni. Istodobno, kodne stranice ne zahtijevaju nikakve prekidače tijekom rada.
Standard se sastoji od dva glavna odjeljka: univerzalnog skupa znakova (engleski UCS) i obitelji kodiranja (u engleskom tumačenju - UTF). Univerzalni skup znakova postavlja proporcionalnost jedan prema jedan kodovima znakova. Kodovi su u ovom slučaju elementi domene koda koji su nenegativni cijeli brojevi. Funkcija obitelji kodiranja je definirati strojni prikaz niza UCS kodova.
U standardu Unicode, kodovi se ocjenjuju u nekoliko područja. Područje s kodovima koji počinju s U + 0000 i završavaju s U + 007F - uključuje znakove ASCII skupa s potrebnim kodovima. Dalje postoje područja simbola različitih pisama, tehničkih simbola, interpunkcijskih znakova. Zasebna serija kodova čuva se u rezervi za buduću upotrebu. Ćirilica kodovima definira sljedeća područja znakova: 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 gotovo 50 posto početkom 2010.
Danas ćemo s vama razgovarati o tome odakle dolaze krakozyabri na web-mjestu iu programima, koja kodiranja teksta postoje i koja se trebaju koristiti. Razmotrimo detaljno povijest njihovog razvoja, počevši od osnovnog ASCII-a, kao i njegovih proširenih verzija CP866, KOI8-R, Windows 1251 i završavajući modernim kodiranjem Unicode konzorcija UTF 16 i 8. Sadržaj:
- Proširene verzije Asuka - CP866 i KOI8-R kodiranja
- Windows 1251 - ASCII varijacija i zašto krakozyabry izlaze
ASCII - osnovno kodiranje teksta za latinicu
Razvoj kodiranja teksta odvijao se istodobno s formiranjem IT industrije, a tijekom tog vremena uspjeli su doživjeti dosta promjena. Povijesno gledano, sve je počelo s EBCDIC-om, koji u ruskom izgovoru nije bio eufoničan, što je omogućilo kodiranje slova latinice, arapskih brojeva i interpunkcijskih znakova kontrolnim znakovima. Ali ipak, polazište za razvoj modernih kodiranja teksta je poznato 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 interpunkcijski znakovi. Čak je i ovih 128 znakova opisanih u ASCII-u uključivalo neke uslužne simbole kao što su zagrade, hash linije, zvjezdice itd. Zapravo, i sami ih možete vidjeti:![](https://i0.wp.com/info.javarush.ru/uploads/images/00/65/20/2015/12/15/15fe1a.png)
![](https://i0.wp.com/info.javarush.ru/uploads/images/00/65/20/2015/12/15/0a7d12.png)
Proširene verzije Asuke - CP866 i KOI8-R kodiranja s pseudografijom
Dakle, počeli smo razgovarati o ASCII-u, koji je, takoreći, bio polazište 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. Oni. postalo je moguće dodati simbole slova vašeg jezika u Aski. Ovdje će biti potrebno još jednom skrenuti pažnju da razjasnimo - zašto su nam uopće potrebna kodiranja teksta i zašto je to toliko važno. Simboli na ekranu vašeg računala formiraju se na temelju dviju stvari - skupova vektorskih oblika (reprezentacija) svih vrsta znakova (nalaze se u datotekama s fontovima koje su instalirane na vašem računalu) i koda koji vam omogućuje izvući upravo taj iz ovog skupa vektorskih oblika (datoteka fonta) znak koji treba umetnuti na željeno mjesto. Jasno je da su sami fontovi odgovorni za vektorske oblike, ali operativni sustav i programi koji se u njemu koriste odgovorni su za kodiranje. Oni. bilo koji tekst na vašem računalu bit će skup bajtova, od kojih svaki kodira samo jedan znak tog teksta. Program koji ovaj tekst prikazuje na ekranu (uređivač teksta, preglednik itd.), prilikom raščlanjivanja koda, čita kodiranje sljedećeg znaka i traži odgovarajući vektorski oblik u potrebnoj datoteci fonta, koji je povezan za prikaz ovog tekstualni dokument. Sve je jednostavno i otrcano. To znači da za kodiranje bilo kojeg znaka koji nam je potreban (na primjer, iz nacionalne abecede), moraju biti ispunjena dva uvjeta - vektorski oblik ovog znaka mora biti u korištenom fontu i taj znak može biti kodiran u proširenim ASCII kodovima u jedan bajt. Stoga postoji cijela hrpa takvih opcija. Postoji nekoliko varijanti proširene Asuke samo za kodiranje znakova ruskog jezika. Na primjer, izvorno se pojavio CP866, u kojem je bilo moguće koristiti znakove ruske abecede i bila je proširena verzija ASCII-a. Oni. njen gornji dio se u potpunosti podudarao s osnovnom verzijom Asuke (128 latiničnih znakova, brojeva i bilo kakvog sranja), što je prikazano na snimci zaslona malo iznad, ali donji dio tablice s CP866 kodiranjem imao je pogled prikazan na snimci zaslona upravo ispod i dopušteno je kodirati još 128 znakova (ruska slova i sve vrste pseudo-grafike):![](https://i1.wp.com/info.javarush.ru/uploads/images/00/65/20/2015/12/15/a1391c.png)
![](https://i0.wp.com/info.javarush.ru/uploads/images/00/65/20/2015/12/15/73e6b5.png)
Windows 1251 - moderna verzija ASCII i zašto krakozyabry izaći
Daljnji razvoj kodiranja teksta bio je povezan s činjenicom da su grafički operativni sustavi postajali sve popularniji te je s vremenom nestala potreba za korištenjem pseudografike u njima. Kao rezultat toga, nastala je cijela skupina, koje su, u biti, još uvijek bile proširene verzije Asuke (jedan znak teksta je kodiran sa samo jednim bajtom informacija), ali već bez upotrebe pseudografičkih znakova. Pripadali su takozvanim ANSI kodovima, koje je razvio Američki institut za standarde. U običnom govoru, naziv ćirilice i dalje se koristio za verziju s podrškom za ruski jezik. Primjer za to je Windows 1251... Povoljno se razlikovao od prethodno korištenih CP866 i KOI8-R po tome što su mjesto pseudografskih simbola u njemu zauzeli nedostajući simboli ruske tipografije (osim znaka naglaska), kao i simboli koji se koriste u slavenskim jezicima blizak ruskom (ukrajinski, bjeloruski, itd.) ):![](https://i2.wp.com/info.javarush.ru/uploads/images/00/65/20/2015/12/15/963d34.png)
![](https://i1.wp.com/info.javarush.ru/uploads/images/00/65/20/2015/12/15/1443f6.png)
Unicode - univerzalna UTF kodiranja 8, 16 i 32
Ove tisuće znakova iz grupe jezika jugoistočne Azije ne mogu se opisati u jednom bajtu informacija, koji je bio dodijeljen za kodiranje znakova u proširenim verzijama ASCII-a. Kao rezultat toga, stvoren je konzorcij tzv Unicode(Unicode - Unicode Consortium) u suradnji s brojnim liderima IT industrije (onima koji proizvode softver, koji kodiraju hardver, koji kreiraju fontove) koji su bili zainteresirani za pojavu univerzalnog kodiranja teksta. Prva varijacija objavljena pod okriljem Unicode konzorcija je bila UTF 32... Broj u nazivu kodiranja označava broj bitova koji se koriste za kodiranje jednog znaka. 32 bita su 4 bajta informacija koje će biti potrebne za kodiranje jednog znaka u novom univerzalnom UTF kodiranju. Kao rezultat toga, ista datoteka s tekstom kodiranim u proširenoj verziji ASCII-a iu UTF-32, u potonjem slučaju, imat će četiri puta veću veličinu (težinu). Ovo je loše, ali sada imamo priliku kodirati broj znakova jednak dva na stepen od trideset druge ( milijarde znakova, koji će pokriti svaku stvarno potrebnu vrijednost s kolosalnom maržom). No mnoge zemlje s jezicima europske grupe nisu trebale koristiti tako ogroman broj znakova u kodiranju, ali kada je korišten UTF-32, uzalud su primile četverostruko povećanje težine tekstualnih dokumenata, a kao rezultat, povećanje obujma internetskog prometa i količine pohranjenih podataka. Ovo je puno, a takav otpad si nitko nije mogao priuštiti. Kao rezultat razvoja Unicodea, UTF-16, koji se pokazao toliko uspješnim da je prema zadanim postavkama prihvaćen kao osnovni prostor za sve simbole koje koristimo. Koristi dva bajta za kodiranje jednog znaka. Pogledajmo kako izgleda ovaj slučaj. U operacijskom sustavu Windows možete slijediti put "Start" - "Programi" - "Dodatna oprema" - "System Tools" - "Symbol Map". Kao rezultat, otvorit će se tablica s vektorskim oblicima svih fontova instaliranih u vašem sustavu. Ako odaberete Unicode skup znakova u "Dodatni parametri", moći ćete vidjeti za svaki font zasebno cijeli asortiman znakova koji su u njemu uključeni. Usput, klikom na bilo koji od njih, možete vidjeti njegov dvobajt UTF-16 kod sastoji se od četiri heksadecimalne znamenke:![](https://i1.wp.com/info.javarush.ru/uploads/images/00/65/20/2015/12/15/eb4be3.png)
Krakozyabry umjesto ruskih slova - kako to popraviti
Pogledajmo sada kako se umjesto teksta pojavljuju krakozyabre, ili, drugim riječima, kako se bira ispravno kodiranje za ruski tekst. Zapravo, postavljen je u programu u kojem kreirate ili uređujete upravo ovaj tekst, odnosno kod pomoću fragmenata teksta. Za uređivanje i izradu tekstualnih datoteka osobno koristim vrlo dobar, po mom mišljenju, Html i PHP editor Notepad ++. Međutim, može istaknuti sintaksu još dobrih stotinu programskih i označnih jezika, a također ima mogućnost proširenja pomoću dodataka. Pročitajte detaljnu recenziju ovog sjajnog programa na priloženoj poveznici. U gornjem izborniku Notepad ++ nalazi se stavka "Kodiranja", gdje ćete moći pretvoriti postojeću verziju u onu koja se prema zadanim postavkama koristi na vašoj web-lokaciji:![](https://i1.wp.com/info.javarush.ru/uploads/images/00/65/20/2015/12/15/f7e151.png)
Unicode je vrlo velik i složen svijet, jer vam standard omogućuje predstavljanje i rad na računalu sa svim glavnim skriptama svijeta. Neki sustavi pisanja postoje već više od tisuću godina, a mnogi od njih su se razvili gotovo neovisno jedan o drugom u različitim dijelovima svijeta. Ljudi su izmislili toliko stvari i često su toliko različite jedni od drugih da je bio izuzetno težak i ambiciozan zadatak sve to spojiti u jedan standard.
Da biste stvarno razumjeli Unicode, morate barem površno zamisliti značajke svih skripti s kojima vam standard omogućuje rad. No, je li to doista potrebno svakom programeru? Reći ćemo ne. Za korištenje Unicodea u većini svakodnevnih zadataka dovoljno je znati razuman minimum informacija, a zatim se po potrebi udubljivati u standard.
U ovom ćemo članku govoriti o osnovnim principima Unicodea i istaknuti ona važna praktična pitanja s kojima će se programeri zasigurno suočiti u svom svakodnevnom radu.
Zašto vam je trebao Unicode?
Prije pojave Unicodea, jednobajtna kodiranja su bila gotovo univerzalno korištena, u kojoj je granica između samih znakova, njihov prikaz u memoriji računala i prikaz na ekranu bila prilično proizvoljna. Ako ste radili s jednim ili drugim nacionalnim jezikom, tada su na vaš sustav instalirana odgovarajuća kodiranja fontova, što je omogućilo izvlačenje bajtova s diska na ekranu na način da korisniku ima smisla.
Ako ste ispisali tekstualnu datoteku na pisaču i vidjeli skup nerazumljivih krakozyabra na papirnatoj stranici, to je značilo da odgovarajući fontovi nisu učitani u uređaj za ispis i on interpretira bajtove na drugačiji način nego što biste željeli.
Ovaj pristup općenito, a posebno jednobajtna kodiranja, imali su niz značajnih nedostataka:
- Moglo se raditi istovremeno sa samo 256 znakova, a prvih 128 bilo je rezervirano za latinicu i kontrolne znakove, a u drugoj polovici, osim znakova nacionalne abecede, trebalo je pronaći mjesto za pseudografiku znakova (╔ ╗).
- Fontovi su bili vezani uz određeno kodiranje.
- Svako kodiranje predstavljalo je svoj skup znakova, a pretvorba iz jednog u drugi bila je moguća samo uz djelomične gubitke, kada su nedostajući znakovi zamijenjeni grafički sličnim.
- Prijenos datoteka između uređaja s različitim operativnim sustavima bio je težak. Bilo je potrebno ili imati program za pretvaranje, ili nositi dodatne fontove uz datoteku. Postojanje Interneta kakvog poznajemo bilo je nemoguće.
- U svijetu postoje neabecedni sustavi pisanja (hijeroglifsko pisanje), koji u jednobajtnom kodiranju u principu nisu reprezentativni.
Osnovna načela Unicodea
Svi mi savršeno dobro razumijemo da računalo ne zna ni za kakve idealne entitete, već radi s bitovima i bajtovima. Ali računalne sustave i dalje stvaraju ljudi, a ne strojevi, i ponekad je vama i meni prikladnije operirati spekulativnim konceptima, a zatim prijeći od apstraktnog prema konkretnom.
Važno! Jedno od središnjih načela Unicode filozofije je jasna razlika između znakova, njihovog prikaza na računalu i njihovog prikaza na izlaznom uređaju.
Uvodi se koncept apstraktnog unicode lika, koji postoji isključivo u obliku spekulativnog koncepta i dogovora među ljudima, ugrađenog u standard. Svaki Unicode znak povezan je s nenegativnim cijelim brojem koji se naziva njegova kodna točka.
Tako je, na primjer, unicode znak U + 041F veliko ćirilično slovo P. Postoji nekoliko načina da se ovaj znak predstavi u memoriji računala, kao što postoji nekoliko tisuća načina da se prikaže na ekranu monitora. Ali u isto vrijeme P, također će biti P ili U + 041F u Africi.
Ovo je poznata inkapsulacija, ili odvajanje sučelja od implementacije, koncept koji je dobro funkcionirao u programiranju.
Ispada da se, vodeći se standardom, svaki tekst može kodirati 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 kuvertu i pošaljite u bilo koji dio svijeta. Ako znaju za postojanje Unicodea, onda će tekst percipirati na potpuno isti način kao i vi i ja. Neće imati ni najmanje sumnje da je predzadnji znak upravo mala ćirilica e(U + 0435) ne reci latinica mala e(U + 0065). Imajte na umu da nismo rekli ni riječi o bajt reprezentaciji.
Unicode kodni prostor
Unicode kodni prostor sastoji se od 1 114 112 kodnih točaka, u rasponu od 0 do 10FFFF. Od toga je samo 128 237 dodijeljeno vrijednosti za devetu verziju standarda. Dio prostora rezerviran je za privatnu upotrebu, a Unicode konzorcij obećava da nikada neće dodijeliti vrijednosti pozicijama iz ovih posebnih područja.
Radi praktičnosti, cijeli je prostor podijeljen na 17 ravnina (sada ih je uključeno šest). Donedavno je bilo uobičajeno reći da ćete se najvjerojatnije morati suočiti samo s osnovnom višejezičnom ravninom (BMP), koja uključuje Unicode znakove od U + 0000 do U + FFFF. (Gledajući malo unaprijed: BMP znakovi su predstavljeni u UTF-16 u dva bajta, a ne u četiri). U 2016. ta teza je već u dvojbi. Tako se, na primjer, popularni Emoji znakovi mogu naći u korisničkoj poruci i morate ih moći ispravno obraditi.
Kodiranja
Ako želimo slati tekst putem Interneta, onda moramo kodirati niz unicode znakova kao slijed bajtova.
Unicode standard uključuje niz Unicode kodiranja, kao što su UTF-8 i UTF-16BE / UTF-16LE, koji omogućuju kodiranje cijelog prostora kodnih točaka. Pretvorba između ovih kodiranja može se slobodno izvesti bez gubitka informacija.
Također, nitko nije otkazao jednobajtna kodiranja, ali oni vam omogućuju da kodirate svoj pojedinačni i vrlo uski dio Unicode spektra - 256 ili manje kodnih točaka. Za takva kodiranja postoje tablice koje su dostupne svima, gdje je svaka vrijednost jednog bajta pridružena unicode znaku (vidi, na primjer, CP1251.TXT). Unatoč ograničenjima, jednobajtna kodiranja pokazuju se vrlo praktičnim kada je u pitanju rad s velikim nizom jednojezičnih tekstualnih informacija.
UTF-8 je najčešće korišteno Unicode kodiranje na Internetu (osvojio je palmu 2008. godine), uglavnom zbog svoje ekonomičnosti i transparentne kompatibilnosti sa sedmobitnim ASCII-jem. Latinski i službeni znakovi, osnovni interpunkcijski znakovi i brojevi – t.j. svi sedmobitni ASCII znakovi su kodirani u UTF-8 u jednom bajtu, isto kao u ASCII. Znakovi mnogih glavnih pisama, osim nekih rjeđih hijeroglifskih znakova, u njemu su predstavljeni s dva ili tri bajta. Najveća kodna točka definirana standardom, 10FFFF, kodirana je u četiri bajta.
Imajte na umu da je UTF-8 kodiranje promjenjive duljine. Svaki Unicode znak u njemu predstavljen je nizom kvanta koda s minimalnom duljinom od jednog kvanta. Broj 8 označava bitnu duljinu kodne jedinice - 8 bita. Za UTF-16 obitelj kodiranja, veličina kvanta koda je 16 bita. Za UTF-32 - 32 bita.
Ako putem mreže šaljete HTML stranicu s ćiriličnim tekstom, onda UTF-8 može dati vrlo opipljivu korist, jer sve oznake kao i JavaScript i CSS blokovi bit će učinkovito kodirani u jednom bajtu. Na primjer, glavna stranica Habra u UTF-8 je 139Kb, a u UTF-16 je već 256Kb. Za usporedbu, ako koristite win-1251 uz gubitak mogućnosti pohrane nekih znakova, tada će se veličina smanjiti za samo 11Kb.
Za pohranu podataka o nizovima u aplikacijama često se koriste 16-bitna unicode kodiranja zbog njihove jednostavnosti, kao i činjenice da su znakovi glavnih svjetskih sustava pisanja kodirani u jednom šesnaest-bitnom kvantu. Tako, na primjer, Java uspješno koristi UTF-16 za interni prikaz stringova. Operativni sustav Windows također interno koristi UTF-16.
U svakom slučaju, sve dok ostajemo u Unicode prostoru, nije zapravo važno kako su informacije o nizovima pohranjene unutar jedne aplikacije. Ako vam format interne pohrane omogućuje ispravno kodiranje svih više od milijun kodnih točaka i nema gubitka informacija na granici aplikacije, na primjer, prilikom čitanja iz datoteke ili kopiranja u međuspremnik, onda je sve u redu.
Za ispravnu interpretaciju teksta pročitanog s diska ili iz mrežne utičnice, prvo morate odrediti njegovo kodiranje. To se radi ili korištenjem meta informacija koje je dostavio korisnik, napisanih u tekstu ili blizu njega, ili se određuje heuristički.
U suhom ostatku
Informacija je puno i ima smisla dati kratak sažetak svega što je gore napisano:
- Unicode postulira jasnu razliku između znakova, njihovog prikaza na računalu i njihovog prikaza na izlaznom uređaju.
- Unicode kodni prostor sastoji se od 1 114 112 kodnih točaka, u rasponu od 0 do 10FFFF.
- Osnovna višejezična ravnina uključuje Unicode znakove U + 0000 do U + FFFF, koji su kodirani u UTF-16 u dva bajta.
- Bilo koje Unicode kodiranje omogućuje vam kodiranje cijelog prostora Unicode kodnih točaka i pretvorba između različitih takvih kodiranja se provodi bez gubitka informacija.
- Jednobajtna kodiranja mogu kodirati samo mali dio unicode spektra, ali mogu biti korisna pri radu s velikom količinom jednojezičnih informacija.
- UTF-8 i UTF-16 kodiranja imaju promjenjive duljine koda. U UTF-8, svaki Unicode znak može biti kodiran s jednim, dva, tri ili četiri bajta. U UTF-16, dva ili četiri bajta.
- Interni format pohrane tekstualnih informacija unutar zasebne aplikacije može biti proizvoljan, pod uvjetom da ispravno radi s cijelim prostorom Unicode kodnih točaka i da nema gubitka u prekograničnom prijenosu podataka.
Kratka napomena o kodiranju
Može doći do zabune s pojmom kodiranje. Unutar Unicodea, kodiranje se događa dvaput. Prvi put kada se kodira skup znakova, u smislu da je svakom Unicode znaku dodijeljena odgovarajuća kodna točka. Ovaj proces pretvara Unicode skup znakova u kodirani skup znakova. Drugi put kada se niz unicode znakova pretvara u niz bajtova, ovaj se proces također naziva kodiranjem.
U engleskoj terminologiji postoje dva različita glagola kodirati i kodirati, ali čak su i izvorni govornici često zbunjeni oko njih. Osim toga, izraz skup znakova ili skup znakova koristi se kao sinonim za pojam kodirani skup znakova.
Sve to govorimo o tome da ima smisla obratiti pozornost 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 Unicodea da je nemoguće pokriti sve u jednom članku. I nepotrebno. Gore navedene informacije dovoljne su da se izbjegne zabuna u osnovnim principima i rad s tekstom u većini svakodnevnih zadataka (čitaj: bez napuštanja BMP-a). U sljedećim ćemo člancima 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 računalnu obradu tekstualnih podataka.
Unicode ne samo da dodjeljuje jedinstveni kod svakom znaku, već također definira različite karakteristike tog znaka, na primjer:
vrsta znaka (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, respektivno);
odgovarajuću brojčanu vrijednost (za numeričke znakove).
Standardi UTF(kratica za Unicode Transformation Format) za predstavljanje znakova:
UTF-16: Podešavanje sustava Windows, ubrzavanje, FAQ Vista koristi UTF-16 kodiranje za predstavljanje svih Unicode znakova. U UTF-16 znakovi su predstavljeni s dva bajta (16 bita). Ovo se kodiranje koristi u Windowsima jer 16-bitne vrijednosti mogu predstavljati znakove koji čine abecede većine jezika na svijetu, što omogućuje programima da obrađuju nizove i brže izračunavaju njihovu duljinu. Međutim, 16-bit nije dovoljan za predstavljanje abecednih znakova u nekim jezicima. U takvim slučajevima, UTE-16 podržava "surogat" kodiranja, dopuštajući kodiranje znakova u 32 bita (4 bajta). Međutim, malo je aplikacija koje se moraju nositi sa znakovima takvih jezika, pa je UTF-16 dobar kompromis između uštede memorije i jednostavnosti programiranja. Imajte na umu da .NET Framework kodira sve znakove koristeći 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 s 1, 2, 3 ili 4 bajta. Znakovi s 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 europskim i bliskoistočnim alfabetima. Znakovi s većim vrijednostima pretvaraju se u vrijednosti od 3 bajta, što je korisno za rad sa srednjoazijskim jezicima. Konačno, surogat parovi su zapisani u 4-bajtnom formatu. UTF-8 je iznimno popularno kodiranje. Međutim, manje je učinkovit od UTF-16 ako se često koriste znakovi s vrijednostima 0x0800 i više.
UTF-32: U UTF-32, svi znakovi su predstavljeni s 4 bajta. Ovo kodiranje je prikladno za pisanje jednostavnih algoritama za nabrajanje znakova na bilo kojem jeziku koji ne zahtijevaju obradu znakova predstavljenih različitim brojem bajtova. Na primjer, kada koristite UTF-32, možete zaboraviti na "surogate", budući da je svaki znak u ovom kodiranju predstavljen s 4 bajta. Jasno, sa stajališta korištenja memorije, učinkovitost UTF-32 je daleko od idealne. Stoga se ovo kodiranje rijetko koristi za prijenos nizova preko mreže i njihovo spremanje u datoteke. Obično se UTF-32 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 "izvedeno" kodiranje koristi nizove bajtova različitih duljina (od jednog do šest) za pisanje znakova, koji se pretvaraju u Unicode kodove pomoću jednostavnog algoritma, s kraćim nizovima koji odgovaraju uobičajenijim znakovima. Glavna prednost ovog formata je kompatibilnost s ASCII ne samo u vrijednostima kodova, već i u broju bitova po znaku, budući da je jedan bajt dovoljan za kodiranje bilo kojeg od prvih 128 znakova u UTF-8 (iako je , na primjer, za ćirilična slova, dva bajta).
Format UTF-8 izumili su 2. rujna 1992. Ken Thompson i Rob Pike i implementirali ga u Plan 9. UTF-8 standard je sada formaliziran u RFC 3629 i ISO / IEC 10646 Aneks D.
Za web dizajnera, ovo je kodiranje od posebne važnosti, jer je upravo ono deklarirano kao "standardno kodiranje dokumenta" u HTML-u od verzije 4.
Tekst koji sadrži samo znakove s brojevima manjim od 128 pretvara se u običan ASCII tekst kada je napisan u UTF-8. Suprotno tome, u tekstu UTF-8, svaki bajt s vrijednošću manjom od 128 predstavlja ASCII znak s istim kodom. Ostatak Unicode znakova predstavljen je nizovima dugim od 2 do 6 bajta (zapravo samo do 4 bajta, budući da nije planirano korištenje kodova većih od 221), u kojima prvi bajt uvijek izgleda kao 11xxxxxx, a ostatak - 10xxxxxx.
Jednostavno rečeno, u UTF-8 formatu, latinični znakovi, interpunkcija i ASCII kontrolni znakovi su napisani u US-ASCII kodovima, a svi ostali znakovi su kodirani pomoću nekoliko okteta s najvažnijim bitom 1. To ima dva učinka.
Čak i ako program ne prepozna Unicode, latinična slova, arapski brojevi i interpunkcijski znakovi bit će prikazani ispravno.
Ako latinična slova i jednostavni interpunkcijski znakovi (uključujući razmak) zauzimaju značajnu količinu teksta, UTF-8 daje veći volumen u usporedbi s UTF-16.
Na prvi pogled može se činiti da je UTF-16 prikladniji, budući da je većina znakova kodirana u točno dva bajta. Međutim, to je negirano potrebom za podrškom surogat parova, koji se često zanemaruju kada se koristi UTF-16, implementirajući samo podršku za UCS-2 znakove.
Standard je 1991. godine predložio Unicode Consortium, Unicode Inc., neprofitna organizacija. Korištenje ovog standarda omogućuje kodiranje vrlo velikog broja znakova iz različitih pisama: kineski znakovi, matematički znakovi, slova grčke abecede, latinice i ćirilice mogu koegzistirati u Unicode dokumentima, tako da mijenjanje kodnih stranica postaje nepotrebno.
Standard se sastoji od dva glavna odjeljka: univerzalnog skupa znakova (UCS) i Unicode formata transformacije (UTF). Univerzalni skup znakova definira jedan-na-jedan korespondenciju znakova kodovima - elementima kodnog prostora koji predstavljaju nenegativne cijele brojeve. Obitelj kodiranja definira strojni prikaz niza UCS kodova.
Unicode standard razvijen je s ciljem stvaranja jedinstvenog kodiranja znakova za sve moderne i mnoge drevne pisane jezike. Svaki znak u ovom standardu je kodiran u 16 bita, što mu omogućuje da pokrije neusporedivo veći broj znakova od prethodno prihvaćenih 8-bitnih kodiranja. Još jedna važna razlika između Unicodea i drugih sustava kodiranja je da ne samo da svakom znaku dodjeljuje jedinstveni kod, već također definira različite karakteristike ovog znaka, na primjer:
Vrsta znaka (veliko slovo, malo slovo, broj, interpunkcijski znak itd.);
Atributi znakova (zaslon slijeva nadesno ili zdesna nalijevo, razmak, prijelom reda, itd.);
Odgovarajuće veliko ili malo slovo (za mala i velika slova, respektivno);
Odgovarajuća brojčana vrijednost (za numeričke znakove).
Cijeli raspon kodova od 0 do FFFF podijeljen je u nekoliko standardnih podskupova, od kojih svaki odgovara ili abecedi određenog jezika, ili skupini posebnih znakova koji su slični u svojim funkcijama. Dijagram u nastavku daje opći popis Unicode 3.0 podskupova (slika 2).
Slika 2
Unicode standard je osnova za pohranu i tekst u mnogim modernim računalnim sustavima. Međutim, nije kompatibilan s većinom internetskih protokola, budući da njegovi kodovi mogu sadržavati bilo koje vrijednosti bajta, a protokoli obično koriste bajtove 00 - 1F i FE - FF kao nadređene. Za postizanje interoperabilnosti razvijeno je nekoliko Unicode transformacijskih formata (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 (jedan do tri) prikladnih za prijenos internetskim protokolima.
Ovdje x, y, z označavaju bitove izvornog koda koje treba izdvojiti, počevši od najmanje značajnog, i unijeti u bajtove rezultata s desna na lijevo dok se ne popune sva navedena mjesta.
Daljnji razvoj Unicode standarda povezan je s dodavanjem novih jezičnih ravnina, t.j. znakova u rasponima 10000 - 1FFFF, 20000 - 2FFFF, itd., gdje bi trebalo uključiti kodiranje za pisma mrtvih jezika koja nisu uključena u gornju tablicu. Za kodiranje ovih dodatnih znakova razvijen je novi UTF-16 format.
Dakle, postoje 4 glavna načina kodiranja Unicode bajtova:
UTF-8: 128 znakova je kodirano u jednom bajtu (ASCII format), 1920 znakova je kodirano u 2 bajta ((rimski, grčki, ćirilični, koptski, armenski, hebrejski, arapski znakovi), 63488 znakova je kodirano u 3 bajta (kineski , japanski i drugi) Preostalih 2.147.418.112 znakova (još nisu korišteni) mogu se kodirati s 4, 5 ili 6 bajtova.
UCS-2: Svaki znak je predstavljen s 2 bajta. Ovo kodiranje uključuje samo prvih 65.535 znakova iz Unicode formata.
UTF-16: Ovo je proširenje za UCS-2 i uključuje 1 114 112 Unicode znakova. Prvih 65.535 znakova predstavljeno je s 2 bajta, a ostali s 4 bajta.
USC-4: Svaki znak je kodiran u 4 bajta.