Cum se configurează smartphone-uri și PC-uri. Portal informativ
  • Acasă
  • Interesant
  • Standard internațional unicode. De ce ai nevoie de Unicode? O notă rapidă despre codificare

Standard internațional unicode. De ce ai nevoie de Unicode? O notă rapidă despre codificare

Unicode este un standard internațional de codificare a caracterelor care permite ca textul să fie afișat în mod constant pe orice computer din lume, indiferent de limba sistemului.

Cele elementare

Pentru a înțelege pentru ce este tabelul de caractere Unicode, să înțelegem mai întâi mecanismul de afișare a textului pe un ecran de monitor. După cum știm, computerul prelucrează toate informațiile formă digitală, iar pentru a-l afișa pentru o percepție corectă de către o persoană ar trebui să fie în grafic. Astfel, pentru a putea citi acest text, este necesar să rezolvăm cel puțin două sarcini:

Primele codificări

ASCII american este considerat a fi strămoșul tuturor codificărilor. Este descris folosit în limba engleză Alfabetul latin cu semne de punctuație și cifre arabe. Cele 128 de caractere utilizate în el au devenit baza pentru evoluțiile ulterioare - chiar și tabelul modern de caractere Unicode le folosește. De atunci, literele alfabetului latin au ocupat primele poziții în orice codificare.

În total, ASCII a permis stocarea a 256 de caractere, dar din moment ce primele 128 au fost ocupate de alfabetul latin, restul de 128 au început să fie folosite în toată lumea pentru a crea standarde naționale. De exemplu, în Rusia, CP866 și KOI8-R au fost create pe baza acesteia. Astfel de variații au fost numite versiuni extinse ale ASCII.

Pagini de cod și „krakozyabry”

Dezvoltare în continuare tehnologiile și apariția unei interfețe grafice au dus la faptul că codarea ANSI a fost creată de Institutul American de Standarde. utilizatori ruși, mai ales cu experiență, versiunea ei este cunoscută sub numele Windows 1251. A introdus pentru prima dată conceptul de „pagină de coduri”. Cu ajutorul paginilor de coduri, care conțineau simboluri ale alfabetelor naționale, altele decât latinul, s-a stabilit „înțelegerea reciprocă” între computerele utilizate în diferite țări.

Cu toate acestea, prezența un numar mare diferite codificări folosite pentru aceeași limbă au început să cauzeze probleme. A apărut așa-numitul krakozyabry. Acestea au apărut dintr-o nepotrivire între pagina de cod inițială, în care a fost creată orice informație, și pagina de cod utilizată implicit pe computerul utilizatorului final.

Ca exemplu, cele de mai sus codificări chirilice CP866 și KOI8-R. Literele din ele diferă în pozițiile codului și principiile de plasare. În primul, au fost plasați în ordine alfabetică, iar în al doilea - în arbitrar. Vă puteți imagina ce se întâmpla în fața ochilor unui utilizator care a încercat să deschidă un astfel de text fără a avea pagina de coduri necesară sau când a fost interpretat greșit de computer.

Crearea Unicode

Proliferarea internetului și a tehnologiilor conexe precum E-mail, a dus la faptul că în cele din urmă situația cu denaturarea textelor a încetat să mai convină tuturor. Companiile IT de top au format Consorțiul Unicode. Tabelul de caractere pe care l-a introdus în 1991 sub numele UTF-32 ar putea stoca peste un miliard de caractere unice. A fost pas crucial pe drumul spre decriptarea textelor.

Cu toate acestea, primul tabel universal Unicode de coduri de caractere, UTF-32, nu a fost adoptat pe scară largă. Motivul principal a fost redundanța informațiilor stocate. S-a calculat rapid că, pentru țările care folosesc alfabetul latin codificat cu noul tabel universal, textul ar ocupa de patru ori mai mult spațiu decât atunci când se folosește tabelul ASCII extins.

Dezvoltarea Unicode

Următorul tabel de caractere Unicode UTF-16 a remediat această problemă. Codarea în ea a fost efectuată în jumătate din numărul de biți, dar, în același timp, a scăzut și numărul de combinații posibile. În loc de miliarde de caractere, stochează doar 65 536. Cu toate acestea, a avut atât de mult succes încât Consorțiul a decis că numărul este spațiul de stocare de bază pentru caracterele Unicode.

În ciuda acestui succes, UTF-16 nu s-a potrivit tuturor, deoarece cantitatea stocată și informatii transmise era încă dublat. Soluție unică a devenit UTF-8, un tabel de caractere Unicode cu lungime variabilă. Acest lucru poate fi numit o descoperire în acest domeniu.

Astfel, odată cu introducerea ultimelor două standarde, tabelul de caractere Unicode a rezolvat problema unui spațiu de cod unic pentru toate fonturile utilizate în prezent.

Unicode pentru rusă

Mulțumită lungime variabilă din codul folosit pentru afișarea caracterelor, alfabetul latin este codificat în Unicode în același mod ca și în strămoșul său ASCII, adică într-un bit. Pentru alte alfabete, imaginea poate arăta diferit. De exemplu, caracterele alfabetului georgian folosesc trei octeți pentru codare, iar caracterele alfabetului chirilic folosesc doi. Toate acestea sunt posibile în cadrul utilizării standardului UTF-8 Unicode (tabel de caractere). Limba rusă sau alfabetul chirilic ocupă 448 de poziții în spațiul total al codului, împărțit în cinci blocuri.

