Kako postaviti pametne telefone i računala. Informativni portal
  • Dom
  • Zanimljiv
  • Međunarodni standard Unicode. Zašto vam je trebao Unicode? Kratka napomena o kodiranju

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

Unicode je međunarodni standard za kodiranje znakova koji omogućuje dosljedan prikaz teksta na bilo kojem računalu u svijetu, bez obzira na jezik sustava.

Osnove

Da bismo razumjeli čemu služi Unicode tablica znakova, prvo razumimo mehanizam za prikazivanje teksta na zaslonu monitora. Računalo, kao što znamo, obrađuje sve informacije digitalni oblik, a za prikaz za ispravnu percepciju od strane osobe treba biti na grafiku. Dakle, da bismo pročitali ovaj tekst, potrebno je riješiti barem dva zadatka:

  • Kodiranje ispisivi znakovi u digitalni oblik.
  • Učinite operativni sustav usklađenim digitalni oblik s vektorskim simbolima, drugim riječima, pronađite točna slova.

Prva kodiranja

Američki ASCII se smatra pretkom svih kodiranja. Opisana je upotreba u Engleski jezik Latinska abeceda s interpunkcijskim znakovima 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 su slova latinske abecede zauzimala prve pozicije u bilo kojem kodiranju.

Ukupno, ASCII je dopuštao pohranjivanje 256 znakova, ali budući da je prvih 128 zauzeto latiničnom abecedom, preostalih 128 počelo se koristiti diljem svijeta za stvaranje 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"

Daljnji razvoj tehnologije i pojava grafičkog sučelja doveli su do toga da je ANSI kodiranje kreirao Američki institut za standarde. ruski korisnici, pogotovo s iskustvom, poznata je njezina verzija pod Windows naziv 1251. Prvi put je uveo koncept “kodne stranice”. Uz pomoć kodnih stranica, koje su sadržavale simbole drugih nacionalnih abeceda osim latinice, uspostavljeno je "međusobno razumijevanje" između računala koja se koriste u različitim zemljama.

Međutim, prisutnost veliki broj različita kodiranja koja se koriste za isti jezik počela su stvarati probleme. Pojavio se takozvani krakozyabry. Oni su proizašli iz neusklađenosti između izvorne kodne stranice, u kojoj su stvorene bilo kakve informacije, i kodne stranice koja se prema zadanim postavkama koristi na računalu krajnjeg korisnika.

Kao primjer, gore navedeno ćiriličkih kodiranja CP866 i KOI8-R. Slova u njima su se razlikovala po kodnim pozicijama i principima postavljanja. U prvom su smješteni abecedni red, au drugom - u proizvoljnom. Možete zamisliti što se događalo pred očima korisnika koji je pokušao otvoriti takav tekst, a da nije imao potrebnu kodnu stranicu ili kada ga je računalo pogrešno protumačilo.

Stvaranje Unicodea

Proliferacija Interneta i srodnih tehnologija kao što su E-mail, dovelo je do toga da je na kraju situacija s iskrivljavanjem tekstova svima prestala odgovarati. Vodeće IT tvrtke osnovale su Unicode konzorcij. Tablica znakova koju je predstavio 1991. pod imenom UTF-32 mogla je pohraniti preko milijardu jedinstvenih znakova. Bilo je presudan korak na putu dešifriranja tekstova.

Međutim, prva univerzalna Unicode tablica 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 tablicom tekst zauzimao četiri puta više prostora nego kada bi se koristila proširena ASCII tablica.

Razvoj Unicodea

Sljedeća tablica znakova Unicode UTF-16 riješila je ovaj problem. Kodiranje u njemu provedeno je u pola broja bitova, ali se u isto vrijeme 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 taj broj definira kao osnovni prostor za pohranu Unicode znakova.

Unatoč ovom uspjehu, UTF-16 nije odgovarao svima, budući da je količina pohranjenih i prenesene informacije još uvijek bio udvostručen. Rješenje na jednom mjestu postao UTF-8, tablica Unicode znakova promjenjive duljine. Ovo se može nazvati iskorak na ovom području.

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

Zahvaljujući promjenjive duljine od koda koji se koristi za prikaz znakova, latinica je kodirana u Unicodeu na isti način kao u svom pretku ASCII, odnosno u jednom bitu. Za druge abecede, slika može izgledati drugačije. Na primjer, znakovi gruzijske abecede koriste tri bajta za kodiranje, a znakovi ćirilice koriste dva. Sve je to moguće u okviru korištenja standarda UTF-8 Unicode (tablica znakova). Ruski jezik ili ćirilica zauzima 448 pozicija u ukupnom kodnom prostoru, podijeljenih u pet blokova.

