Cum se configurează smartphone-uri și PC-uri. Portal informativ
  • Acasă
  • Windows Phone
  • Câte caractere sunt în tabelul Unicode. Unicode pe web: o introducere pentru începători

Câte caractere sunt în tabelul Unicode. Unicode pe web: o introducere pentru începători

Unicode sau Unicode (din cuvântul englezesc Unicode) este un standard de codificare caracter-caracter. Permite codificarea aproape tuturor limbilor scrise.

La sfârșitul anilor 1980, caracterele pe 8 biți au devenit standardul. Codificările pe 8 biți au fost reprezentate de diverse modificări, al căror număr era în continuă creștere. Acesta a fost în principal rezultatul unei extinderi active a gamei de limbi utilizate. A existat, de asemenea, dorința dezvoltatorilor de a veni cu o codificare care pretinde universalitate cel puțin parțială.

Ca urmare, a devenit necesar să se rezolve mai multe probleme:

  • probleme de afișare a documentelor în codificare incorectă. Ar putea fi rezolvată fie prin introducerea consecventă a unor metode de specificare a codificării utilizate, fie prin introducerea unei singure codări pentru toate;
  • probleme de pachet de caractere limitate, rezolvate fie prin schimbarea fonturilor în document, fie prin introducerea codării extinse;
  • problemele de transformare a codificării de la una la alta, care părea a fi posibil de rezolvat fie folosind o conversie intermediară (a treia codificare), incluzând caractere ale diferitelor codificări, fie compilarea tabelelor de conversie pentru fiecare două codificări;
  • probleme de duplicare a fonturilor individuale. În mod tradițional, fiecare codificare și-a asumat propriul font, chiar și atunci când codificările coincideau complet sau parțial în setul de caractere. Într-o oarecare măsură, problema a fost rezolvată cu ajutorul fonturilor „mari”, din care apoi au fost selectate caracterele necesare pentru o anumită codificare. Dar pentru a determina gradul de conformitate, a fost necesar să se creeze un singur registru de simboluri.

Astfel, ordinea de zi a ridicat problema necesității de a crea o codificare unificată „largă”. Codificările cu lungime variabilă a caracterelor utilizate în Asia de Sud-Est erau prea complexe pentru a fi utilizate. Prin urmare, s-a pus accent pe utilizarea unui simbol cu ​​o lățime fixă. Simbolurile pe 32 de biți păreau prea greoaie, iar în cele din urmă cele pe 16 biți au câștigat.

Standardul a fost propus comunității Internet în 1991 de către o organizație non-profit Consorțiul Unicode... Utilizarea sa face posibilă codificarea unui număr mare de caractere de diferite tipuri de scriere. În documentele Unicode, nici caracterele chinezești, nici simbolurile matematice, nici chirilice, nici latine nu sunt strâns adiacente. În același timp, paginile de cod nu necesită comutatoare în timpul funcționării.

Standardul constă din două secțiuni principale: un set de caractere universal (UCS engleză) și o familie de codificări (în interpretare în engleză - UTF). Setul de caractere universal stabilește proporționalitate unu-la-unu cu codurile de caractere. Codurile în acest caz sunt elemente din domeniul codului care sunt numere întregi nenegative. Funcția familiei de codificare este de a defini reprezentarea automată a unei secvențe de coduri UCS.

În standardul Unicode, codurile sunt clasificate în mai multe zone. Zona cu coduri care încep cu U + 0000 și se termină cu U + 007F - include caracterele setului ASCII cu codurile necesare. În plus, există zone de simboluri ale diferitelor scripturi, simboluri tehnice, semne de punctuație. Un lot separat de coduri este păstrat în rezervă pentru utilizare ulterioară. Următoarele zone de simboluri cu coduri sunt definite sub alfabetul chirilic: U + 0400 - U + 052F, U + 2DE0 - U + 2DFF, U + A640 - U + A69F.

Valoarea acestei codificări în spațiul web crește inexorabil. Ponderea site-urilor care foloseau Unicode era de aproape 50% la începutul lui 2010.

Astăzi vom vorbi cu tine despre de unde provin krakozyabr-urile pe site și în programe, ce codificări de text există și care ar trebui folosite. Să luăm în considerare în detaliu istoria dezvoltării lor, pornind de la ASCII de bază, precum și versiunile sale extinse CP866, KOI8-R, Windows 1251 și terminând cu codificări moderne ale consorțiului Unicode UTF 16 și 8. Cuprins:

  • Versiuni extinse de Asuka - codificări CP866 și KOI8-R
  • Windows 1251 - Varianta ASCII și de ce iese krakozyabry
Pentru unii, această informație poate părea de prisos, dar ați ști câte întrebări primesc cu privire la krakozyabrov târât (nu un set de caractere care poate fi citit). Acum voi avea ocazia să trimit pe toată lumea la textul acestui articol și să-mi găsesc independent jamburile. Ei bine, pregătiți-vă să absorbiți informațiile și încercați să urmăriți povestea.

ASCII - codificarea de bază a textului pentru latină