Aceste cinci blocuri includ alfabetul chirilic și slavon bisericesc de bază, precum și litere suplimentare alte limbi folosind chirilica. Un număr de poziții sunt evidențiate pentru afișarea formelor vechi de reprezentare a literelor chirilice, iar 22 de poziții din numărul total sunt încă libere.

Versiunea actuală de Unicode

Cu soluția sarcinii sale principale, care era să standardizeze fonturile și să creeze un singur spațiu de cod pentru ele, „Consorțiul” nu și-a oprit activitatea. Unicode evoluează și se extinde constant. Ultima versiune actuală a acestui standard, 9.0, a fost lansată în 2016. A inclus șase alfabete suplimentare și a extins lista de emoji-uri standardizate.

Trebuie să spun că, pentru a simplifica cercetarea, chiar și așa-numitele limbi moarte sunt adăugate la Unicode. Au primit acest nume pentru că nu există oameni pentru care ar fi nativ. Acest grup include și limbile care au ajuns până la vremea noastră doar sub formă de monumente scrise.

În principiu, oricine poate solicita adăugarea de caractere la noua specificație Unicode. Adevărat, pentru aceasta va trebui să completați o cantitate decentă de documente sursă și să petreceți mult timp. Un exemplu viu în acest sens este povestea programatorului Terence Eden. În 2013, a solicitat includerea în caietul de sarcini a simbolurilor legate de desemnarea butoanelor de control al alimentării computerului. V documentatie tehnica acestea există de la mijlocul anilor 1970, dar nu au făcut parte din Unicode până la specificația 9.0.

tabel de simboluri

Fiecare computer, indiferent de sistemul de operare utilizat, utilizează un tabel de caractere Unicode. Cum să folosiți aceste tabele, unde să le găsiți și de ce pot fi utile unui utilizator obișnuit?

În OS Masa Windows simboluri se află în secțiunea „Service” a meniului. În familia sălilor de operație sisteme Linux poate fi găsit de obicei în subsecțiunea „Standard” și pe MacOS sub preferințele tastaturii. Scopul principal al acestui tabel este de a intra în documente text caractere care nu se află pe tastatură.

Cea mai largă aplicație pentru astfel de tabele poate fi găsită: de la introducerea simbolurilor tehnice și a pictogramelor naționale sisteme monetareînainte de a scrie instrucțiuni pentru aplicație practică cărți de tarot.

In cele din urma

Unicode este folosit peste tot și a intrat în viața noastră odată cu dezvoltarea internetului și a tehnologiilor mobile. Datorită utilizării sale, sistemul de comunicații interetnice a fost simplificat semnificativ. Putem spune că introducerea Unicode este un exemplu indicativ, dar complet invizibil din exteriorul utilizării tehnologiei pentru binele comun al întregii omeniri.

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

Unicode este un set simboluri graficeși modul de a le codifica prelucrare computerizată date text.

Unicode nu numai că atribuie fiecărui caracter cod unic dar defineşte şi diverse caracteristici acest simbol, de exemplu:

    tip de caracter (litera mare, litera mica, număr, semn de punctuație etc.);

    atributele caracterului (afișare de la stânga la dreapta sau de la dreapta la stânga, spațiu, întrerupere de linie etc.);

    literele mari sau mici corespunzătoare (pentru litere mici și litere mari respectiv);

    adecvat valoare numerică(pentru caractere numerice).

    Standarde UTF(abreviere pentru Unicode Transformation Format) pentru a reprezenta caractere:

UTF-16: Modificare Windows, accelerare, Întrebări frecvente Vista pentru a prezenta tuturor Caractere Unicode Se utilizează codificarea UTF-16. În UTF-16, caracterele sunt reprezentate de doi octeți (16 biți). Această codificare este folosită în Windows deoarece valorile de 16 biți pot reprezenta caracterele care alcătuiesc alfabetele majorității limbilor din lume, acest lucru permite programelor să proceseze șirurile și să calculeze lungimea lor mai rapid. Cu toate acestea, 16 biți nu este suficient pentru a reprezenta caractere alfabetice în unele limbi. Pentru astfel de cazuri, UTE-16 acceptă codificări „surogat”, permițând codificarea caracterelor pe 32 de biți (4 octeți). Cu toate acestea, există puține aplicații care trebuie să se ocupe de caracterele unor astfel de limbaje, așa că UTF-16 este un bun compromis între economisirea memoriei și ușurința de programare. Rețineți că în .NET Framework toate caracterele sunt codificate folosind UTF-16, deci folosind UTF-16 în aplicații Windowsîmbunătățește performanța și reduce consumul de memorie la trecerea șirurilor de caractere între codul nativ și cel gestionat.

