Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Zanimljivo
  • Međunarodni unicode standard. Zašto vam je trebao Unicode? Kratka napomena o kodiranju

Međunarodni unicode standard. Zašto vam je trebao Unicode? Kratka napomena o kodiranju

Unicode je međunarodni standard za kodiranje znakova koji omogućava konzistentan prikaz teksta na bilo kojem računaru u svijetu, bez obzira na jezik njegovog sistema.

Osnove

Da bismo razumeli čemu služi Unicode tabela znakova, hajde da prvo razumemo mehanizam za prikazivanje teksta na ekranu monitora. Računar, kao što znamo, obrađuje sve informacije digitalni oblik, a da bi se to prikazalo radi ispravne percepcije od strane osobe trebalo bi da bude na grafiku. Dakle, da bismo pročitali ovaj tekst, potrebno je riješiti najmanje dva zadatka:

Prva kodiranja

Američki ASCII se smatra pretkom svih kodiranja. Opisana je upotreba u engleski jezik Latinica sa znakovima interpunkcije i arapskim brojevima. Upravo je 128 znakova korištenih u njemu postalo osnova za kasniji razvoj - čak ih i moderna Unicode tablica znakova koristi. Od tada, slova latinice zauzimaju prve pozicije u bilo kojem kodiranju.

Ukupno, ASCII je omogućio pohranjivanje 256 znakova, ali budući da je prvih 128 bilo zauzeto latiničnim pismom, preostalih 128 je počelo da se koristi širom svijeta za kreiranje nacionalnih standarda. Na primjer, u Rusiji su na njegovoj osnovi stvoreni CP866 i KOI8-R. Takve varijacije nazvane su proširene verzije ASCII-a.

Kodne stranice i "krakozyabry"

Dalji razvoj tehnologije i pojava grafičkog interfejsa doveli su do toga da je ANSI kodiranje kreirao Američki institut za standarde. ruski korisnici, posebno sa iskustvom, njena verzija je poznata pod Windows ime 1251. Njime je po prvi put uveden koncept „kodne stranice“. Uz pomoć kodnih stranica, koje su sadržavale simbole drugih nacionalnih pisama osim latinice, uspostavljeno je "međusobno razumijevanje" između računara koji se koriste u različitim zemljama.

Međutim, prisustvo veliki broj različita kodiranja koja se koriste za isti jezik počela su stvarati probleme. Pojavio se takozvani krakozyabry. Oni su nastali zbog neusklađenosti između originalne kodne stranice, u kojoj su kreirane bilo kakve informacije, i kodne stranice koja se standardno koristi na računaru krajnjeg korisnika.

Kao primjer, gore navedeno ćiriličnim kodovima CP866 i KOI8-R. Slova u njima su se razlikovala po pozicijama koda i principima postavljanja. U prvom su smješteni abecedni red, au drugom - u proizvoljnom. Možete zamisliti šta se dešavalo pred očima korisnika koji je pokušao da otvori takav tekst a da nije imao potrebnu kodnu stranicu ili kada ga je računar pogrešno protumačio.

Kreiranje Unicode-a

Proliferacija interneta i srodnih tehnologija kao npr Email, dovelo je do toga da je na kraju situacija sa iskrivljavanjem tekstova svima prestala da odgovara. Vodeće IT kompanije su formirale Unicode konzorcijum. Tabela znakova koju je predstavio 1991. godine pod imenom UTF-32 mogla je pohraniti preko milijardu jedinstvenih znakova. Bilo je ključni korak na putu dešifrovanja tekstova.

Međutim, prva univerzalna Unicode tabela kodova znakova, UTF-32, nije bila široko prihvaćena. Glavni razlog je bio redundantnost pohranjenih informacija. Brzo je izračunato da bi za zemlje koje koriste latinicu kodiranu novom univerzalnom tabelom, tekst zauzimao četiri puta više prostora nego kada se koristi proširena ASCII tabela.

Razvoj Unicode-a

Sljedeća tablica Unicode UTF-16 znakova je riješila ovaj problem. Kodiranje u njemu je obavljeno u pola broja bitova, ali se istovremeno smanjio i broj mogućih kombinacija. Umjesto milijardi znakova, pohranjuje samo 65 536. Ipak, bio je toliko uspješan da je Konzorcij odlučio da se ovaj broj definira kao osnovni prostor za skladištenje Unicode znakova.

Uprkos ovom uspjehu, UTF-16 nije odgovarao svima, budući da je količina pohranjenih i prenesene informacije i dalje je bio udvostručen. Rešenje na jednom mestu postao UTF-8, tabela Unicode znakova promjenjive dužine. Ovo se može nazvati probojom u ovoj oblasti.