Dezvoltarea codificărilor de text a avut loc concomitent cu formarea industriei IT, iar în acest timp au reușit să sufere destul de multe schimbări. Din punct de vedere istoric, totul a început cu EBCDIC, care nu era mai degrabă eufonic în pronunția rusă, ceea ce a făcut posibilă codificarea literelor din alfabetul latin, a cifrelor arabe și a semnelor de punctuație cu caractere de control. Dar totuși, punctul de plecare pentru dezvoltarea codificărilor moderne de text este celebrul ASCII(Codul standard american pentru schimbul de informații, care în rusă este de obicei pronunțat „aski”). Descrie primele 128 de caractere utilizate cel mai frecvent de utilizatorii vorbitori de limba engleză - litere latine, cifre arabe și semne de punctuație. Chiar și aceste 128 de caractere descrise în ASCII au inclus unele simboluri de serviciu cum ar fi paranteze, linii hash, asteriscuri etc. De fapt, tu însuți le poți vedea:
Aceste 128 de caractere din versiunea originală ASCII au devenit standardul, iar în orice altă codificare le veți întâlni cu siguranță și vor sta în această ordine. Dar adevărul este că, cu ajutorul unui octet de informații, este posibil să se codifice nu 128, ci până la 256 de valori diferite (două la puterea lui opt este egală cu 256), prin urmare, după versiunea de bază a Asuka , a apărut o serie întreagă codificări ASCII extinse, în care, pe lângă 128 de caractere de bază, a fost posibilă codificarea simbolurilor codificării naționale (de exemplu, rusă). Aici, poate, merită să spunem puțin mai multe despre sistemele de numere care sunt folosite în descriere. În primul rând, după cum știți cu toții, computerul funcționează numai cu numere în sistemul binar, și anume cu zerouri și unu („algebră booleană”, dacă cineva a mers la facultate sau la școală). Un octet este format din opt biți, fiecare dintre care este doi la putere, începând de la zero și până la doi în al șaptelea:
Nu este greu de înțeles că într-o astfel de construcție pot exista doar 256 de combinații posibile de zerouri și unu.Este destul de simplu să convertiți un număr dintr-un sistem binar într-unul zecimal. Trebuie doar să aduni toate puterile a doi deasupra cărora există unele. În exemplul nostru, acesta este 1 (2 la puterea zero) plus 8 (2 la puterea 3), plus 32 (2 la puterea a cincea), plus 64 (la a șasea), plus 128 (la a șaptea). Totalul obține 233 în notație zecimală. După cum puteți vedea, totul este foarte simplu. Dar dacă te uiți cu atenție la tabelul cu caractere ASCII, vei vedea că acestea sunt reprezentate în codificare hexazecimală. De exemplu, un asterisc corespunde numărului hexazecimal 2A din Asuka. Probabil știți că în sistemul numeric hexazecimal, pe lângă cifrele arabe, sunt folosite și litere latine de la A (înseamnă zece) la F (înseamnă cincisprezece). Ei bine, pentru convertiți numărul binar în hexazecimal recurgeți la următoarea metodă simplă și intuitivă. Fiecare octet de informații este împărțit în două bucăți de patru biți, așa cum se arată în captura de ecran de mai sus. Acea. în fiecare jumătate de octet, doar șaisprezece valori (de la două până la a patra putere) pot fi codificate în binar, care poate fi ușor reprezentat ca număr hexazecimal. Mai mult, în jumătatea stângă a octetului, va fi necesar să numărați din nou gradele începând de la zero și nu așa cum se arată în captura de ecran. Drept urmare, prin niște calcule simple, obținem că numărul E9 este codificat în captură de ecran. Sper că cursul raționamentului meu și soluția acestui puzzle s-au dovedit a fi clare pentru tine. Ei bine, acum să continuăm, de fapt, să vorbim despre codificări de text.

Versiuni extinse de Asuka - codificări CP866 și KOI8-R cu pseudografice