UTF-8: În codificarea UTF-8, diferite caractere pot fi reprezentate prin 1,2,3 sau 4 octeți. Caracterele cu valori mai mici de 0x0080 sunt comprimate la 1 octet, ceea ce este foarte convenabil pentru caracterele din SUA. Caracterele care se potrivesc cu valori din intervalul 0x0080-0x07FF sunt convertite în valori de 2 octeți, ceea ce funcționează bine cu alfabetele europene și din Orientul Mijlociu. Caracterele cu valori mai mari sunt convertite în valori de 3 octeți, utile pentru lucrul cu limbile din Asia Centrală. În cele din urmă, perechile surogat sunt scrise în format de 4 octeți. UTF-8 este o codificare extrem de populară. Cu toate acestea, este mai puțin eficient decât UTF-16 dacă sunt utilizate frecvent caractere cu valori 0x0800 și mai mari.

UTF-32: În UTF-32, toate caracterele sunt reprezentate de 4 octeți. Această codificare este ușor de scris algoritmi simpli pentru a repeta peste caractere din orice limbă care nu necesită procesarea caracterelor reprezentate de un număr diferit de octeți. De exemplu, atunci când utilizați UTF-32, puteți uita de „surogate”, deoarece orice caracter din această codificare este reprezentat de 4 octeți. În mod clar, din punct de vedere al utilizării memoriei, eficiența UTF-32 este departe de a fi ideală. Prin urmare, această codificare este rareori folosită pentru a transfera șiruri de caractere prin rețea și pentru a le salva în fișiere. De obicei, UTF-32 este folosit ca format intern pentru prezentarea datelor într-un program.

UTF-8

În viitorul apropiat, din ce în ce mai mult rol important va reda un format special Unicode (și ISO 10646) numit UTF-8... Această codificare „derivată” folosește șiruri de octeți de diferite lungimi (de la unu la șase) pentru a scrie caractere, care sunt convertite în coduri Unicode folosind un algoritm simplu, cu șiruri mai scurte corespunzătoare caracterelor mai comune. Principalul avantaj al acestui format este compatibilitatea cu ASCII nu numai în valorile codurilor, ci și în numărul de biți pe caracter, deoarece un octet este suficient pentru a codifica oricare dintre primele 128 de caractere în UTF-8 (deși , de exemplu, pentru litere chirilice, doi octeți).

Formatul UTF-8 a fost inventat pe 2 septembrie 1992 de Ken Thompson și Rob Pike și implementat în Planul 9. Standardul UTF-8 este acum oficializat în RFC 3629 și ISO / IEC 10646 Anexa D.

Pentru web designer această codificare este de o importanță deosebită, deoarece este declarată „codarea standard a documentelor” în HTML începând cu versiunea 4.

Textul care conține numai caractere cu un număr mai mic de 128, atunci când este scris în UTF-8, este convertit în text simplu ASCII. În schimb, în ​​textul UTF-8, orice octet cu o valoare mai mică de 128 reprezintă un caracter ASCII cu același cod. Restul caracterelor Unicode sunt reprezentate de secvențe lungi de la 2 la 6 octeți (de fapt doar până la 4 octeți, deoarece utilizarea codurilor mai mari de 221 nu este planificată), în care primul octet arată întotdeauna ca 11xxxxxx, iar restul - 10xxxxxx.

Mai simplu spus, în format UTF-8, caractere latine, semne de punctuație și control caractere ASCII sunt scrise în coduri US-ASCII și toate celelalte caractere sunt codificate folosind mai mulți octeți cu bitul cel mai semnificativ de 1. Acest lucru are două efecte.

    Chiar dacă programul nu recunoaște Unicode, atunci scrisori, cifrele arabe și semnele de punctuație se vor afișa corect.

    Dacă literele latine și semnele de punctuație simple (inclusiv spațiul) ocupă o cantitate semnificativă de text, UTF-8 oferă un câștig de volum în comparație cu UTF-16.

    La prima vedere, ar putea părea că UTF-16 este mai convenabil, deoarece majoritatea caracterelor sunt codificate în exact doi octeți. Cu toate acestea, acest lucru este anulat de necesitatea de a sprijini perechile surogat, care sunt adesea trecute cu vederea atunci când se utilizează UTF-16, implementând suport doar pentru caracterele UCS-2.

Standardul a fost propus în 1991 de Unicode Consortium, Unicode Inc., o organizație non-profit. Utilizarea acestui standard face posibilă codificarea unui foarte număr mare caractere din diferite scripturi: caracterele chinezești pot coexista în documentele Unicode, simboluri matematice, litere ale alfabetului grecesc, latin și chirilic, astfel încât devine inutilă schimbarea paginilor de cod.

Standardul constă din două secțiuni principale: setul de caractere universal (UCS) și formatul de transformare Unicode (UTF). Setul de caractere universal definește o corespondență unu-la-unu de caractere cu coduri - elemente ale spațiului de cod care reprezintă numere întregi nenegative. Familia de codificări definește reprezentarea automată a unei secvențe de coduri UCS.

Standardul Unicode a fost dezvoltat cu scopul de a crea o codificare uniformă a caracterelor pentru toate limbile scrise moderne și vechi. Fiecare caracter din acest standard este codificat pe 16 biți, permițându-i să acopere incomparabil cantitate mare caractere decât codificările pe 8 biți acceptate anterior. Un alt distincție importantă Unicode de la alte sisteme de codare este că nu numai că atribuie un cod unic fiecărui caracter, dar definește și diferite caracteristici ale caracterului respectiv, de exemplu:

Tipul de caractere (majuscule, minuscule, număr, semn de punctuație etc.);

Atributele caracterului (afișare de la stânga la dreapta sau de la dreapta la stânga, spațiu, întrerupere de linie etc.);

Literele mari sau mici corespunzătoare (pentru litere mici, respectiv majuscule);

Valoarea numerică corespunzătoare (pentru caractere numerice).

Întreaga gamă de coduri de la 0 la FFFF este împărțită în mai multe subseturi standard, fiecare dintre ele corespunde fie alfabetului unei limbi, fie unui grup. caractere speciale, asemănătoare în funcţiile lor. Diagrama de mai jos oferă o listă generală a subseturilor Unicode 3.0 (Figura 2).

Poza 2

Standardul Unicode este baza pentru stocare și text în multe moderne sisteme informatice... Cu toate acestea, nu este compatibil cu majoritatea protocoalelor de Internet, deoarece codurile sale pot conține orice valoare de octet, iar protocoalele folosesc de obicei octeții 00 - 1F și FE - FF ca supraîncărcare. Pentru a realiza interoperabilitatea, au fost dezvoltate mai multe formate de transformare Unicode (UTF, Unicode Transformation Formats), dintre care UTF-8 este cel mai comun astăzi. Acest format definește urmând reguli conversia fiecărui cod Unicode într-un set de octeți (unu până la trei) care pot fi transportați prin protocoale Internet.


Aici x, y, z indică biții din codul sursă care ar trebui extrași, începând cu cel mai puțin semnificativ, și introduși în octeții de rezultat de la dreapta la stânga până când toate pozițiile specificate sunt umplute.

Dezvoltarea ulterioară a standardului Unicode este asociată cu adăugarea de noi planuri de limbaj, de ex. caractere în intervalele 10000 - 1FFFF, 20000 - 2FFFF etc., unde ar trebui să includă codificarea pentru scripturile limbilor moarte care nu sunt incluse în tabelul de mai sus. Pentru a codifica aceste caractere suplimentare, format nou UTF-16.

Astfel, există 4 moduri principale de codificare a octeților Unicode:

UTF-8: 128 de caractere sunt codificate într-un octet (format ASCII), 1920 de caractere sunt codificate în 2 octeți ((caractere romane, grecești, chirilice, copte, armeane, ebraice, arabe), 63488 de caractere sunt codificate în 3 octeți (chineze) , japoneză și altele) Cele 2.147.418.112 de caractere rămase (neutilizate încă) pot fi codificate cu 4, 5 sau 6 octeți.

UCS-2: Fiecare caracter este reprezentat de 2 octeți. Această codificare include doar primele 65.535 de caractere din formatul Unicode.

UTF-16: Aceasta este o extensie a UCS-2 și include 1 114 112 caractere Unicode. Primele 65.535 de caractere sunt reprezentate de 2 octeți, restul de 4 octeți.

USC-4: Fiecare caracter este codificat în 4 octeți.

Credeți sau nu, există un format de imagine încorporat în browser. Acest format vă permite să încărcați imagini înainte de a fi necesare, oferă redarea imaginii în mod obișnuit sau ecrane de retinăși vă permite să adăugați Imagini CSS... OK, nu este în întregime adevărat. Acesta nu este un raport de aspect, deși totul rămâne același. Folosind-o, puteți crea pictograme independente de rezoluție, care nu necesită timp pentru a se încărca și sunt decorate cu folosind CSS.

Ce este Unicode?

Unicode este capacitatea de a afișa corect literele și semnele de punctuație din limbi diferite pe o singură pagină. Este incredibil de util: utilizatorii vor putea interacționa cu site-ul dvs. din întreaga lume și vă va arăta ceea ce doriți - poate fi franceză cu accente sau kanji.

Unicode continuă să evolueze: acum este relevantă versiunea 8.0, în care sunt peste 120 de mii de caractere (în articolul original, publicat la începutul lui 2014, era vorba despre versiunea 6.3 și 110 mii de caractere).

Pe lângă litere și cifre, există și alte simboluri și pictograme în Unicode. V ultimele versiuni acestea includ emoji-uri pe care le puteți vedea în iOS messenger.

Paginile HTML sunt create dintr-o secvență de caractere Unicode și sunt convertite în octeți atunci când sunt trimise prin rețea. Fiecare literă și fiecare caracter din orice limbă are propriul cod unic și este codificat atunci când fișierul este salvat.

Când utilizați sistemul de codare UTF-8, puteți introduce direct caractere Unicode în text, dar le puteți adăuga și la text prin specificarea unei legături simbolice digitale. De exemplu, acesta este un simbol de inimă și puteți afișa acel simbol pur și simplu adăugând cod la marcaj.

Această referință numerică poate fi specificată în format zecimal sau hexazecimal. Formatul zecimal necesită adăugarea unui x la început, notația va da aceeași inimă () ca opțiunea anterioară... (2665 este versiunea hexazecimală a lui 9829).