Tako je uvođenjem posljednja dva standarda Unicode tablica znakova riješila problem jedinstvenog kodnog prostora za sve fontove koji se danas koriste.

Unicode za ruski

Hvala za varijabilna dužina od koda koji se koristi za prikaz znakova, latinica je kodirana u Unicode-u na isti način kao u svom pretku ASCII, odnosno u jednom bitu. Za druge alfabete, slika može izgledati drugačije. Na primjer, znakovi gruzijske abecede koriste tri bajta za kodiranje, a znakovi ćiriličnog pisma koriste dva. Sve je to moguće u okviru korištenja UTF-8 Unicode standarda (tablica znakova). Ruski jezik ili ćirilično pismo zauzima 448 pozicija u ukupnom kodnom prostoru, podeljenom u pet blokova.

Ovih pet blokova obuhvataju osnovnu ćirilicu i crkvenoslovensko pismo, kao i dodatna slova drugim jezicima koji koriste ćirilicu. Za prikaz starih oblika predstavljanja ćiriličnog slova je istaknut veći broj pozicija, a 22 pozicije od ukupnog broja su još slobodne.

Trenutna verzija Unicode-a

Rešenjem svog primarnog zadatka, a to je standardizacija fontova i stvaranje jedinstvenog kodnog prostora za njih, "Konzorcijum" nije prekinuo rad. Unicode se stalno razvija i širi. Posljednja trenutna verzija ovog standarda, 9.0, objavljena je 2016. godine. Uključio je šest dodatnih abeceda i proširio listu standardiziranih emojija.

Moram reći da se radi pojednostavljenja istraživanja u Unicode dodaju čak i takozvani mrtvi jezici. Ovo ime su dobili jer ne postoje ljudi za koje bi on bio rođen. U ovu grupu spadaju i jezici koji su do našeg vremena došli samo u obliku pisanih spomenika.

U principu, svako se može prijaviti za dodavanje znakova u novu Unicode specifikaciju. Istina, za to ćete morati popuniti pristojnu količinu izvornih dokumenata i potrošiti puno vremena. Živi primjer za to je priča o programeru Terenceu Edenu. 2013. godine podnio je zahtjev za uvrštavanje u specifikaciju simbola koji se odnose na označavanje dugmadi za kontrolu napajanja računara. V tehnička dokumentacija postoje od sredine 1970-ih, ali nisu bili dio Unicode-a sve do specifikacije 9.0.

tabela simbola

Svaki računar, bez obzira na operativni sistem koji se koristi, koristi Unicode tablicu znakova. Kako koristiti ove tabele, gdje ih pronaći i zašto mogu biti korisne običnom korisniku?

U OS Windows stol simboli se nalaze u odeljku "Servis" menija. U porodici operacionih sala Linux sistemi obično se može naći u pododjeljku "Standard", a na MacOS-u pod postavkama tastature. Glavna svrha ove tabele je da uđe tekstualni dokumenti znakova koji se ne nalaze na tastaturi.

Najšira primjena za takve tabele može se naći: od unošenja tehničkih simbola i nacionalnih ikona monetarni sistemi prije nego što napišete upute za praktična primjena tarot karte.

Konačno

Unicode se koristi svuda i ušao je u naš život zajedno sa razvojem interneta i mobilnih tehnologija. Zahvaljujući njegovoj upotrebi, sistem međuetničkih komunikacija značajno je pojednostavljen. Možemo reći da je uvođenje Unicodea indikativan, ali spolja potpuno nevidljiv primjer korištenja tehnologije za opće dobro cijelog čovječanstva.

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

Unicode je skup grafički simboli i način da ih kodirate kompjuterska obrada tekstualni podaci.

Unicode ne samo da dodjeljuje svakom znaku jedinstveni kod ali i definiše razne karakteristike ovaj simbol, 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 odnosno);

    prikladno numerička vrijednost(za numeričke znakove).

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

UTF-16: Podešavanje Windowsa, ubrzavanje, najčešća pitanja o Visti za predstavljanje svima Unicode znakovi Koristi se UTF-16 kodiranje. 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 obrađuju nizove i brže izračunavaju njihovu dužinu. Međutim, 16-bitno 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 aplikacije 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 korisno za rad sa srednjoazijskim jezicima. Konačno, surogat parovi se pišu 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 i više.