Ovih pet blokova obuhvaćaju osnovnu ćirilicu i crkvenoslavensko pismo, kao i dodatna slova drugim jezicima koji koriste ćirilicu. Za prikaz starih oblika prikaza ćiriličnog slova istaknut je niz pozicija, a 22 mjesta od ukupnog broja još su slobodna.

Trenutna verzija Unicodea

Rješenjem svoje primarne zadaće, a to je standardizacija fontova i stvaranje jedinstvenog kodnog prostora za njih, "Konzorcij" nije prekinuo svoj rad. Unicode se neprestano razvija i širi. Posljednja trenutna verzija ovog standarda, 9.0, objavljena je 2016. Uključivao je šest dodatnih abeceda i proširio popis 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 domaći. U ovu skupinu spadaju i jezici koji su u naše vrijeme došli samo u obliku pisanih spomenika.

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

tablica simbola

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

U OS-u Windows stol simboli se nalaze u odjeljku "Usluga" izbornika. U obitelji operacijskih sala Linux sustavi obično se može pronaći u pododjeljku "Standard", a na MacOS-u pod postavkama tipkovnice. Glavna svrha ove tablice je ulazak u tekstualni dokumenti znakova koji se ne nalaze na tipkovnici.

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

Konačno

Unicode se koristi posvuda i ušao je u naš život zajedno s razvojem interneta i mobilnih tehnologija. Zahvaljujući njegovoj upotrebi, sustav međuetničkih komunikacija značajno je pojednostavljen. Možemo reći da je uvođenje Unicodea indikativan, ali izvana 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 njihovog kodiranja računalna obrada tekstualni podaci.

Unicode ne dodjeljuje samo svaki znak jedinstveni kod ali i definira razne karakteristike ovaj simbol, 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 odnosno);

    primjereno brojčana vrijednost(za numeričke znakove).

    Standardi UTF(kratica za Unicode Transformation Format) za predstavljanje znakova:

UTF-16: Podešavanje, ubrzavanje sustava Windows, često postavljana pitanja o Visti za upoznavanje svih Unicode znakovi Koristi se UTF-16 kodiranje. 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 su u .NET Frameworku svi znakovi kodirani korištenjem UTF-16, pa 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 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 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", 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, sve više važna ulogaće reproducirati 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 dizajner ovo je kodiranje 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 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, interpunkcijski znakovi i kontrola ASCII znakovi su napisani u US-ASCII kodovima, a svi ostali znakovi su kodirani korištenjem nekoliko okteta s najvažnijim bitom od 1. Ovo ima dva učinka.

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

    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 veliki broj znakovi iz različitih pisama: kineski znakovi mogu koegzistirati u Unicode dokumentima, matematički simboli, slova grčke abecede, 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. 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 neusporedivo pokrivanje velika količina znakova od prethodno prihvaćenih 8-bitnih kodiranja. Još važna razlika Unicode iz drugih sustava kodiranja je da ne samo da svakom znaku dodjeljuje jedinstveni kod, već također definira različite karakteristike tog 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 jezika ili grupi posebni znakovi, slične po 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čunalni sustavi... Međutim, nije kompatibilan s većinom internetskih 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 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 slijedeći pravila pretvaranje svakog Unicode koda u skup bajtova (jedan do tri) koji se mogu prenositi 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, 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 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.

Vjerovali ili ne, u preglednik je ugrađen format slike. Ovaj format vam omogućuje da učitate slike prije nego što zatrebaju, omogućuje renderiranje slike na uobičajeni ili zasloni mrežnice i omogućuje vam da dodate na CSS slike... OK, to nije sasvim točno. Ovo nije omjer stranica, iako sve ostalo ostaje isto. Koristeći ga, možete stvoriti ikone neovisne o razlučivosti za koje nije potrebno vrijeme za učitavanje i koje su stilizirane koristeći CSS.

Što je Unicode?

Unicode je sposobnost ispravnog prikaza slova i interpunkcije iz različiti jezici na jednoj stranici. Nevjerojatno je koristan: korisnici će moći komunicirati s vašom web-lokacijom u cijelom svijetu i ona će pokazati što želite - može biti francuski s naglascima ili kanji.