Așadar, am început să vorbim despre ASCII, care a fost, parcă, un punct de plecare pentru dezvoltarea tuturor codificărilor moderne (Windows 1251, Unicode, UTF 8). Inițial, conținea doar 128 de caractere din alfabetul latin, cifre arabe și altceva acolo, dar în versiunea extinsă a devenit posibil să se utilizeze toate cele 256 de valori care pot fi codificate într-un octet de informații. Acestea. a devenit posibil să adăugați simboluri ale literelor din limba dvs. la Aski. Aici va fi necesar să divagăm încă o dată pentru a clarifica - de ce avem nevoie de codificări de textși de ce este atât de important. Simbolurile de pe ecranul computerului dvs. sunt formate pe baza a două lucruri - seturi de forme vectoriale (reprezentări) de tot felul de caractere (sunt în fișierele cu fonturi care sunt instalate pe computerul dvs.) și codul care vă permite să scoateți exact acela din acest set de forme vectoriale (fișier font) caracterul care urmează să fie inserat în locația dorită. Este clar că fonturile în sine sunt responsabile pentru formele vectoriale, dar sistemul de operare și programele utilizate în el sunt responsabile pentru codare. Acestea. orice text de pe computer va fi un set de octeți, fiecare dintre care codifică un singur caracter al acestui text. Programul care afișează acest text pe ecran (editor de text, browser etc.), atunci când analizează codul, citește codificarea următorului caracter și caută forma vectorială corespunzătoare în fișierul de font necesar, care este conectat pentru a afișa acest text. document text. Totul este simplu și banal. Aceasta înseamnă că pentru a codifica orice caracter de care avem nevoie (de exemplu, din alfabetul național), trebuie îndeplinite două condiții - forma vectorială a acestui caracter trebuie să fie în fontul folosit și acest caracter ar putea fi codificat în codificări ASCII extinse în un octet. Prin urmare, există o mulțime de astfel de opțiuni. Există mai multe varietăți de Asuka extins doar pentru codificarea caracterelor limbii ruse. De exemplu, a apărut inițial CP866, în care se putea folosi caracterele alfabetului rus și era o versiune extinsă a ASCII. Acestea. partea superioară a coincis complet cu versiunea de bază a lui Asuka (128 de caractere latine, numere și orice alte prostii), care este prezentată în captura de ecran de mai sus, dar deja partea inferioară a tabelului cu codificare CP866 avea vizualizarea indicată în captură de ecran. chiar dedesubt și li se permite să codifice alte 128 de semne (litere rusești și tot felul de pseudo-grafice):
Vedeți, în coloana din dreapta, numerele încep cu 8, pentru că numerele de la 0 la 7 se referă la partea de bază ASCII (vezi prima captură de ecran). Acea. litera rusă „M” din CP866 va avea codul 9C (este situată la intersecția liniei corespunzătoare cu 9 și a coloanei cu numărul C în notație hexazecimală), care poate fi scris într-un octet de informații și dacă există un font potrivit cu caractere rusești, această literă fără probleme va fi afișată în text. De unde aceasta suma? pseudografic în CP866? Ideea este că această codificare pentru textul rusesc a fost dezvoltată în acei ani blăniți, când nu exista o asemenea răspândire a sistemelor de operare grafică ca acum. Și în Dos și în sistemele de operare cu text similare, pseudo-graficele au făcut posibilă diversificarea oarecum a designului textelor și, prin urmare, CP866 și toți ceilalți colegi din categoria versiunilor extinse ale Asuka abundă în el. CP866 a fost distribuit de IBM, dar în plus, au fost dezvoltate o serie de codificări pentru caractere rusești, de exemplu, acest tip (ASCII extins) poate fi atribuit KOI8-R:
Principiul funcționării sale rămâne același cu cel al CP866 descris puțin mai devreme - fiecare caracter al textului este codificat cu un singur octet. Captura de ecran arată a doua jumătate a tabelului KOI8-R, de atunci prima jumătate este complet în concordanță cu Asuka de bază, care este afișată în prima captură de ecran din acest articol. Printre caracteristicile codificării KOI8-R, se poate remarca faptul că literele rusești din tabelul său nu sunt în ordine alfabetică, așa cum, de exemplu, au făcut-o în CP866. Dacă vă uitați la prima captură de ecran (a părții de bază, care este inclusă în toate codificările extinse), veți observa că în KOI8-R literele rusești sunt situate în aceleași celule ale tabelului ca și literele consoanei alfabetului latin. cu ei din prima parte a tabelului. Acest lucru a fost făcut pentru comoditatea trecerii de la caracterele rusești la caracterele latine, eliminând doar un bit (două la a șaptea putere sau 128).

Windows 1251 - versiunea modernă a ASCII și de ce iese krakozyabry

Dezvoltarea ulterioară a codificărilor de text a fost asociată cu faptul că sistemele de operare grafică câștigau popularitate și nevoia de a folosi pseudo-grafice în ele a dispărut în timp. Ca urmare, a apărut un întreg grup, care, în esență, erau încă versiuni extinse ale Asuka (un caracter al textului este codificat cu un singur octet de informații), dar deja fără utilizarea caracterelor pseudo-grafice. Ele aparțineau așa-numitelor codificări ANSI, care au fost dezvoltate de Institutul American de Standarde. În limbajul comun, numele alfabetului chirilic a fost încă folosit pentru versiunea cu suport pentru limba rusă. Un exemplu în acest sens este Windows 1251... S-a diferențiat în mod favorabil de CP866 și KOI8-R utilizate anterior prin faptul că locul simbolurilor pseudo-grafice în el a fost luat de simbolurile lipsă ale tipografiei ruse (cu excepția semnului de accent), precum și de simbolurile utilizate în limbile slave. aproape de rusă (ucraineană, belarusă etc.) ):
Datorită unei astfel de abundențe de codificări în limba rusă, producătorii de fonturi și producătorii de software au avut în mod constant dureri de cap, iar noi, dragi cititori, de multe ori le-am scăpat de cele notorii krakozyabry când a existat confuzie cu versiunea folosită în text. Foarte des au ieșit la trimiterea și primirea mesajelor prin e-mail, ceea ce a presupus crearea unor tabele de conversie foarte complexe, care, de fapt, nu puteau rezolva în mod fundamental această problemă, iar de multe ori utilizatorii pentru corespondență foloseau transliterarea literelor latine pentru a evitați notoriul krakozyabrov atunci când folosiți codificări rusești precum CP866, KOI8-R sau Windows 1251. De fapt, crawlerea krakozyabry în loc de textul rusesc a fost rezultatul unei utilizări incorecte a codificării acestei limbi, care nu se potrivea cel în care mesajul text a fost codificat inițial. De exemplu, dacă încercăm să afișăm caracterele codificate cu CP866 folosind tabelul de coduri Windows 1251, atunci vor apărea aceleași krakozyabry (set de caractere fără sens), înlocuind complet textul mesajului. O situație similară apare foarte des la crearea și configurarea site-urilor, forumurilor sau blogurilor, când textul cu caractere rusești este salvat din greșeală într-o codificare greșită, care este folosită implicit pe site, sau în editorul de text greșit care adaugă cod invizibil. .cu ochiul liber. În cele din urmă, într-o astfel de situație cu o multitudine de codificări și krakozyabras care apar în mod constant obosit de multe, au existat premise pentru crearea unei noi variante universale care să le înlocuiască pe toate cele existente și să rezolve în cele din urmă problema rădăcină a apariției textelor ilizibile. . În plus, a existat problema limbilor precum chineza, unde caracterele limbii erau mult mai mult de 256.