UTF-32: U UTF-32, svi znakovi su predstavljeni sa 4 bajta. Ovo kodiranje je lako napisati jednostavni algoritmi za ponavljanje znakova bilo kojeg jezika koji ne zahtijevaju obradu znakova predstavljenih različitim brojem 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, sa stanovišta upotrebe memorije, efikasnost 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, sve više važnu uloguće reproducirati poseban Unicode (i ISO 10646) format tzv UTF-8... Ovo "izvedeno" 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 vrijednostima kodova, već iu broju bitova po znaku, jer je jedan bajt dovoljan za kodiranje bilo kojeg od prvih 128 znakova u UTF-8 (iako , na primjer, za ćirilična slova, dva bajta).

UTF-8 format su izmislili Ken Thompson i Rob Pike 2. septembra 1992. godine i implementiran u Plan 9. UTF-8 standard je sada formaliziran u RFC 3629 i ISO / IEC 10646 Aneks D.

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

Tekst koji sadrži samo znakove s brojem manjim od 128, kada je napisan u UTF-8, pretvara se u običan tekst ASCII. Suprotno tome, u UTF-8 tekstu, svaki bajt sa vrijednošću manjom od 128 predstavlja ASCII znak sa istim kodom. Ostatak Unicode znakova predstavljen je nizovima dužine od 2 do 6 bajta (zapravo samo do 4 bajta, jer 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, znaci interpunkcije i kontrola ASCII znakovi su napisani u US-ASCII kodovima, a svi ostali znakovi su kodirani pomoću nekoliko okteta sa najvažnijim bitom od 1. Ovo ima dva efekta.

    Čak i ako program ne prepoznaje Unicode, onda pisma, arapski brojevi i znakovi interpunkcije će se ispravno prikazati.

    Ako latinična slova i jednostavni znaci interpunkcije (uključujući razmak) zauzimaju značajnu količinu teksta, UTF-8 daje veći volumen u odnosu na UTF-16.

    Na prvi pogled može izgledati da je UTF-16 praktičniji, jer je većina znakova kodirana u tačno dva bajta. Međutim, ovo je negirano potrebom da se podrže surogat parovi, 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. Upotreba ovog standarda omogućava kodiranje vrlo veliki broj znakovi iz različitih pisama: kineski znakovi mogu koegzistirati u Unicode dokumentima, matematičkih simbola, slova grčkog alfabeta, latinice i ćirilice, stoga postaje nepotrebno mijenjati kodne stranice.

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. 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 u 16 bita, što mu omogućava neuporedivo pokrivanje velika količina znakova od prethodno prihvaćenih 8-bitnih kodiranja. Drugi važna razlika Unicode iz drugih sistema kodiranja je da ne samo da svakom karakteru dodeljuje jedinstveni kod, već i definiše različite karakteristike tog znaka, na primer:

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ća numerička vrijednost (za numeričke znakove).

Cijeli raspon kodova od 0 do FFFF podijeljen je u nekoliko standardnih podskupova, od kojih svaki odgovara ili alfabetu jezika ili grupi specijalni znakovi, slične po svojim funkcijama. Dijagram ispod daje opšti popis Unicode 3.0 podskupova (slika 2).

Slika 2

Unicode standard je osnova za pohranu i tekst u mnogim modernim kompjuterski sistemi... Međutim, nije kompatibilan sa većinom Internet protokola, budući da njegovi kodovi mogu sadržavati bilo koje vrijednosti bajtova, a protokoli obično koriste bajtove 00 - 1F i FE - FF kao nadjačavanje. Da bi se postigla interoperabilnost, razvijeno je nekoliko Unicode formata transformacije (UTF, Unicode Transformation Formats), od kojih je UTF-8 danas najčešći. Ovaj format definira slijedeći pravila pretvaranje svakog Unicode koda u skup bajtova (jedan do tri) koji se mogu prenositi Internet 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 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, novi format UTF-16.

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 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 za 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 u 4 bajta.

Vjerovali ili ne, postoji format slike ugrađen u pretraživač. Ovaj format vam omogućava da učitate slike prije nego što zatrebaju, omogućava renderiranje slike na uobičajeni ili retina ekrani i omogućava vam da dodate na CSS slike... OK, to nije sasvim tačno. Ovo nije omjer stranica, iako sve ostalo ostaje isto. Koristeći ga, možete kreirati ikone neovisne o rezoluciji za koje nije potrebno vrijeme za učitavanje i koje su stilizirane koristeći CSS.

Šta je Unicode?

Unicode je mogućnost ispravnog prikaza slova i interpunkcije iz različitim jezicima na jednoj stranici. Neverovatno je korisno: korisnici će moći da komuniciraju sa vašom veb lokacijom širom sveta i ona će pokazati šta želite - može biti francuski sa akcentima ili kanji.

Unicode nastavlja da se razvija: sada je relevantna verzija 8.0, u kojoj ima više od 120 hiljada znakova (u originalnom članku, objavljenom početkom 2014., radilo se o verziji 6.3 i 110 hiljada znakova).

Osim slova i brojeva, u Unicode-u postoje i drugi simboli i ikone. V najnovije verzije ovo uključuje emojis koje možete vidjeti u iOS messengeru.

HTML stranice se kreiraju od niza Unicode znakova i konvertuju se u bajtove kada se šalju preko mreže. Svako slovo i svaki znak bilo kojeg jezika ima svoj jedinstveni kod i kodira se kada se datoteka pohrani.

Kada koristite sistem kodiranja UTF-8, možete direktno umetnuti Unicode znakove u tekst, ali ih možete dodati i tekstu navodeći digitalnu simboličku vezu. Na primjer, ovo je simbol srca i možete prikazati taj simbol jednostavnim dodavanjem koda u oznaku.

Ova numerička referenca može biti navedena u decimalnom ili heksadecimalnom formatu. Decimalni format zahtijeva dodavanje x na početku, notacija će dati isto srce () kao prethodna opcija... (2665 je heksadecimalna verzija 9829).

Ako dodajete Unicode znak koristeći CSS, tada možete koristiti samo heksadecimalne vrijednosti.

Neki od najčešće korišćenih Unicode znakova imaju više pamtljivih tekstualnih imena ili skraćenica umjesto numeričkih kodova, kao što je ampersand (& - &). Takvi simboli se nazivaju mnemonika u HTML-u, kompletna lista je dostupna na Wikipediji.

Zašto biste trebali koristiti Unicode?

Dobro pitanje, evo nekoliko razloga:

  1. Za korištenje ispravnih znakova iz različitim jezicima.
  2. Za zamjenu ikona.
  3. Za zamjenu ikona povezanih putem @ font-face.
  4. Za definiranje CSS klasa

Važeći znakovi

Prvi od razloga ne zahtijeva nikakav dodatne radnje... Ako je HTML sačuvan u UTF-8 formatu i njegovo kodiranje se prenosi preko mreže kao UTF-8, sve bi trebalo da radi kako treba.

Mora. Nažalost, ne podržavaju svi pretraživači i uređaji sve Unicode znakove na isti način (tačnije, ne podržavaju svi fontovi full set znakova). Na primjer, nedavno dodani emoji znakovi nisu svugdje podržani.

Za podršku za UTF-8 u HTML5 dodaj (ako nemate pristup postavkama servera, trebali biste dodati ). Stari doctype koristi ( ).

Ikone

Drugi razlog za korištenje Unicode-a je taj što postoji mnogo korisnih simbola koji se mogu koristiti kao ikone. Na primjer, ≡ i.

Njihov očigledan plus je što vam ništa ne treba dodatni fajlovi da ih dodate na stranicu, što znači da će vaša stranica biti brža. Također možete promijeniti njihovu boju ili dodati sjenku koristeći CSS. I dodavanjem prijelaza ( css prijelaz) možete glatko promijeniti boju ikone kada pređete mišem preko nje bez ikakvih ikakvih ikakvih ikakvih promjena dodatne slike.

Recimo da želim uključiti indikator ocjene u zvjezdicama na svojoj stranici. mogu to ovako:

★ ★ ★ ☆ ☆

Dobijate sljedeći rezultat:

Ali ako nemate sreće, vidjet ćete nešto poput ovoga:

Ista ocjena na BlackBerryju 9000

Ovo se dešava ako se upotrijebljeni znakovi ne nalaze u fontu pretraživača ili uređaja (srećom, ove zvjezdice su savršeno podržane i stare BlackBerry telefoni su jedini izuzetak ovde).

Ako nema Unicode znaka, na njegovom mjestu mogu biti različiti znakovi od praznog kvadrata (□) do romba sa upitnikom (�).

Kako pronaći Unicode znak koji bi mogao funkcionirati za vaš dizajn? Možete ga potražiti na web-stranici kao što je Unicodinator gledajući dostupne znakove, ali postoji također najbolji način... - ova sjajna stranica vam omogućava da nacrtate ikonu koju tražite, a zatim vam nudi listu sličnih Unicode znakova.

Korištenje Unicodea sa ikonama sa fontom @

Ako koristite ikone koje se povezuju s vanjskim fontom putem @ font-face, Unicode znakovi se mogu koristiti kao rezervni. Na ovaj način možete prikazati sličan Unicode znak na uređajima ili pretraživačima gdje @ font-face nije podržan:

Na lijevoj strani su ikone Font Awesome u Chromeu, a na desnoj su njihove Unicode zamjene u Opera Mini.

Mnogi @ font-face alati za podudaranje koriste niz Unicode znakova iz područja privatne upotrebe. Problem s ovim pristupom je u tome što ako @ font-face nije podržan, kodovi znakova se prosljeđuju korisniku bez ikakvog značenja.

Odlično za kreiranje skupova ikona u @ font-face i omogućava vam da odaberete odgovarajući Unicode karakter kao osnovu za ikonu.

Ali budite oprezni - neki pretraživači i uređaji ne vole pojedinačni likovi Unicode kada se koristi sa @ font-face. Ima smisla testirati podršku za Unicode znakove uz Unify - ova aplikacija će vam pomoći da odredite koliko je bezbedno koristiti znak u skupu ikona @ font-face.

Podrška za Unicode znakove

Glavni problem sa korištenjem Unicode znakova kao rezervnog je loša podrška u čitačima ekrana (opet, neke informacije o tome možete pronaći na Unifyju), pa je važno pažljivo odabrati znakove koje koristite.

Ako je vaša ikona samo dekorativni element pored tekstualne oznake koju čita čitač ekrana, ne morate previše brinuti. Ali ako je ikona sama za sebe, vrijedi dodati skrivenu tekstualnu oznaku kako bi pomogli korisnicima čitača ekrana. Čak i ako čitač ekrana pročita Unicode znak, postoji šansa da će biti veoma različit od svoje namjene. Na primjer, ≡ (≡) kao ikona hamburgera će VoiceOver na iOS-u čitati kao "identičan".

Unicode u CSS imenima klasa

Činjenica da se Unicode može koristiti u nazivima klasa i stilovima poznata je od 2007. Tada je Jonathan Snook pisao o upotrebi Unicode znakova u pomoćnim klasama prilikom kucanja zaobljenih uglova. Ova ideja nije dobila veliku distribuciju, ali vrijedi znati o mogućnosti korištenja Unicodea u nazivima klasa (posebni znakovi ili ćirilica).

Odabir fonta

Nekoliko fontova podržava cijeli skup Unicode znakova, stoga provjerite znakove koje želite kada birate font.

Mnogo ikona u Segoe UI Symbol ili Arial Unicode MS. Ovi fontovi su dostupni i na PC-u i na Mac-u; Lucida Grande također ima priličnu količinu Unicode znakova. Možete dodati ove fontove u svoju deklaraciju porodice fontova kako biste to osigurali maksimalan broj Unicode znakovi za korisnike koji imaju instalirane ove fontove.

Određivanje podrške za Unicode

Bilo bi sjajno moći provjeriti prisustvo određenog Unicode znaka, ali ne postoji zajamčen način da se to učini.

Unicode znakovi mogu biti efikasni uz podršku. Na primjer, emotikon u naslovnoj liniji ga izdvaja od ostalih poštansko sanduče.

Zaključak

Ovaj članak pokriva samo osnove Unicode-a. Nadam se da će vam pomoći da bolje razumete Unicode i da ga efikasno koristite.

Lista linkova

  • (generator skupa ikona @ font-face baziran na Unicodeu)
  • Shape Catcher (unicode alat za prepoznavanje znakova)
  • Unicode (Unicode tablica znakova)
  • Unify (Provjerite podršku za Unicode znakove u pretraživačima)
  • Unitools (kolekcija alata za rad sa Unicodeom)

Ni meni se baš ne sviđaju naslovi poput "Pokemoni u vlastitom soku za lutke/lonce/tave", ali čini se da je to baš tako - pričat ćemo o osnovnim stvarima, rad s kojima često vodi u pretinac punog neravnine i puno izgubljenog vremena oko pitanja - Zašto ne radi? Ako se još uvijek bojite i/ili ne razumijete Unicode, molimo vas pod kat.

Zašto?

Glavno pitanje za početnika koji se suočava sa impresivnim brojem kodiranja i naizgled zbunjujućim mehanizmima za rad s njima (na primjer, u Pythonu 2.x). Kratak odgovor je zato što se desilo :)