Unicode se nastavlja razvijati: sada je relevantna verzija 8.0 u kojoj ima više od 120 tisuća znakova (u izvornom članku, objavljenom početkom 2014., radilo se o verziji 6.3 i 110 tisuća znakova).

Osim slova i brojeva, u Unicodeu postoje i drugi simboli i ikone. V najnovije verzije to uključuje emojije koje možete vidjeti u iOS messengeru.

HTML stranice se stvaraju iz niza Unicode znakova i pretvaraju se u bajtove kada se šalju putem mreže. Svako slovo i svaki znak bilo kojeg jezika ima svoj jedinstveni kod i kodira se kada se datoteka sprema.

Kada koristite sustav kodiranja UTF-8, možete izravno umetnuti Unicode znakove u tekst, ali ih također možete dodati u tekst navođenjem digitalne simboličke veze. Na primjer, ovo je simbol srca, a taj simbol možete prikazati jednostavnim dodavanjem koda u oznaku.

Ova brojčana 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 pomoću CSS-a, tada možete koristiti samo heksadecimalne vrijednosti.

Neki od najčešće korištenih Unicode znakova imaju upečatljivije nazive teksta ili kratice umjesto brojčanih kodova, kao što je ampersand (& - &). Takvi se simboli nazivaju mnemonika u HTML-u, potpuni popis dostupan je na Wikipediji.

Zašto biste trebali koristiti Unicode?

Dobro pitanje, evo nekoliko razloga:

  1. Za korištenje ispravnih znakova iz različiti jezici.
  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 spremljen u UTF-8 formatu i njegovo kodiranje se prenosi preko mreže kao UTF-8, sve bi trebalo raditi kako treba.

Mora. Nažalost, ne podržavaju svi preglednici i uređaji sve Unicode znakove na isti način (točnije, ne podržavaju svi fontovi cijeli set likovi). Na primjer, nedavno dodani emoji znakovi nisu svugdje podržani.

Za podršku za UTF-8 u HTML5 dodaj (ako nemate pristup postavkama poslužitelja, također biste trebali dodati ). Stari tip dokumenta koristi ( ).

Ikone

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

Njihov očiti plus je što vam ništa ne treba dodatne datoteke 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 pomoću CSS-a. I dodavanjem prijelaza ( css prijelaz) možete glatko promijeniti boju ikone kada pređete iznad nje bez ikakvih ikakvih dodatne slike.

Recimo da želim uključiti indikator ocjene zvjezdicama na svoju stranicu. mogu to ovako:

★ ★ ★ ☆ ☆

Dobivate sljedeći rezultat:

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

Ista ocjena na BlackBerryju 9000

To se događa ako upotrijebljeni znakovi nisu u fontu preglednika ili uređaja (srećom, ove su zvjezdice savršeno podržane i stare BlackBerry telefoni ovdje su jedina iznimka).

Ako nema Unicode znaka, umjesto njega mogu biti različiti znakovi od praznog kvadrata (□) do romba s upitnikom (�).

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

Korištenje Unicodea s ikonama s fontom @

Ako koristite ikone koje se povezuju s vanjskim fontom putem @ font-face, Unicode znakovi se mogu koristiti kao zamjenski. Na ovaj način možete prikazati sličan Unicode znak na uređajima ili preglednicima na kojima @ 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 da ako @ font-face nije podržan, kodovi znakova se prosljeđuju korisniku bez ikakvog značenja.

Izvrsno za stvaranje skupova ikona u @ font-face i omogućuje vam da odaberete odgovarajući Unicode znak kao osnovu za ikonu.

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

Podrška za Unicode znakove

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

Ako je vaša ikona samo ukrasni element uz tekstualnu oznaku koju čita čitač zaslona, ​​ne morate se previše brinuti. Ali ako je ikona samostalna, vrijedi dodati skrivenu tekstualnu oznaku kako biste pomogli korisnicima čitača zaslona. Čak i ako čitač zaslona pročita Unicode znak, postoji šansa da će se jako razlikovati od svoje namjene. Na primjer, ≡ (≡) kao ikona hamburgera će VoiceOver na iOS-u čitati kao "identičan".

Unicode u nazivima CSS klasa

Činjenica da se Unicode može koristiti u nazivima klasa i stilskim listovima poznata je od 2007. godine. Tada je Jonathan Snook pisao o korištenju Unicode znakova u pomoćnim klasama pri tipkanju zaobljenih kutova. 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 svakako provjerite znakove koje želite kada birate font.