Dacă adăugați un caracter Unicode folosind CSS, atunci puteți utiliza numai valori hexadecimale.

Unele dintre cele mai frecvent utilizate caractere Unicode au nume sau abrevieri mai memorabile în loc de coduri numerice, cum ar fi ampersand (& - &). Astfel de simboluri sunt numite mnemonice în HTML, o listă completă este disponibilă pe Wikipedia.

De ce ar trebui să folosești Unicode?

Buna intrebare, iată câteva motive:

  1. Pentru a folosi caracterele corecte din limbi diferite.
  2. Pentru a înlocui pictogramele.
  3. Pentru a înlocui pictogramele conectate prin @ font-face.
  4. Pentru a defini clasele CSS

Caractere valide

Primul dintre motive nu necesită niciunul acțiuni suplimentare... Dacă HTML-ul este salvat în format UTF-8 și codificarea lui este transmisă prin rețea ca UTF-8, totul ar trebui să funcționeze așa cum ar trebui.

Trebuie sa. Din păcate, nu toate browserele și dispozitivele acceptă toate caracterele Unicode în același mod (mai precis, nu toate fonturile acceptă Set complet personaje). De exemplu, caracterele emoji adăugate recent nu sunt acceptate peste tot.

Pentru suport UTF-8 în HTML5 adăugați (dacă nu aveți acces la setările serverului, ar trebui să adăugați și ). Vechiul doctype folosește ( ).

icoane

Al doilea motiv pentru utilizarea Unicode este că există multe simboluri utile care pot fi folosite ca pictograme. De exemplu, ≡ și.

Plusul lor evident este că nu aveți nevoie de niciunul fișiere suplimentare pentru a le adăuga pe pagină, ceea ce înseamnă că site-ul tău va fi mai rapid. De asemenea, le puteți schimba culoarea sau adăuga o umbră folosind CSS. Și prin adăugarea de tranziții ( tranziție css) puteți schimba ușor culoarea pictogramei atunci când treceți cu mouse-ul peste ea fără niciuna imagini suplimentare.

Să presupunem că vreau să includ un indicator de evaluare cu stele pe pagina mea. Pot sa fac asa:

★ ★ ★ ☆ ☆

Obtii urmatorul rezultat:

Dar dacă ai ghinion, vei vedea ceva de genul:

Aceeași evaluare și pe BlackBerry 9000

Acest lucru se întâmplă dacă caracterele folosite nu sunt în fontul browserului sau al dispozitivului (din fericire, aceste asteriscuri sunt perfect acceptate și vechi telefoane BlackBerry sunt singura excepție aici).

Dacă nu există caracter Unicode, în locul lui pot exista caractere diferite de la un pătrat gol (□) la un romb cu semn de întrebare (�).

Cum găsești un caracter Unicode care ar putea funcționa pentru designul tău? Îl poți căuta pe un site precum Unicodinator uitându-te la caracterele disponibile, dar există și cel mai bun mod... - acest site grozav vă permite să desenați pictograma pe care o căutați și apoi vă oferă o listă de caractere Unicode similare.

Folosind Unicode cu pictograme @ font-face

Dacă utilizați pictograme care se conectează cu un font extern prin @ font-face, caracterele Unicode pot fi folosite ca alternativă. În acest fel, puteți afișa un caracter Unicode similar pe dispozitive sau browsere în care @ font-face nu este acceptat:

În stânga sunt pictogramele Font Awesome în Chrome, iar în dreapta sunt înlocuitorii lor Unicode în Opera Mini.

Multe instrumente de potrivire a fontului @ folosesc o serie de caractere Unicode din zona de utilizare privată. Problema acestei abordări este că, dacă @ font-face nu este acceptată, codurile de caractere sunt transmise utilizatorului fără nicio semnificație.

Excelent pentru a crea seturi de pictograme în font-face @ și vă permite să alegeți un caracter Unicode potrivit ca bază pentru pictogramă.

Dar fiți atenți – unor browsere și dispozitive nu le plac personaje individuale Unicode atunci când este utilizat cu @ font-face. Este logic să testați suportul pentru caractere Unicode cu Unify - această aplicație vă va ajuta să determinați cât de sigur este să utilizați un caracter în setul de pictograme @ font-face.

Suport de caractere Unicode

Principala problemă cu utilizarea caracterelor Unicode ca alternativă este suportul slab în cititoarele de ecran (din nou, unele informații despre acest lucru pot fi găsite pe Unify), așa că este important să alegeți cu atenție caracterele pe care le utilizați.

Dacă pictograma dvs. este doar un element decorativ lângă o etichetă text care poate fi citită de un cititor de ecran, nu trebuie să vă faceți prea multe griji. Dar dacă pictograma este singură, merită să adăugați o etichetă de text ascunsă pentru a ajuta utilizatorii cititorului de ecran. Chiar dacă un caracter Unicode este citit de un cititor de ecran, există șansa ca acesta să fie foarte diferit de scopul propus. De exemplu, ≡ (≡) ca pictogramă hamburger va fi citită ca „identică” de VoiceOver pe iOS.

Unicode în numele claselor CSS