Kodiranje, ko ne zna, je način predstavljanja u memoriji računara (čitaj - u nula-jedinicama/brojevima) cifara, bukva i svih ostalih znakova. Na primjer, razmak je predstavljen kao 0b100000 (binarno), 32 (u decimalnom) ili 0x20 (u heksadecimalni sistem obračun).

Dakle, nekada je bilo jako malo memorije i svi kompjuteri su imali dovoljno 7 bita da predstave sve potrebne znakove (brojeve, mala/velika latinica, gomila znakova i tzv. kontrolisanih znakova - svih mogućih 127 brojeva je nekome dato) . U to vrijeme postojao je samo jedan kodiranje - ASCII. Kako je vrijeme odmicalo, svi su bili sretni, a ko nije bio zadovoljan (čitaj - kome je nedostajao znak "" ili izvorno slovo "u") - koristio je preostalih 128 karaktera po svom nahođenju, odnosno kreirao je nova kodiranja. Tako su se pojavili ISO-8859-1 i naši (tj. ćirilični) cp1251 i KOI8. Zajedno s njima, pojavio se i problem interpretacije bajtova poput 0b1 ******* (odnosno znakova / brojeva od 128 do 255) - na primjer, 0b11011111 u cp1251 kodiranju je naše vlastito "ja", u isto vrijeme u ISO kodiranju 8859-1 je grčki njemački Eszett (podsjeća) "ß". Kao što se i očekivalo, mrežna komunikacija i samo razmjena datoteka između različiti računari pretvorio u pakao zna-šta, uprkos činjenici da su zaglavlja poput "Content-Encoding" u HTTP protokol, e-poruke i HTML stranice su malo spasile dan.