Puno ikona u Segoe UI Symbol ili Arial Unicode MS. Ovi fontovi dostupni su na PC-u i Macu; Lucida Grande također ima priličnu količinu Unicode znakova. Možete dodati ove fontove svojoj deklaraciji obitelji 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 prisutnost određenog Unicode znaka, ali ne postoji zajamčeni način da to učinite.

Unicode znakovi mogu biti učinkoviti uz podršku. Na primjer, emoji u retku predmeta izdvaja ga od ostalih poštanski sandučić.

Zaključak

Ovaj članak pokriva samo osnove Unicodea. Nadam se da će vam pomoći da bolje razumijete Unicode i da ga učinkovito koristite.

Popis poveznica

  • (generator skupa ikona @ font-face temeljen na Unicodeu)
  • Shape Catcher (alat za prepoznavanje znakova Unicode)
  • Unicode (Unicode tablica znakova)
  • Unify (provjerite podršku za Unicode znakove u preglednicima)
  • Unitools (zbirka alata za rad s Unicodeom)

Ni sama ne volim naslove poput "Pokemon u vlastitom soku za lutke / lonce / tave", ali čini se da je to upravo tako - razgovarat ć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, pod kat.

Za što?

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

Kodiranje, tko ne zna, je način predstavljanja u memoriji računala (čitaj - u nulama-jedinicama/brojevima) znamenki, bukva i svih ostalih znakova. Na primjer, razmak je predstavljen kao 0b100000 (binarno), 32 (u decimalnom) ili 0x20 (u heksadecimalni sustav računanje).

Dakle, nekada je bilo vrlo malo memorije i sva su računala imala dovoljno 7 bita da predstavljaju sve potrebne znakove (brojeve, mala/velika latinica, hrpa znakova i tzv. kontroliranih znakova - svih mogućih 127 brojeva je nekome dano) . U to vrijeme postojao je samo jedan kodiranje - ASCII. Kako je vrijeme prolazilo, svi su bili sretni, a tko nije bio sretan (čitaj - kome je nedostajao znak "" ili izvorno slovo "u") - preostalih 128 znakova koristio je po vlastitom 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 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 očekivalo, mrežna komunikacija i samo razmjena datoteka između različita računala pretvorio u pakao zna što, unatoč činjenici da su zaglavlja poput "Content-Encoding" u HTTP protokol, e-poruke i HTML stranice malo su spasile dan.