Unicode - codificări UTF universale 8, 16 și 32

Aceste mii de caractere din grupul de limbi din Asia de Sud-Est nu au putut fi descrise într-un octet de informații, care a fost alocat pentru codificarea caracterelor în versiunile extinse de ASCII. Ca urmare, a fost creat un consorțiu numit Unicode(Unicode - Unicode Consortium) cu colaborarea multor lideri din industria IT (cei care produc software, care codifică hardware, care creează fonturi) care au fost interesați de apariția unei codări universale de text. Prima variantă lansată sub auspiciile consorțiului Unicode a fost UTF 32... Numărul din numele codificării înseamnă numărul de biți care sunt utilizați pentru a codifica un caracter. 32 de biți sunt 4 octeți de informații care vor fi necesari pentru a codifica un singur caracter în noua codificare UTF universală. Ca urmare, același fișier cu text codificat în versiunea extinsă a ASCII și în UTF-32, în acest din urmă caz, va avea dimensiunea (greutatea) de patru ori mai mare. Acest lucru este rău, dar acum avem posibilitatea de a codifica numărul de caractere egal cu două la puterea de treizeci de secunde ( miliarde de caractere, care va acoperi orice valoare cu adevărat necesară cu o marjă colosală). Dar multe țări cu limbi ale grupului european nu au trebuit să folosească un număr atât de mare de caractere în codificare, dar atunci când a fost folosit UTF-32, au primit o creștere de patru ori a greutății documentelor text pentru nimic și, așa cum ca urmare, o creștere a volumului de trafic pe Internet și a volumului de date stocate. Este mult și nimeni nu și-ar putea permite o astfel de risipă. Ca urmare a dezvoltării Unicode, UTF-16, care s-a dovedit a fi atât de reușit încât a fost acceptat implicit ca spațiu de bază pentru toate simbolurile pe care le folosim. Folosește doi octeți pentru a codifica un caracter. Să vedem cum arată acest caz. În sistemul de operare Windows, puteți urma calea "Start" - "Programe" - "Accesorii" - "Instrumente de sistem" - "Harta simbolurilor". Ca rezultat, se va deschide un tabel cu forme vectoriale ale tuturor fonturilor instalate în sistemul dumneavoastră. Dacă selectați setul de caractere Unicode în „Parametri suplimentari”, veți putea vedea pentru fiecare font separat întregul sortiment de caractere incluse în acesta. Apropo, făcând clic pe oricare dintre ele, îi puteți vedea pe doi octeți Cod UTF-16 format din patru cifre hexazecimale: Câte caractere pot fi codificate în UTF-16 cu 16 biți? 65536 (doi la puterea lui șaisprezece) și acest număr a fost luat ca spațiu de bază în Unicode. În plus, există modalități de a codifica cu acesta și aproximativ două milioane de caractere, dar au fost limitate la spațiul extins de un milion de caractere de text. Dar nici această versiune de succes a codificării Unicode nu a adus prea multe satisfacții celor care au scris, de exemplu, programe doar în limba engleză, deoarece după trecerea de la versiunea extinsă de ASCII la UTF-16, greutatea documentelor s-a dublat (una octet per un caracter în Aski și doi octeți pentru același caracter în UTP-16). Tocmai pentru satisfacția tuturor și a tuturor celor din consorțiul Unicode s-a decis vin cu o codificare lungime variabilă. L-au numit UTF-8. În ciuda numărului opt din nume, acesta are într-adevăr o lungime variabilă, adică. fiecare caracter din text poate fi codificat într-o secvență de la unu până la șase octeți. În practică, în UTF-8, se folosește doar intervalul de la unu la patru octeți, deoarece dincolo de patru octeți de cod, nimic nu este chiar teoretic posibil de imaginat. Toate caracterele latine din el sunt codificate într-un octet, la fel ca în vechiul ASCII. Ceea ce este de remarcat, în cazul codificării numai a alfabetului latin, chiar și acele programe care nu înțeleg Unicode vor citi în continuare ceea ce este codificat în UTF-8. Acestea. partea de bază a lui Asuka tocmai a trecut în această creație a consorțiului Unicode. Caracterele chirilice în UTF-8 sunt codificate în doi octeți și, de exemplu, cele georgiane - în trei octeți. Consorțiul Unicode, după ce a creat UTF 16 și 8, a rezolvat principala problemă - acum avem fonturile au un singur spațiu de cod... Și acum, producătorii lor îl pot umple doar cu forme vectoriale de simboluri text pe baza punctelor forte și a capacităților lor. În „Tabelul de caractere” de mai sus puteți vedea că diferite fonturi acceptă un număr diferit de caractere. Unele fonturi bogate în Unicode pot fi foarte grele. Dar acum ele diferă nu prin faptul că sunt create pentru diferite codificări, ci prin faptul că producătorul fontului a umplut sau nu a umplut un singur spațiu de cod cu anumite forme vectoriale până la sfârșit.