U ovom trenutku bistri umovi su se okupili i ponudili novi standard- Unicode. Ovo je standard, a ne kodiranje - Unicode sam po sebi ne određuje kako će znakovi biti pohranjeni na tvrdom disku ili prenijeti preko mreže. Definira samo odnos između znaka i određenog broja, a format prema kojem će se ti brojevi pretvoriti u bajtove određuju Unicode kodiranja (na primjer, UTF-8 ili UTF-16). On ovog trenutka u Unicode standardu ima nešto više od 100 hiljada karaktera, dok UTF-16 može podržati preko milion (UTF-8 čak i više).

Savjetujem vam da pročitate Apsolutni minimum koji svaki programer softvera apsolutno, pozitivno mora znati o Unicodeu i skupovima znakova za više i više zabave na temu.

Pređi na stvar!

Naravno, postoji podrška za Unicode u Pythonu. Ali, nažalost, samo u Pythonu 3 svi nizovi su postali unicode, a početnici moraju da se ubiju zbog greške poput:

>>> sa otvorenim ("1.txt") kao fh: s = fh.read () >>> print s koshchey >>> parser_result = u "baba-yaga" # zadatak radi jasnoće, zamislimo da je ovo rezultat neki parser radi >>> ", red 1, in parser_result + s UnicodeDecodeError: "ascii" kodek može "t dekodirati bajt 0xea na poziciji 0: redni broj nije u rasponu (128)
ili ovako:
>>> str (parser_result) Traceback (zadnji posljednji poziv): Fajl " ", red 1, in str (parser_result) UnicodeEncodeError: "ascii" kodek ne može "t kodirati znakove na poziciji 0-3: redni broj nije u rasponu (128)
Hajde da to shvatimo, ali redom.