Faptul că Unicode poate fi folosit în numele claselor și în foile de stil este cunoscut încă din 2007. Atunci Jonathan Snook a scris despre utilizarea caracterelor Unicode în clasele de ajutor la tastarea colțurilor rotunjite. Această idee nu a primit prea multă distribuție, dar merită să știți despre posibilitatea utilizării Unicode în numele claselor (caractere speciale sau chirilice).

Selectarea fontului

Puține fonturi acceptă setul complet de caractere Unicode, așa că asigurați-vă că verificați caracterele pe care le doriți atunci când alegeți un font.

O mulțime de pictograme în Segoe UI Symbol sau Arial Unicode MS. Aceste fonturi sunt disponibile atât pe PC, cât și pe Mac; Lucida Grande are, de asemenea, o cantitate destul de mare de caractere Unicode. Puteți adăuga aceste fonturi la declarația dvs. de familie de fonturi pentru a vă asigura că număr maxim Caractere Unicode pentru utilizatorii care au instalate aceste fonturi.

Determinarea suportului Unicode

Ar fi grozav să puteți verifica prezența unui anumit caracter Unicode, dar nu există o modalitate garantată de a face acest lucru.

Caracterele Unicode pot fi eficiente cu suport. De exemplu, un emoji în linia de subiect îl face să iasă în evidență de restul în cutie poștală.

Concluzie

Acest articol acoperă doar elementele de bază ale Unicode. Sper că îl găsiți util pentru a vă ajuta să înțelegeți mai bine Unicode și să îl utilizați eficient.

Lista de link-uri

  • (Generator bazat pe Unicode @ font-face iconset)
  • Shape Catcher (instrument de recunoaștere a caracterelor Unicode)
  • Unicodinator (tabel de caractere Unicode)
  • Unificare (verificați compatibilitatea cu caracterele Unicode în browsere)
  • Unitools (O colecție de instrumente pentru lucrul cu Unicode)

Mie însumi nu prea îmi plac titluri precum „Pokemon în propriul suc pentru manechine / oale / tigăi”, dar acesta pare să fie exact cazul - vom vorbi despre lucruri de bază, lucru cu care destul de des duce la un compartiment plin de denivelări și mult timp pierdut în jurul întrebării - De ce nu funcționează? Dacă încă vă este frică și/sau nu înțelegeți Unicode, vă rugăm, sub cat.

Pentru ce?

Întrebarea principală pentru un începător care se confruntă cu un număr impresionant de codificări și mecanisme aparent confuze pentru a lucra cu acestea (de exemplu, în Python 2.x). Răspunsul scurt este pentru că s-a întâmplat :)

O codificare, cine nu știe, este modalitatea de a reprezenta în memoria computerului (se citește - în zerouri-unu/numere) cifre, fagi și toate celelalte caractere. De exemplu, un spațiu este reprezentat ca 0b100000 (în binar), 32 (în zecimală) sau 0x20 (în sistem hexazecimal socoteala).

Așadar, odată ce era foarte puțină memorie și toate computerele aveau suficienți 7 biți pentru a reprezenta toate caracterele necesare (numere, alfabet latin litere mici / majuscule, o grămadă de caractere și așa-numitele caractere controlate - toate cele 127 de numere posibile au fost date cuiva) . La acea vreme exista o singură codificare - ASCII. Odată cu trecerea timpului, toată lumea era fericită, iar cine nu era fericit (a se citi – căruia îi lipsea semnul „” sau litera nativă „u”) – folosea restul de 128 de caractere la discreția lor, adică creau codificări noi. Așa au apărut ISO-8859-1 și noastre (adică chirilice) cp1251 și KOI8. Împreună cu ei a apărut și problema interpretării octeților ca 0b1 ******* (adică caractere / numere de la 128 la 255) - de exemplu, 0b11011111 în codificarea cp1251 este propriul nostru „E”, în același timp în codificarea ISO 8859-1 este greacă germană Eszett (prompts) „ß”. După cum era de așteptat, comunicarea în rețea și doar schimbul de fișiere între diferite computere transformat în iadul-știe-ce, în ciuda faptului că antete precum „Content-Encoding” în Protocolul HTTP, e-mailurile și paginile HTML au salvat puțin ziua.

În acest moment, minți strălucitoare s-au adunat și s-au oferit nou standard- Unicode. Acesta este un standard, nu o codificare - Unicode în sine nu determină modul în care caracterele vor fi stocate pe hard disk sau transmise prin rețea. Acesta definește doar relația dintre un caracter și un anumit număr, iar formatul conform căruia aceste numere vor fi convertite în octeți este determinat de codificări Unicode (de exemplu, UTF-8 sau UTF-16). Pe acest moment există puțin peste 100 de mii de caractere în standardul Unicode, în timp ce UTF-16 poate suporta peste un milion (UTF-8 este chiar mai mult).

Vă sfătuiesc să citiți Minimul absolut pentru fiecare dezvoltator de software absolut, pozitiv trebuie să știe despre Unicode și seturile de caractere pentru a distra din ce în ce mai mult pe această temă.

Treci la subiect!