Krakozyabry în loc de litere rusești - cum să o rezolvi

Să vedem acum cum apar krakozyabras în locul textului sau, cu alte cuvinte, cum este aleasă codificarea corectă pentru textul rus. De fapt, este setat în programul în care creați sau editați chiar acest text, sau codați folosind fragmente de text. Pentru editarea și crearea fișierelor text, personal folosesc un foarte bun, după părerea mea, editor Html și PHP Notepad ++. Cu toate acestea, poate evidenția sintaxa a încă o sută de limbaje de programare și de marcare și are, de asemenea, capacitatea de a se extinde folosind plugin-uri. Citiți o recenzie detaliată a acestui program grozav la link-ul furnizat. În meniul de sus al Notepad ++ există un element „Codificări”, unde veți putea converti versiunea existentă în cea care este utilizată implicit pe site-ul dvs.:
În cazul unui site pe Joomla 1.5 și mai sus, precum și în cazul unui blog pe WordPress, pentru a evita apariția fisurilor, alegeți opțiunea UTF 8 fără BOM... Care este prefixul BOM? Faptul este că, atunci când a fost dezvoltată codarea YUTF-16, din anumite motive au decis să-i atașeze un astfel de lucru, cum ar fi capacitatea de a scrie un cod de caractere, atât în ​​secvență directă (de exemplu, 0A15), cât și invers (150A). . Și pentru ca programele să înțeleagă în ce secvență să citească codurile și a fost inventat BOM(Byte Order Mark sau, cu alte cuvinte, semnătură), care a fost exprimată prin adăugarea a trei octeți suplimentari chiar la începutul documentelor. În codificarea UTF-8, consorțiul Unicode nu prevede BOM și, prin urmare, adăugarea unei semnături (acești trei octeți suplimentari cei mai notori la începutul documentului) împiedică pur și simplu unele programe să citească codul. Prin urmare, atunci când salvăm fișiere în UTP, trebuie să alegem întotdeauna opțiunea fără BOM (fără semnătură). Deci avanzi protejează-te de a te târâi afară din Krakozyabrov... Ceea ce este de remarcat este că unele programe din Windows nu pot face acest lucru (nu pot salva text în UTP-8 fără BOM), de exemplu, notoriul Windows Notepad. Salvează documentul în UTF-8, dar încă adaugă o semnătură (trei octeți suplimentari) la început. Mai mult, acești octeți vor fi întotdeauna aceiași - citiți codul în secvență directă. Dar pe servere, din cauza acestui fleac, poate apărea o problemă - va ieși krakozyabry. Deci în niciun caz nu utilizați notepad Windows obișnuit pentru editarea documentelor site-ului dvs., dacă nu doriți să apară krakozyabrs. Cea mai bună și simplă opțiune cred că este deja menționat editorul Notepad ++, care practic nu are dezavantaje și constă doar în avantaje. În Notepad ++, atunci când alegeți o codificare, veți putea converti textul în codificare UCS-2, care este în mod inerent foarte apropiat de standardul Unicode. De asemenea, în Notepad va fi posibilă codificarea textului în ANSI, adică. în raport cu limba rusă va fi deja descrisă de noi chiar deasupra Windows 1251. De unde provin aceste informații? Este înregistrat în registrul sistemului dvs. de operare Windows - ce codificare să alegeți în cazul ANSI, pe care să alegeți în cazul OEM (pentru limba rusă va fi CP866). Dacă instalați o altă limbă implicită pe computer, atunci aceste codificări vor fi înlocuite cu altele similare din categoria ANSI sau OEM pentru aceeași limbă. După ce salvați documentul în codificarea de care aveți nevoie în Notepad ++ sau deschideți documentul de pe site pentru editare, puteți vedea numele acestuia în colțul din dreapta jos al editorului: Pentru a evita krakozyabrov, pe lângă acțiunile descrise mai sus, va fi util să scrieți informații despre această codificare în antetul codului sursă al tuturor paginilor site-ului, astfel încât să nu existe confuzii pe server sau pe gazda locală. În general, în toate limbajele de marcare hipertext, cu excepția Html, este utilizată o declarație xml specială, care indică codificarea textului.< ? xml version= "1.0" encoding= "windows-1251" ? >Înainte de a începe analiza codului, browserul va ști ce versiune este utilizată și cum trebuie interpretate exact codurile de caractere ale acestei limbi. Dar ceea ce este de remarcat este că dacă salvați documentul în unicode implicit, atunci această declarație xml poate fi omisă (codificarea va fi considerată UTF-8 dacă nu există BOM sau YUTF-16 dacă există o BOM). În cazul unui document HTML, codificarea este specificată Element meta, care este scris între etichetele Head de deschidere și de închidere: < head> . . . < meta charset= "utf-8" > . . . < / head>Această intrare este destul de diferită de cea acceptată în standard în Html 4.01, dar respectă pe deplin noul standard Html 5 introdus lent și va fi înțeles 100% corect de către orice browser utilizat în prezent. În teorie, elementul Meta care indică codificarea documentului HTML ar fi mai bine setat cât mai sus posibil în antetul documentului astfel încât în ​​momentul întâlnirii primului caracter din text care nu este din ANSI de bază (care este întotdeauna citit corect și în orice variație), browserul ar trebui să aibă deja informații despre modul de interpretare a codurilor acestor caractere. Link la primul