Zašto bi neko koristio Unicode?
Zašto moj omiljeni html parser vraća Unicode? Neka vrati običan niz, a ja ću se tamo pozabaviti time! zar ne? Ne baš. Iako svaki od znakova koji postoje u Unicodeu može (vjerovatno) biti predstavljen u nekom jednobajtnom kodiranju (ISO-8859-1, cp1251 i drugi se nazivaju jednobajtnim, jer kodiraju bilo koji znak u tačno jedan bajt), ali šta da učiniti ako u nizu treba biti znakova iz različitih kodiranja? Dodijeliti posebno kodiranje svakom znaku? Ne, naravno da morate koristiti Unicode.
Zašto nam treba novi tip"Unicode"?
Tako smo došli do najzanimljivije stvari. Šta je string u Pythonu 2.x? To je jednostavno bajtova... Samo binarni podaci koji mogu biti bilo šta. Zapravo, kada napišemo nešto poput: >>> x = "abcd" >>> x "abcd", interpretator ne kreira varijablu koja sadrži prva četiri slova latinice, već samo niz ("a" , "b "," c "," d ") sa četiri bajta, a latinična slova se ovdje koriste isključivo za označavanje ove posebne vrijednosti bajta. Dakle, "a" je ovdje samo sinonim za "\ x61", a ne nešto više. Na primjer:

>>> "\ x61" "a" >>> struct.unpack ("> 4b", x) # "x" je samo četiri potpisana/nepotpisana znaka (97, 98, 99, 100) >>> struct.unpack ("> 2h", x) # ili dva kratka (24930, 25444) >>> struct.unpack ("> l", x) # ili jedna duga (1633837924,) >>> struct.unpack ("> f" , x) # ili float (2.6100787562286154e + 20,) >>> struct.unpack ("> d", x * 2) # dobro, ili pola duplo (1.2926117739473244e + 161,)
I to je to!

A odgovor na pitanje - zašto nam treba "unicode" je već očigledniji - potreban nam je tip koji će biti predstavljen znakovima, a ne bajtovima.

Ok, shvatio sam šta je konac. Šta je onda Unicode u Pythonu?
"Type unicode" je prvenstveno apstrakcija koja implementira ideju Unicode (skup znakova i povezanih brojeva). Objekt tipa "unicode" više nije niz bajtova, već niz stvarnih znakova bez ikakve ideje o tome kako se ti znakovi mogu efikasno pohraniti u memoriju računala. Ako želite, ovo je viši nivo apstrakcije od bajtova (ovo je ono što Python 3 naziva regularnim stringovima koji se koriste u Pythonu 2.6).
Kako da koristim Unicode?
Unicode niz u Pythonu 2.6 može se kreirati na tri (barem prirodno) načina:
  • u "" literal: >>> u "abc" u "abc"
  • Metoda "decode" za bajt niz: >>> "abc" .decode ("ascii") u "abc"
  • Funkcija "Unicode": >>> unicode ("abc", "ascii") u "abc"
ascii u posljednja dva primjera naveden je kao kodiranje koje će se koristiti za pretvaranje bajtova u znakove. Faze ove transformacije izgledaju otprilike ovako:

"\ x61" -> ascii kodiranje-> latinična mala slova "a" -> u "\ u0061" (unicode-točka za ovo slovo) ili "\ xe0" -> c1251 kodiranje -> ćirilična mala slova "a" -> u "\ u0430"

Kako dobiti običan string iz unicode stringa? Kodirajte ga:

>>> u "abc" .encode ("ascii") "abc"

Algoritam kodiranja je prirodno suprotan od gore navedenog.

Zapamtite i nemojte zbuniti - unicode == znakovi, string == bajtovi, a bajtovi -> nešto smisleno (karakteri) se dekodira, a znakovi -> bajtovi se kodiraju.

Nije kodirano :(
Pogledajmo primjere s početka članka. Kako funkcionira konkatenacija stringova i unicode nizova? Simple string mora biti konvertovan u unicode string, a pošto tumač ne zna kodiranje, koristi podrazumevano kodiranje - ascii. Ako ovo kodiranje ne uspije dekodirati niz, dobićemo ružnu grešku. U ovom slučaju, moramo sami konvertirati niz u unicode niz, koristeći ispravno kodiranje:

>>> tip ispisa (parser_result), parser_result baba-yaga >>> s = "Koschey" >>> parser_result + s Traceback (zadnji posljednji poziv): Fajl " ", red 1, in parser_result + s UnicodeDecodeError: "ascii" kodek ne može "t dekodirati bajt 0xea na poziciji 0: ordinal nije u rasponu (128) >>> parser_result + s.decode (" cp1251 ") u" \ xe1 \ xe0 \ xe1 \ xe0- \ xff \ xe3 \ xe0 \ u043a \ u043e \ u0449 \ u0435 \ u0439 ">>> print parser_result + s.decode (" cp1251 ") baba yagakoschey >>> print" & ". join ((parser_result, s.decode ( "cp1251"))) Baba Yaga & Koschey # Ovako je bolje :)

"UnicodeDecodeError" je obično indikacija za dekodiranje niza u Unicode koristeći ispravno kodiranje.

Sada koristite "str" ​​i unicode nizove. Nemojte koristiti stringove "str" ​​i unicode :) U "str" ​​ne postoji način da se navede kodiranje, tako da će se uvijek koristiti zadano kodiranje i bilo koji karakter >128 će dovesti do greške. Koristite metodu "kodiranja":

>>> tip (e), s Koschey >>> str (s) Traceback (zadnji posljednji poziv): Datoteka " ", red 1, in str (s) UnicodeEncodeError: "ascii" kodek ne može "t kodirati znakove na poziciji 0-4: ordinal nije u rasponu (128) >>> s = s.encode (" cp1251 ") >>> tip(ovi), s koschey

"UnicodeEncodeError" je znak da moramo navesti ispravno kodiranje kada pretvaramo unicode niz u običan (ili koristite drugi parametar "ignore" \ "replace" \ "xmlcharrefreplace" u metodi "encode").