U ovom trenutku okupili su se svijetli umovi 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). Na ovaj trenutak u Unicode standardu ima nešto više od 100 tisuća znakova, dok UTF-16 podržava više od milijun (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 sve više zabave na temu.

Prijeđi na stvar!

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

>>> s 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 (posljednji zadnji poziv): Datoteka " ", red 1, in str (parser_result) UnicodeEncodeError: "ascii" kodek može "t kodirati znakove na poziciji 0-3: redni broj nije u rasponu (128)
Idemo shvatiti, ali redom.

Zašto bi itko koristio Unicode?
Zašto moj omiljeni html parser vraća Unicode? Neka vrati običan niz, a ja ću se tamo pozabaviti time! Pravo? Ne baš. Iako se svaki od znakova koji postoje u Unicodeu (vjerojatno) može predstaviti u nekom jednobajtnom kodiranju (ISO-8859-1, cp1251 i drugi se nazivaju jednobajtnim, jer kodiraju bilo koji znak u točno jedan bajt), ali što učiniti ako u nizu treba biti znakova iz različitih kodiranja? Dodijeliti zasebno kodiranje svakom znaku? Ne, naravno da morate koristiti Unicode.
Zašto nam treba novi tip"Unicode"?
Tako smo došli do najzanimljivijeg. Što je string u Pythonu 2.x? Jednostavno je bajtova... Samo binarni podaci koji mogu biti bilo što. Zapravo, kada napišemo nešto poput: >>> x = "abcd" >>> x "abcd", tumač ne stvara varijablu koja sadrži prva četiri slova latinske abecede, već samo niz ("a" , "b "," c "," d ") s četiri bajta, a latinična slova se ovdje koriste isključivo za označavanje ove određene 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" su samo četiri znaka s znakom/nepotpisom (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) # ili pola duplo (1.2926117739473244e + 161,)
I to je to!

A odgovor na pitanje – zašto nam treba “unicode” već je očitiji – trebamo tip koji će biti predstavljen znakovima, a ne bajtovima.

Dobro, shvatio sam što je niz. Što 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 slijed bajtova, već niz stvarnih znakova bez ikakve ideje o tome kako se ti znakovi mogu učinkovito pohraniti u memoriju računala. Ako želite, ovo je viša razina apstrakcije od nizova bajtova (to je ono što Python 3 naziva regularnim nizovima koji se koriste u Pythonu 2.6).
Kako da koristim Unicode?
Unicode niz u Pythonu 2.6 može se stvoriti na tri (barem prirodno) načina:
  • u "" literal: >>> u "abc" u "abc"
  • Metoda "dekodiranje" za niz bajtova: >>> "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-> latinska 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 niz iz unicode niza? Kodirajte ga:

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

Algoritam kodiranja je prirodno suprotan od gore navedenog.

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

Nije kodirano :(
Pogledajmo primjere s početka članka. Kako funkcionira konkatenacija nizova i Unicode? Jednostavan niz mora se pretvoriti u unicode niz, a budući da tumač ne poznaje kodiranje, koristi zadano kodiranje - ascii. Ako ovo kodiranje ne uspije dekodirati niz, dobivamo ružnu pogrešku. U ovom slučaju, moramo sami pretvoriti niz u unicode niz, koristeći ispravno kodiranje:

>>> vrsta ispisa (parser_result), parser_result baba-yaga >>> s = "Koschey" >>> parser_result + s Traceback (zadnji posljednji poziv): Datoteka " ", 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 pomoću ispravnog kodiranja.

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":

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

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

Želim više!
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 >>> ispiši parser_result áàá-ÿãà # 3 >>> ispiši parser_result.encode ("latin1") # 4 baba yaga >>> ispiši parser_result.encode ("latin1"). decode ("cp1251") # 5 baba yaga >>> ispiši unicode ("baba yaga", "cp1251") ) # 6 baba-yaga
Primjer nije sasvim jednostavan, ali ima svega (dobro, ili gotovo svega). Što se ovdje događa:

  1. Što imamo na ulazu? Bajtovi koje IDLE prosljeđuje tumaču. Što ti treba na izlazu? Unicode, odnosno znakovi. Ostaje pretvoriti bajtove u znakove - ali trebate kodiranje, zar ne? Koje će se kodiranje koristiti? Gledamo dalje.
  2. Ovdje važna toč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 zamara izborom kodiranja - bajtovi se jednostavno pretvaraju u unicode točke:
    >>> ord ("a") 224 >>> ord (u "a") 224
  3. Samo ovdje je problem - 224. znak u cp1251 (kodiranje koje koristi interpretator) uopće nije isti kao 224 u Unicodeu. Upravo zbog toga dobivamo puknuće kada pokušavamo ispisati naš unicode 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, dobivamo bajtove koje smo sami unijeli (koga briga - 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 točke #5 sigurno nije tako vruća, mnogo je prikladnije koristiti ugrađeni unicode.
Zapravo nije sve tako loše s literalima "u" "" jer se problem javlja samo u konzoli. Doista, u slučaju korištenja ne-ascii znakova u izvorna datoteka Python će inzistirati na korištenju zaglavlja poput "# - * - kodiranje: - * -" (PEP 0263) i unicode nizovi će koristiti ispravno kodiranje.

Također postoji način korištenja "u" "" za predstavljanje, na primjer, ćirilice, bez navođenja kodiranja ili nečitljivih unicode točaka (tj. "u" \ u1234 ""). Način nije sasvim prikladan, ali zanimljiv je korištenje kodova entiteta unicode:

>>> s = u "\ N (ĆIRILIČNO MALO SLOVO KA) \ N (ĆIRILIČNO MALO SLOVO O) \ N (ĆIRILIČNO MALO SLOVO SHCHA) \ N (ĆIRILIČNO MALO SLOVO IE) \ N (ĆIRILIČNO MALO SLOVO KRATKO I)"> >> ispis 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. Svjedoci kažu da je tamo sve puno jednostavnije i zabavnije. Tko će se poduzeti na mačkama demonstrirati razlike između ovdje (Python 2.x) i tamo (Python 3.x) - poštovanje i poštovanje.

Zdrav

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.

Oznake:

  • piton
  • unikod
  • kodiranje
Dodaj oznake

Vrhunski povezani članci