Unicode este o lume foarte mare și complexă, deoarece standardul vă permite să reprezentați și să lucrați într-un computer cu toate scripturile majore ale lumii. Unele sisteme de scriere există de peste o mie de ani și multe dintre ele au evoluat aproape independent unele de altele în diferite părți ale lumii. Oamenii au inventat atât de multe lucruri și sunt adesea atât de diferiți unul de celălalt încât a fost o sarcină extrem de dificilă și ambițioasă să combine toate acestea într-un singur standard.

Pentru a înțelege cu adevărat Unicode, trebuie să vă imaginați cel puțin superficial caracteristicile tuturor scripturilor cu care standardul vă permite să lucrați. Dar este chiar necesar pentru fiecare dezvoltator? Vom spune nu. Pentru a utiliza Unicode în majoritatea sarcinilor de zi cu zi, este suficient să cunoașteți un minim rezonabil de informații și apoi să vă aprofundați în standard, după cum este necesar.

În acest articol, vom vorbi despre principiile de bază ale Unicode și vom evidenția acele probleme practice importante cu care dezvoltatorii se vor confrunta cu siguranță în munca lor de zi cu zi.

De ce ai nevoie de Unicode?

Înainte de apariția Unicode, codificările pe un singur octet erau folosite aproape universal, în care granița dintre caracterele în sine, reprezentarea lor în memoria computerului și afișarea pe ecran era destul de arbitrară. Dacă ați lucrat cu una sau alta limbă națională, atunci fonturile-codificări corespunzătoare au fost instalate pe sistemul dvs., ceea ce a făcut posibilă extragerea octeților de pe disc de pe ecran, astfel încât să aibă sens pentru utilizator.

Dacă ați imprimat un fișier text pe imprimantă și ați văzut un set de krakozyabras de neînțeles pe pagina de hârtie, aceasta însemna că fonturile corespunzătoare nu au fost încărcate în dispozitivul de imprimare și nu a interpretat octeții în modul în care ați dori.

Această abordare, în general, și codificările pe un singur octet, în special, au avut o serie de dezavantaje semnificative:

  1. S-a putut lucra simultan cu doar 256 de caractere, iar primele 128 au fost rezervate caracterelor latine și de control, iar în a doua jumătate, pe lângă caracterele alfabetului național, a fost necesar să se găsească un loc pentru pseudo-grafic. caractere (╔ ╗).
  2. Fonturile au fost legate de o anumită codificare.
  3. Fiecare codificare reprezenta propriul set de caractere și conversia de la unul la altul era posibilă doar cu pierderi parțiale, când caracterele lipsă erau înlocuite cu altele similare grafic.
  4. Transferul fișierelor între dispozitive care rulează diferite sisteme de operare a fost dificil. Era necesar fie să aveți un program de conversie, fie să aveți fonturi suplimentare împreună cu fișierul. Existența Internetului așa cum îl știm noi a fost imposibilă.
  5. Există în lume sisteme de scriere non-alfabetică (scriere hieroglifică), care într-o codificare pe un singur octet nu sunt reprezentabile în principiu.

Principiile de bază ale Unicode

Cu toții înțelegem perfect că computerul nu știe despre nicio entitate ideală, dar funcționează cu biți și octeți. Dar sistemele informatice sunt încă create de oameni, nu de mașini și, uneori, este mai convenabil pentru tine și pentru mine să operam cu concepte speculative și apoi să trecem de la abstract la concret.

Important! Una dintre principiile centrale ale filozofiei Unicode este o distincție clară între caractere, reprezentarea lor într-un computer și afișarea lor pe un dispozitiv de ieșire.

Se introduce conceptul de caracter abstract unicode, care există exclusiv sub forma unui concept speculativ și a unui acord între oameni, consacrat în standard. Fiecare caracter Unicode este asociat cu un număr întreg nenegativ numit punctul său de cod.

Deci, de exemplu, caracterul unicode U + 041F este o literă chirilică mare P. Există mai multe moduri de a reprezenta acest caracter în memoria computerului, la fel cum există câteva mii de moduri de a-l afișa pe ecranul unui monitor. Dar, în același timp, P, va fi și P sau U + 041F în Africa.

Aceasta este încapsularea familiară, sau separarea interfeței de implementare, un concept care a funcționat bine în programare.

Se dovedește că, ghidându-se după standard, orice text poate fi codificat ca o secvență de caractere unicode