Desigur, există suport pentru Unicode în Python. Dar, din păcate, numai în Python 3 toate șirurile au devenit unicode, iar începătorii trebuie să se sinucidă din cauza unei erori precum:

>>> cu open ("1.txt") ca fh: s = fh.read () >>> print s koshchey >>> parser_result = u "baba-yaga" # atribuire pentru claritate, să ne imaginăm că acesta este rezultă unele lucrări de analiză >>> ", rândul 1, în parser_result + s UnicodeDecodeError: codecul „ascii” nu poate „decoda octetul 0xea în poziția 0: ordinal nu este în interval (128)
sau cam asa:
>>> str (parser_result) Traceback (cel mai recent apel ultimul): Fișier " ", rândul 1, în str (parser_result) UnicodeEncodeError: codecul „ascii” „nu poate codifica caractere în poziția 0-3: ordinal nu este în interval (128)
Să ne dăm seama, dar în ordine.

De ce ar folosi cineva Unicode?
De ce analizatorul meu html preferat returnează Unicode? Lasă-l să returneze un șir obișnuit și mă voi ocupa de el acolo! Dreapta? Nu chiar. Deși fiecare dintre caracterele existente în Unicode poate fi (probabil) reprezentat într-o codificare pe un singur octet (ISO-8859-1, cp1251 și altele sunt numite un singur octet, deoarece codifică orice caracter într-un singur octet), dar ce să faceți dacă ar trebui să existe caractere în șir din diferite codificări? Alocați o codificare separată fiecărui caracter? Nu, bineînțeles că trebuie să utilizați Unicode.
De ce avem nevoie tip nou„Unicode”?
Așa că am ajuns la cel mai interesant lucru. Ce este un șir în Python 2.x? E simplu octeți... Doar date binare care pot fi orice. De fapt, atunci când scriem ceva de genul: >>> x = „abcd” >>> x „abcd” interpretul nu creează o variabilă care să conțină primele patru litere ale alfabetului latin, ci doar secvența („a” , "b "," c "," d ") cu patru octeți și literele latine sunt folosite aici exclusiv pentru a desemna această valoare specială a octetului. Deci „a” aici este doar un sinonim pentru „\ x61”, și nu puțin mai mult. De exemplu:

>>> "\ x61" "a" >>> struct.unpack ("> 4b", x) # "x" este doar patru caractere semnate/nesemnate (97, 98, 99, 100) >>> struct.unpack ("> 2h", x) # sau două scurte (24930, 25444) >>> struct.unpack ("> l", x) # sau unul lung (1633837924,) >>> struct.unpack ("> f" , x) # sau float (2.6100787562286154e + 20,) >>> struct.unpack ("> d", x * 2) # sau jumătate dublu (1.2926117739473244e + 161,)
Si asta e!

Iar răspunsul la întrebare – de ce avem nevoie de „unicode” este deja mai evident – ​​avem nevoie de un tip care să fie reprezentat prin caractere, nu octeți.

Bine, mi-am dat seama care este sfoara. Atunci ce este Unicode în Python?
„Type unicode” este în primul rând o abstractizare care implementează ideea de Unicode (un set de caractere și numere asociate). Un obiect de tip „unicode” nu mai este o secvență de octeți, ci o secvență de caractere reale fără nicio idee despre cum aceste caractere pot fi stocate efectiv în memoria computerului. Dacă preferați, acesta este un nivel mai ridicat de abstractizare decât șirurile de octeți (acesta este ceea ce Python 3 numește șiruri obișnuite care sunt utilizate în Python 2.6).
Cum folosesc Unicode?
Un șir Unicode în Python 2.6 poate fi creat în trei moduri (cel puțin natural):
  • u "" literal: >>> u "abc" u "abc"
  • Metoda "decode" pentru șirul de octeți: >>> "abc" .decode ("ascii") u "abc"
  • Funcția „Unicode”: >>> unicode („abc”, „ascii”) u „abc”
ascii în ultimele două exemple este specificat ca codificare care va fi folosită pentru a converti octeții în caractere. Etapele acestei transformări arată cam așa:

„\ x61” -> codificare ascii-> latină literă "a" -> u "\ u0061" (punct Unicode pentru această literă) sau "\ xe0" -> codificare c1251 -> chirilic literă "a" -> u "\ u0430"

Cum să obțineți un șir obișnuit dintr-un șir Unicode? Codificați-l:

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

Algoritmul de codare este în mod natural opusul celui de mai sus.

Amintiți-vă și nu confuz - unicode == caractere, șir == octeți și octeți -> ceva semnificativ (caracterele) este decodat, iar caracterele -> octeți sunt codificați.