Želim još!
U redu, upotrijebimo opet Baba Yagu iz gornjeg primjera:

>>> parser_result = u "baba-yaga" # 1 >>> parser_result u "\ xe1 \ xe0 \ xe1 \ xe0- \ xff \ xe3 \ xe0" # 2 >>> print parser_result áááà-ÿãà # 3 >>> print parser_result.encode ("latin1") # 4 baba yaga >>> print parser_result.encode ("latin1"). decode ("cp1251") # 5 baba yaga >>> print unicode ("baba yaga", "cp1251") ) # 6 baba-yaga
Primjer nije sasvim jednostavan, ali ima svega (dobro, ili skoro svega). sta se desava ovde:

  1. Šta imamo na ulazu? Bajtovi koje IDLE prosljeđuje interpretatoru. Šta ti treba na izlazu? Unicode, odnosno znakovi. Ostaje pretvoriti bajtove u znakove - ali trebate kodiranje, zar ne? Koje će se kodiranje koristiti? Tražimo dalje.
  2. Evo važna tačka: >>> "baba-yaga" "\ xe1 \ xe0 \ xe1 \ xe0- \ xff \ xe3 \ xe0" >>> u "\ u00e1 \ u00e0 \ u00e1 \ u00e0- \ u00ff \ u00e3 \ u00e0" == u "\ xe1 \ xe0 \ xe1 \ xe0- \ xff \ xe3 \ xe0" Istina, kao što vidite, Python se ne opterećuje izborom kodiranja - bajtovi se jednostavno konvertuju u unicode tačke:
    >>> red ("a") 224 >>> red (u "a") 224
  3. Samo ovdje je problem - 224. znak u cp1251 (kodiranje koje koristi interpretator) uopće nije isti kao 224 u Unicode-u. Upravo zbog toga dolazimo do pucanja kada pokušavamo da ispišemo naš unikod niz.
  4. Kako pomoći ženi? Ispostavilo se da je prvih 256 Unicode znakova isto kao u ISO-8859-1 \ latin1 kodiranju, odnosno, ako ga koristimo za kodiranje unicode niza, dobijamo bajtove koje smo sami upisali (koga zanima - Objekti / unicodeobject.c, tražeći definiciju funkcije "unicode_encode_ucs1"):
    >>> parser_result.encode ("latin1") "\ xe1 \ xe0 \ xe1 \ xe0- \ xff \ xe3 \ xe0"
  5. Kako dobiti babu u Unicodeu? Potrebno je naznačiti koje kodiranje koristiti:
    >>> parser_result.encode ("latin1"). decode ("cp1251") u "\ u0431 \ u0430 \ u0431 \ u0430- \ u044f \ u0433 \ u0430"
  6. Metoda iz tačke #5 svakako nije tako vruća, mnogo je zgodnije koristiti ugrađeni unicode.
Zapravo nije sve tako loše sa literalima "u" "" jer se problem javlja samo u konzoli. Zaista, u slučaju korištenja ne-ascii znakova u izvorni fajl Python će insistirati na korištenju zaglavlja kao što je "# - * - kodiranje: - * -" (PEP 0263) i unikod nizovi će koristiti ispravno kodiranje.

Postoji i način da se koristi "u" "" za predstavljanje, na primjer, ćirilice, bez specificiranja kodiranja ili nečitljivih unicode tačaka (tj. "u" \ u1234 ""). Način nije sasvim prikladan, ali zanimljivo je korištenje unicode kodova entiteta:

>>> s = u "\ N (ĆIRILIČNO MALO SLOVO KA) \ N (ĆIRILIČNO MALO SLOVO O) \ N (ĆIRILIČNO MALO SLOVO SCHHA) \ N (ĆIRILIČNO MALO SLOVO IE) \ N (ĆIRILIČNO MALO SLOVO KRATKO I)"> >> print s koshchey

Pa, to je sve. Glavni savjet je ne brkati "kodiranje" \ "dekodiranje" i razumjeti razlike između bajtova i znakova.

Python 3
Ovdje bez šifre, jer nema iskustva. Svedoci kažu da je tamo sve mnogo jednostavnije i zabavnije. Ko će se obavezati na mačke da pokažu razlike između ovdje (Python 2.x) i tamo (Python 3.x) - poštovanje i poštovanje.

Zdravo

Budući da govorimo o kodiranju, preporučit ću resurs koji s vremena na vrijeme pomaže u prevladavanju krakozyabryja - http://2cyr.com/decode/?lang=ru.

Tagovi:

  • python
  • unicode
  • kodiranje
Dodaj oznake

Top srodni članci