Bună ziua U + 041F U + 0440 U + 0438 U + 0432 U + 0435 U + 0442

notează-l pe o foaie de hârtie, împachetează-l într-un plic și trimite-l în orice parte a lumii. Dacă ei știu despre existența Unicode, atunci textul va fi perceput de ei exact în același mod ca și de către tine și mine. Nu vor avea nici cea mai mică îndoială că penultimul personaj este exact literele chirilice mici e(U + 0435) nu spune latin mic e(U + 0065). Rețineți că nu am spus un cuvânt despre reprezentarea octeților.

Spațiu cod Unicode

Spațiul de cod Unicode este format din 1 114 112 puncte de cod, variind de la 0 la 10FFFF. Dintre acestea, doar 128.237 li s-au atribuit valori pentru cea de-a noua versiune a standardului.O parte din spațiu este rezervată uzului privat și consorțiul Unicode promite să nu atribuie niciodată valori pozițiilor din aceste zone speciale.

Din motive de comoditate, întregul spațiu este împărțit în 17 avioane (acum șase dintre ele sunt implicate). Până de curând, se obișnuia să se spună că cel mai probabil va trebui să te confrunți doar cu Basic Multilingual Plane (BMP), care include caractere Unicode de la U + 0000 la U + FFFF. (Privind puțin înainte: caracterele BMP sunt reprezentate în UTF-16 în doi octeți, nu patru). În 2016, această teză este deja în dubiu. Deci, de exemplu, caracterele Emoji populare pot fi găsite într-un mesaj de utilizator și trebuie să le puteți procesa corect.

Codificări

Dacă vrem să trimitem text prin Internet, atunci trebuie să codificăm o secvență de caractere unicode ca o secvență de octeți.

Standardul Unicode include o serie de codificări Unicode, cum ar fi UTF-8 și UTF-16BE / UTF-16LE, care permit codificarea întregului spațiu al punctelor de cod. Conversia între aceste codificări poate fi efectuată în mod liber, fără pierderi de informații.

De asemenea, nimeni nu a anulat codificări pe un singur octet, dar vă permit să vă codificați propria bucată individuală și foarte îngustă din spectrul Unicode - 256 sau mai puține puncte de cod. Pentru astfel de codificări, tabele există și sunt disponibile pentru toată lumea, unde fiecare valoare a unui singur octet este asociată cu un caracter unicode (vezi, de exemplu, CP1251.TXT). În ciuda limitărilor, codificările pe un singur octet se dovedesc a fi foarte practice atunci când vine vorba de lucrul cu o gamă largă de informații text monolingve.

UTF-8 este cea mai folosită codificare Unicode pe internet (a câștigat palma în 2008), în principal datorită economiei și compatibilității transparente cu ASCII pe șapte biți. Caractere latine și de serviciu, semne de punctuație de bază și numere - i.e. toate caracterele ASCII pe șapte biți sunt codificate în UTF-8 pe un octet, la fel ca în ASCII. Caracterele multor scripturi majore, în afară de unele dintre caracterele hieroglifice mai rare, sunt reprezentate în el prin doi sau trei octeți. Cel mai mare punct de cod definit de standard, 10FFFF, este codificat în patru octeți.

Rețineți că UTF-8 este o codificare de lungime variabilă. Fiecare caracter Unicode din el este reprezentat de o secvență de cuante de cod cu o lungime minimă de o cuantă. Numărul 8 înseamnă lungimea de biți a unității de cod - 8 biți. Pentru familia de codificări UTF-16, dimensiunea cuantumului codului este, respectiv, de 16 biți. Pentru UTF-32 - 32 de biți.

Dacă trimiteți o pagină HTML cu text chirilic prin rețea, atunci UTF-8 poate oferi un beneficiu foarte tangibil, deoarece toate marcajele, precum și blocurile JavaScript și CSS vor fi codificate eficient pe un octet. De exemplu, pagina principală a lui Habr în UTF-8 este de 139Kb, iar în UTF-16 este deja de 256Kb. Pentru comparație, dacă utilizați win-1251 cu pierderea capacității de a stoca unele caractere, atunci dimensiunea va fi redusă cu doar 11Kb.

Pentru a stoca informații de șir în aplicații, codificări Unicode pe 16 biți sunt adesea folosite datorită simplității lor, precum și faptului că caracterele principalelor sisteme de scriere ale lumii sunt codificate într-un cuantic de șaisprezece biți. Deci, de exemplu, Java folosește cu succes UTF-16 pentru reprezentarea internă a șirurilor. Sistemul de operare Windows utilizează, de asemenea, UTF-16 intern.

În orice caz, atâta timp cât rămânem în spațiul Unicode, nu contează cu adevărat cât de informații sunt stocate într-o singură aplicație. Dacă formatul de stocare internă vă permite să codificați corect toate peste un milion de puncte de cod și nu există nicio pierdere de informații la limita aplicației, de exemplu, când citiți dintr-un fișier sau copiați în clipboard, atunci totul este în regulă.

Pentru interpretarea corectă a textului citit de pe disc sau de pe o priză de rețea, trebuie mai întâi să determinați codificarea acestuia. Acest lucru se face fie folosind meta-informații furnizate de utilizator scrise în sau în apropierea textului, fie este determinată euristic.