necodificat :(
Să ne uităm la exemple de la începutul articolului. Cum funcționează concatenarea șirurilor de caractere și Unicode? Snur simplu trebuie convertit într-un șir unicode și, deoarece interpretul nu cunoaște codificarea, folosește codarea implicită - ascii. Dacă această codificare nu reușește să decodeze șirul, obținem o eroare urâtă. În acest caz, trebuie să convertim noi înșine șirul într-un șir Unicode, folosind codificarea corectă:

>>> tip de tipărire (parser_result), parser_result baba-yaga >>> s = "Koschey" >>> parser_result + s Traceback (cel mai recent apel ultimul): Fișier " ", rândul 1, în parser_result + s UnicodeDecodeError: codecul „ascii” nu poate „decoda octetul 0xea în poziția 0: ordinal nu se află în intervalul (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 # Este mai bine așa :)

O „UnicodeDecodeError” este de obicei o indicație pentru a decoda șirul în Unicode folosind codificarea corectă.

Acum folosiți șiruri „str” și unicode. Nu utilizați șiruri de caractere „str” și unicode :) În „str” nu există nicio modalitate de a specifica codificarea, astfel încât codarea implicită va fi întotdeauna utilizată și orice caractere> 128 va duce la o eroare. Utilizați metoda „codare”:

>>> tip (e) tipărire, s Koschey >>> str (s) Traceback (cel mai recent apel ultimul): Fișier " ", rândul 1, în str (s) UnicodeEncodeError: codecul „ascii” nu poate „coda caracterele în pozițiile 0-4: ordinal nu se află în intervalul (128) >>> s = s.encode (" cp1251 ") >>> tip (e) de tipărire; s koschey

„UnicodeEncodeError” este un semn că trebuie să specificăm codificarea corectă atunci când convertim un șir Unicode într-unul obișnuit (sau folosiți al doilea parametru „ignore” \ „replace” \ “xmlcharrefreplace” în metoda „encode”).

Vreau mai mult!
Bine, să folosim din nou Baba Yaga din exemplul de mai sus:

>>> 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
Exemplul nu este în întregime simplu, dar există totul (bine, sau aproape totul). Ce se petrece aici:

  1. Ce avem la intrare? Octeții pe care IDLE îi transmite interpretului. De ce ai nevoie la ieșire? Unicode, adică caractere. Rămâne să transformi octeții în caractere - dar ai nevoie de o codificare, nu? Ce codare va fi folosită? Ne uităm mai departe.
  2. Aici punct important: >>> "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” Adevărat, după cum puteți vedea, Python nu se deranjează cu alegerea codificării - octeții sunt pur și simplu convertiți în puncte unicode:
    >>> ord ("a") 224 >>> ord (u "a") 224
  3. Numai aici este problema - al 224-lea caracter din cp1251 (codificarea folosită de interpret) nu este deloc la fel cu 224 din Unicode. Din această cauză suntem sparți atunci când încercăm să imprimăm șirul nostru unicode.
  4. Cum să ajuți o femeie? Se dovedește că primele 256 de caractere Unicode sunt aceleași ca în codarea ISO-8859-1 \ latin1, respectiv, dacă îl folosim pentru a codifica un șir unicode, obținem octeții pe care i-am introdus singuri (pe cine este interesat - Obiecte) / unicodeobject.c, căutând definiția funcției "unicode_encode_ucs1"):
    >>> parser_result.encode ("latin1") "\ xe1 \ xe0 \ xe1 \ xe0- \ xff \ xe3 \ xe0"
  5. Cum obții un baba în unicode? Este necesar să indicați ce codificare să utilizați:
    >>> parser_result.encode ("latin1"). decoda ("cp1251") sau "\ u0431 \ u0430 \ u0431 \ u0430- \ u044f \ u0433 \ u0430"
  6. Metoda de la punctul # 5 cu siguranță nu este atât de fierbinte, este mult mai convenabil să utilizați unicode încorporat.
De fapt, nu este chiar atât de rău cu literalele „u” „”, deoarece problema apare doar în consolă. Într-adevăr, în cazul utilizării caracterelor non-ascii în fișier sursă Python va insista să folosească un antet precum „# - * - codificare: - * -” (PEP 0263), iar șirurile Unicode vor folosi codificarea corectă.

Există, de asemenea, o modalitate de a folosi „u” „” pentru a reprezenta, de exemplu, chirilic, fără a specifica codarea sau punctele unicode care nu pot fi citite (adică „u” \ u1234 ""). Modul nu este în întregime convenabil, dar interesant este să folosiți coduri de entitate unicode:

>>> s = u "\ N (LITERĂ MINUSCULĂ CHRILICĂ KA) \ N (LITERĂ MINUSCULĂ CHIRILICĂ O) \ N (LITERĂ MINUSCULĂ CHIRILICĂ SHCHA) \ N (LITERĂ MINUSCULĂ CHIRILICĂ IE) \ N (LITERĂ MINUSCULĂ CHIRILICĂ SCURT I)"> >> print s koshchey

Ei bine, asta-i tot. Sfatul principal este să nu confundați „codare” \ „decodare” și să înțelegeți diferențele dintre octeți și caractere.

Python 3
Aici fără cod, pentru că nu există experiență. Martorii spun că acolo totul este mult mai simplu și mai distractiv. Cine se va angaja pe pisici să demonstreze diferențele dintre aici (Python 2.x) și acolo (Python 3.x) - respect și respect.

Sănătos

Deoarece vorbim despre codificări, voi recomanda o resursă care din când în când ajută la depășirea krakozyabry - http://2cyr.com/decode/?lang=ru.

Etichete:

  • piton
  • unicode
  • codificare
Adaugă etichete

Top articole similare