În reziduul uscat

Există o mulțime de informații și este logic să facem un scurt rezumat a tot ceea ce a fost scris mai sus:

  • Unicode postulează o distincție clară între caractere, reprezentarea lor într-un computer și afișarea lor pe un dispozitiv de ieșire.
  • Spațiul de cod Unicode este format din 1 114 112 puncte de cod, variind de la 0 la 10FFFF.
  • Planul multilingv de bază include caractere Unicode U + 0000 până la U + FFFF, care sunt codificate în UTF-16 pe doi octeți.
  • Orice codificare Unicode vă permite să codificați întregul spațiu al punctelor de cod Unicode, iar conversia între diferite astfel de codificări se realizează fără pierderi de informații.
  • Codificările pe un singur octet pot codifica doar o mică parte din spectrul unicode, dar pot fi utile atunci când lucrați cu o cantitate mare de informații monolingve.
  • Codificările UTF-8 și UTF-16 au lungimi variabile de cod. În UTF-8, fiecare caracter Unicode poate fi codificat cu unul, doi, trei sau patru octeți. În UTF-16, doi sau patru octeți.
  • Formatul intern de stocare a informațiilor textuale într-o aplicație separată poate fi arbitrar, cu condiția să funcționeze corect cu întregul spațiu al punctelor de cod Unicode și să nu existe pierderi în transmiterea transfrontalieră a datelor.

O notă rapidă despre codificare

Pot apărea anumite confuzii cu termenul de codificare. În Unicode, codificarea are loc de două ori. Prima dată când un set de caractere este codificat, în sensul că fiecărui caracter Unicode i se atribuie un punct de cod corespunzător. Acest proces transformă setul de caractere Unicode într-un set de caractere codat. A doua oară când o secvență de caractere unicode este convertită într-un șir de octeți, acest proces se mai numește și codificare.

În terminologia engleză, există două verbe diferite pentru a codifica și a codifica, dar chiar și vorbitorii nativi sunt adesea confuzi cu privire la ele. În plus, termenul set de caractere sau set de caractere este folosit ca sinonim cu termenul set de caractere codat.

Toate acestea le spunem faptului că are sens să acordăm atenție contextului și să distingem situațiile când vine vorba de poziția codului unui caracter abstract unicode și când vine vorba de reprezentarea lui octet.

In cele din urma

Există atât de multe aspecte diferite ale Unicode, încât este imposibil să acoperiți totul într-un singur articol. Și inutil. Informațiile de mai sus sunt suficiente pentru a evita confuzia în principiile de bază și pentru a lucra cu text în majoritatea sarcinilor de zi cu zi (citiți: fără a depăși BMP). În articolele următoare vom vorbi despre normalizare, vom oferi o imagine de ansamblu istorică mai completă a dezvoltării codificărilor, vom vorbi despre problemele terminologiei Unicode în limba rusă și vom face, de asemenea, materiale despre aspectele practice ale utilizării UTF-8 și UTF-16. .

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

Unicode este un set de caractere grafice și o modalitate de a le codifica pentru prelucrarea computerizată a datelor text.

Unicode 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.);

    litera majuscule sau minuscule corespunzatoare (pentru litere mici, respectiv majuscule);

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

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

UTF-16: Modificare Windows, accelerare, Întrebări frecvente Vista utilizează codificarea UTF-16 pentru a reprezenta toate caracterele Unicode. Î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ă .NET Framework codifică toate caracterele folosind UTF-16, astfel încât utilizarea UTF-16 în aplicațiile 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 convenabilă pentru scrierea unor algoritmi simpli pentru enumerarea caracterelor în 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, un format special Unicode (și ISO 10646) a fost 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 un web designer, această codificare este de o importanță deosebită, deoarece este cea care a fost declarată „codarea standard a documentelor” în HTML încă din versiunea 4.

Textul care conține doar caractere numerotate mai puțin de 128 este convertit în text simplu ASCII atunci când este scris în UTF-8. Î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, caracterele latine, semnele de punctuație și caracterele de control ASCII sunt scrise în coduri US-ASCII, iar 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, literele latine, cifrele arabe și semnele de punctuație vor fi afișate 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 număr foarte mare de caractere din diferite scripturi: în documentele Unicode, caracterele chinezești, caracterele matematice, literele alfabetului grecesc, alfabetul latin și chirilic pot coexista, astfel comutarea paginilor de cod devine inutilă.

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, ceea ce îi permite să acopere un număr incomparabil mai mare de caractere decât codificările de 8 biți acceptate anterior. O altă diferență importantă între Unicode și alte sisteme de codare este că nu numai că atribuie un cod unic fiecărui caracter, ci și definește diferite caracteristici ale acestui caracter, 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 anumite limbi, fie unui grup de caractere speciale care sunt similare î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 stocarea și textul în multe sisteme informatice moderne. 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ătoarele reguli pentru conversia fiecărui cod Unicode într-un set de octeți (unu până la trei) potriviti pentru transport 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. Un nou format UTF-16 a fost dezvoltat pentru a codifica aceste caractere suplimentare.

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 numai 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.

Top articole similare