Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ
  • në shtëpi
  • Interesante
  • Standardi ndërkombëtar unicode. Pse ishte i nevojshëm Unicode? Një shënim i shpejtë rreth kodimit

Standardi ndërkombëtar unicode. Pse ishte i nevojshëm Unicode? Një shënim i shpejtë rreth kodimit

Unicode është një standard ndërkombëtar i kodimit të karaktereve që lejon që teksti të shfaqet vazhdimisht në çdo kompjuter në botë, pavarësisht nga gjuha e sistemit që përdor.

Bazat

Për të kuptuar se për çfarë shërben tabela e karaktereve Unicode, le të kuptojmë së pari mekanizmin e shfaqjes së tekstit në ekranin e monitorit. Kompjuteri, siç e dimë, përpunon të gjithë informacionin në formë dixhitale, dhe duhet të shfaqet grafikisht për perceptimin e duhur njerëzor. Kështu, që ne të lexojmë këtë tekst, duhet të zgjidhim të paktën dy probleme:

  • Kodoni karaktere të shtypura në formë dixhitale.
  • Siguroni sistemin operativ me aftësinë për t'u përshtatur formë dixhitale me simbole vektoriale, me fjalë të tjera, gjeni shkronjat e sakta.

Kodimet e para

ASCII amerikan konsiderohet të jetë paraardhësi i të gjitha kodimeve. Ai përshkruante metodën e përdorur në gjuhe angleze Alfabeti latin me shenja pikësimi dhe numra arabë. Ishin 128 karakteret e përdorura në të që u bënë bazë për zhvillimet e mëvonshme - madje edhe tabela moderne e karaktereve Unicode i përdor ato. Shkronjat e alfabetit latin që atëherë kanë zënë pozicionet e para në çdo kodim.

Në total, ASCII lejoi të ruheshin 256 karaktere, por meqenëse 128 të parët ishin të zënë nga alfabeti latin, 128 të mbeturit filluan të përdoren në të gjithë botën për të krijuar standarde kombëtare. Për shembull, në Rusi, CP866 dhe KOI8-R u krijuan në bazë të tij. Variacione të tilla quheshin versione të zgjeruara të ASCII.

Faqet e kodit dhe "krakozyabry"

Zhvillimi i mëtejshëm teknologjitë dhe shfaqja e një ndërfaqe grafike çuan në krijimin e kodimit ANSI nga Instituti Amerikan i Standardeve. Përdoruesit rusë, sidomos me përvojë, versioni i tij njihet nën me emrin Windows 1251. Koncepti i "faqes së kodit" u përdor për herë të parë në të. Pikërisht me ndihmën e faqeve të kodit që përmbanin karaktere nga alfabete kombëtare të ndryshme nga latinishtja u krijua "mirëkuptimi i ndërsjellë" midis kompjuterëve të përdorur në vende të ndryshme.

Në të njëjtën kohë, prania sasi e madhe kodime të ndryshme të përdorura për të njëjtën gjuhë filluan të shkaktojnë probleme. U shfaqën të ashtuquajturit krakozyabrs. Ato lindën nga një mospërputhje midis faqes së kodit burimor në të cilën u krijua çdo informacion dhe faqes së kodit të paracaktuar të përdorur në kompjuterin e përdoruesit përfundimtar.

Si shembull, mund të citojmë sa më sipër Kodimet cirilike CP866 dhe KOI8-R. Shkronjat në to ndryshonin në pozicionet e kodit dhe parimet e vendosjes. Në të parën ata u vendosën në sipas rendit alfabetik, dhe në të dytën - në një arbitrare. Ju mund të imagjinoni se çfarë po ndodhte para syve të një përdoruesi që u përpoq të hapte një tekst të tillë pa pasur faqen e kodit të kërkuar ose kur ishte interpretuar gabimisht nga kompjuteri.

Krijimi i Unicode

Përhapja e internetit dhe teknologjive të ngjashme si p.sh Email, çoi në faktin se në fund situata me shtrembërimin e teksteve pushoi së përshtaturi me të gjithë. Kompanitë kryesore të IT-së kanë formuar Konsorciumin Unicode. Tabela e personazheve që ai prezantoi në 1991, e quajtur UTF-32, mund të ruante më shumë se një miliard karaktere unike. Ishte hapi më i rëndësishëm në rrugën e deshifrimit të teksteve.

Sidoqoftë, tabela e parë universale e kodeve të karaktereve, Unicode UTF-32, nuk u përdor gjerësisht. Arsyeja kryesore ishte teprica e informacionit të ruajtur. U llogarit shpejt se për vendet që përdorin alfabetin latin të koduar duke përdorur tabelën e re universale, teksti do të zinte katër herë më shumë hapësirë ​​sesa përdorimi i tabelës së zgjeruar ASCII.

Zhvillimi i Unicode

Tabela e mëposhtme e karaktereve Unicode UTF-16 e rregulloi këtë problem. Kodimi në të u krye me gjysmën e numrit të biteve, por në të njëjtën kohë numri i kombinimeve të mundshme u ul. Në vend të miliarda karaktereve, ju lejon të ruani vetëm 65,536. Megjithatë, doli të ishte aq i suksesshëm sa ky numër, sipas vendimit të Konsorciumit, u përcaktua si hapësira bazë e ruajtjes për karakteret standarde Unicode.

Megjithë këtë sukses, UTF-16 nuk u përshtatet të gjithëve, pasi vëllimi i ruajtur dhe informacionin e transmetuar ishte ende dyfishuar. Një zgjidhje universale u bë UTF-8, një tabelë karakteresh Unicode me gjatësi të ndryshueshme. Kjo mund të quhet një përparim në këtë fushë.

Kështu, me prezantimin e dy standardeve të fundit, tabela e karaktereve Unicode zgjidhi problemin e një hapësire të vetme kodi për të gjitha fontet në përdorim aktualisht.

Unicode për gjuhën ruse

Falë gjatësi të ndryshueshme kodi i përdorur për të shfaqur karaktere, alfabeti latin është i koduar në Unicode në të njëjtën mënyrë si në paraardhësin e tij ASCII, domethënë në një bit. Për alfabetet e tjera fotografia mund të duket ndryshe. Për shembull, karakteret e alfabetit gjeorgjian përdorin tre bajtë për kodim, dhe karakteret e alfabetit cirilik përdorin dy. E gjithë kjo është e mundur brenda kornizës së përdorimit të standardit UTF-8 Unicode (tabela e karaktereve). Gjuha ruse ose alfabeti cirilik zë 448 pozicione në hapësirën e kodit të përgjithshëm, të ndarë në pesë blloqe.

Këto pesë blloqe përfshijnë alfabetin bazë cirilik dhe sllav të kishës, si dhe letra shtesë gjuhë të tjera që përdorin alfabetin cirilik. Një numër pozicionesh janë ndarë për të shfaqur format e vjetra të paraqitjes së shkronjave cirilike dhe 22 pozicione nga totali janë ende të lira.

Versioni aktual i Unicode

Me zgjidhjen e detyrës së tij parësore, që ishte standardizimi i shkronjave dhe krijimi i një hapësire të vetme kodi për to, Konsorciumi nuk e ndërpreu punën e tij. Unicode po zhvillohet dhe zgjerohet vazhdimisht. Versioni i fundit aktual i këtij standardi, 9.0, u lëshua në vitin 2016. Ai përfshinte gjashtë alfabete shtesë dhe zgjeroi listën e emoji-ve të standardizuar.

Duhet thënë se për të thjeshtuar kërkimin, në Unicode i shtohen edhe të ashtuquajturat gjuhë të vdekura. Ata e kanë marrë këtë emër sepse nuk ka njerëz për të cilët është vendas. Në këtë grup bëjnë pjesë edhe gjuhët që kanë arritur në kohën tonë vetëm në formën e monumenteve të shkruara.

Në parim, çdokush mund të aplikojë për shtimin e karaktereve në specifikimin e ri të Unicode. Vërtetë, për këtë do t'ju duhet të plotësoni një sasi të mirë dokumentesh fillestare dhe të shpenzoni shumë kohë. Një shembull i gjallë i kësaj është historia e programuesit Terence Eden. Në vitin 2013, ai paraqiti një kërkesë për të përfshirë në specifikimet simbolet që lidhen me përcaktimin e butonave të kontrollit të energjisë kompjuterike. NË dokumentacioni teknik ato kanë qenë në përdorim që nga mesi i viteve 1970, por nuk ishin pjesë e Unicode deri në specifikimin 9.0.

tabelë simbolesh

Çdo kompjuter, pavarësisht nga sistemi operativ i përdorur, përdor tabelën e karaktereve Unicode. Si t'i përdorni këto tabela, ku mund t'i gjeni dhe pse mund të jenë të dobishme për përdoruesin mesatar?

Në OS Tabela e Windows simbolet gjenden në seksionin e menysë "Shërbimi". Në familjen e sallës së operacionit Sistemet Linux zakonisht mund të gjendet në nënseksionin "Accessories", dhe në MacOS - në cilësimet e tastierës. Qëllimi kryesor i kësaj tabele është të hyjë dokumente tekstuale karaktere që nuk janë të vendosura në tastierë.

Gama më e gjerë e aplikacioneve për tabela të tilla mund të gjendet: nga futja e simboleve teknike dhe simboleve kombëtare sistemet monetare para se të shkruani udhëzime për aplikim praktik Kartat tarot.

Së fundi

Unicode përdoret kudo dhe hyri në jetën tonë me zhvillimin e internetit dhe teknologjive celulare. Falë përdorimit të tij, sistemi i komunikimeve ndëretnike është thjeshtuar ndjeshëm. Mund të themi se prezantimi i Unicode është një shembull ilustrues, por krejtësisht i padukshëm nga jashtë, i përdorimit të teknologjisë për të mirën e përbashkët të mbarë njerëzimit.

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

Unicode është një grup simbolet grafike dhe mënyra për t'i koduar ato përpunimi kompjuterik të dhënat e tekstit.

Unicode jo vetëm që cakton çdo karakter kod unik, por edhe përcakton karakteristika të ndryshme ky personazh, për shembull:

    lloji i karakterit (shkronja e madhe, shkronje e vogel, numri, shenja e pikësimit etj.);

    atributet e karaktereve (shfaqja nga e majta në të djathtë ose nga e djathta në të majtë, hapësira, ndërprerja e rreshtit, etj.);

    shkronja përkatëse e madhe ose e vogël (për shkronja të vogla dhe shkronjat e mëdha përkatësisht);

    të përshtatshme vlerë numerike(për karaktere dixhitale).

    Standardet UTF(një shkurtim për Unicode Transformation Format) për të përfaqësuar karakteret:

UTF-16: Në konfigurimin e Windows, përshpejtimin, FAQ të Vista për t'i paraqitur të gjithë Karakteret e Unicode Përdoret kodimi UTF-16. Në UTF-16, karakteret përfaqësohen si dy bajt (16 bit). Ky kodim përdoret në Windows sepse vlerat 16-bit mund të përfaqësojnë karakteret që përbëjnë alfabetet e shumicës së gjuhëve, duke i lejuar programet të përpunojnë vargjet dhe të llogarisin më shpejt gjatësinë e tyre. Megjithatë, 16 bit nuk janë të mjaftueshëm për të përfaqësuar karakteret e alfabetit të disa gjuhëve. Për raste të tilla, UTE-16 mbështet kodimet "zëvendësuese", të cilat lejojnë që karakteret të kodohen në 32 bit (4 bajt). Megjithatë, ka pak aplikacione që kanë të bëjnë me karaktere nga gjuhë të tilla, kështu që UTF-16 është një kompromis i mirë midis kursimit të memories dhe lehtësisë së programimit. Vini re se .NET Framework kodon të gjithë karakteret duke përdorur UTF-16, kështu që duke përdorur UTF-16 në aplikacionet e Windows Përmirëson performancën dhe redukton konsumin e kujtesës kur kalon vargjet midis kodit vendas dhe atij të menaxhuar.

UTF-8: Në kodimin UTF-8, karaktere të ndryshme mund të përfaqësohen me 1,2,3 ose 4 bajt. Karakteret me vlera më të vogla se 0x0080 janë të ngjeshur në 1 bajt, gjë që është shumë e përshtatshme për karakteret e përdorura në Shtetet e Bashkuara. Karakteret që përputhen me vlerat në rangun 0x0080-0x07FF konvertohen në vlera 2-bajtë, gjë që funksionon mirë me alfabetet evropiane dhe të Lindjes së Mesme. Karakteret me vlera më të mëdha konvertohen në vlera 3-byte, të përshtatshme kur punoni me gjuhët e Azisë Qendrore. Së fundi, çiftet "zëvendësuese" shkruhen në një format 4 bajt. UTF-8 është një kodim jashtëzakonisht popullor. Sidoqoftë, është më pak efektiv se UTF-16 nëse përdoren shpesh karaktere me vlera 0x0800 dhe më të larta.

UTF-32: Në UTF-32, të gjithë karakteret përfaqësohen nga 4 bajt. Ky kodim është i përshtatshëm për t'u shkruar algoritme të thjeshta për numërimin e karaktereve të çdo gjuhe që nuk kërkojnë përpunim të karaktereve të përfaqësuara nga një numër i ndryshëm bajtësh. Për shembull, kur përdorni UTF-32, mund të harroni "zëvendësuesit", pasi çdo karakter në këtë kodim përfaqësohet nga 4 bajt. Është e qartë se për sa i përket përdorimit të memories, UTF-32 është larg idealit. Prandaj, ky kodim përdoret rrallë për të transmetuar vargje në rrjet dhe për t'i ruajtur ato në skedarë. Si rregull, UTF-32 përdoret si një format i brendshëm për paraqitjen e të dhënave në një program.

UTF-8

Në të ardhmen e afërt, gjithnjë e më shumë rol i rendesishem do të luajë një format të veçantë Unicode (dhe ISO 10646) të quajtur UTF-8. Ky kodim "i rrjedhur" përdor vargje bajtësh me gjatësi të ndryshme (nga një në gjashtë) për të shkruar karaktere, të cilat konvertohen në kode Unicode duke përdorur një algoritëm të thjeshtë, me vargje më të shkurtra që korrespondojnë me karaktere më të zakonshme. Avantazhi kryesor i këtij formati është përputhshmëria e tij me ASCII jo vetëm për sa i përket vlerave të kodit, por edhe në numrin e biteve për karakter, pasi një bajt është i mjaftueshëm për të koduar ndonjë nga 128 karakteret e para në UTF-8 (megjithëse, për për shembull, për shkronjat cirilike ju duhen tashmë dy bajtë).

Formati UTF-8 u shpik më 2 shtator 1992 nga Ken Thompson dhe Rob Pike dhe u zbatua në Planin 9. Standardi UTF-8 është zyrtarizuar tani në RFC 3629 dhe ISO/IEC 10646 Aneksi D.

Për Dizajner ueb Ky kodim është i një rëndësie të veçantë sepse është shpallur "kodimi standard i dokumentit" në HTML që nga versioni 4.

Teksti që përbëhet vetëm nga karaktere të numëruara më pak se 128 konvertohet në UTF-8 kur shkruhet në Teksti i thjeshtë ASCII. Anasjelltas, në tekstin UTF-8, çdo bajt me vlerë më të vogël se 128 përfaqëson një karakter ASCII me të njëjtin kod. Karakteret e mbetura të Unicode përfaqësohen nga sekuenca të gjatësisë nga 2 deri në 6 bajt (në fakt vetëm deri në 4 bajt, pasi përdorimi i kodeve më të mëdha se 221 nuk është planifikuar), në të cilin bajt i parë është gjithmonë 11xxxxxx, dhe pjesa tjetër është 10xxxxxx .

E thënë thjesht, në formatin UTF-8, karakteret e alfabetit latin, shenjat e pikësimit dhe kontrolli Personazhet ASCII janë të shkruara në kodet US-ASCII, dhe të gjithë karakteret e tjera janë të koduara duke përdorur oktete të shumta me bitin më domethënës 1. Kjo ka dy efekte.

    Edhe nëse programi nuk e njeh Unicode, atëherë letra, numrat arabë dhe shenjat e pikësimit do të shfaqen saktë.

    Nëse shkronjat latine dhe shenjat e thjeshta të pikësimit (përfshirë hapësirat) zënë një sasi të konsiderueshme teksti, UTF-8 siguron një rritje në vëllim në krahasim me UTF-16.

    Në shikim të parë, mund të duket se UTF-16 është më i përshtatshëm, pasi shumica e karaktereve janë të koduara saktësisht në dy bajt. Megjithatë, kjo mohohet nga nevoja për të mbështetur çiftet zëvendësuese, të cilat shpesh harrohen kur përdorin UTF-16, duke zbatuar vetëm mbështetje për karakteret UCS-2.

Standardi u propozua në 1991 nga organizata jofitimprurëse Unicode Consortium (Unicode Inc.). Përdorimi i këtij standardi bën të mundur kodimin shumë numër i madh karaktere nga skriptet e ndryshme: karakteret kineze mund të bashkëjetojnë në dokumentet Unicode, simbolet matematikore, shkronjat e alfabetit grek, latin dhe cirilik, dhe ndërrimi i faqeve të kodit bëhet i panevojshëm.

Standardi përbëhet nga dy seksione kryesore: grupi universal i karaktereve (UCS) dhe familja e kodimit (UTF, formati i transformimit Unicode). Grupi universal i karaktereve specifikon një korrespondencë një-për-një midis karaktereve dhe kodeve - elementë të hapësirës së kodit që përfaqësojnë numra të plotë jo negativë. Një familje kodimi përcakton paraqitjen e makinës të një sekuence kodesh UCS.

Standardi Unicode u zhvillua për të krijuar një kodim të vetëm karakteresh për të gjitha gjuhët e shkruara moderne dhe shumë të lashta. Çdo karakter në këtë standard është i koduar me 16 bit, gjë që e lejon atë të mbulohet në mënyrë të pakrahasueshme sasi e madhe karaktere se kodimet 8-bit të pranuara më parë. Nje me shume dallim i rëndësishëm Unicode ndryshon nga sistemet e tjera të kodimit në atë që jo vetëm që cakton një kod unik për çdo karakter, por gjithashtu përcakton karakteristika të ndryshme të atij karakteri, për shembull:

Lloji i karakterit (shkronja e madhe, shkronja e vogël, numri, shenja e pikësimit, etj.);

Atributet e karaktereve (shfaqja nga e majta në të djathtë ose nga e djathta në të majtë, hapësira, ndërprerja e rreshtit, etj.);

Shkronjat përkatëse të mëdha ose të vogla (përkatësisht për shkronjat e vogla dhe të mëdha);

Vlera numerike përkatëse (për karakteret numerike).

I gjithë diapazoni i kodeve nga 0 në FFFF është i ndarë në disa nëngrupe standarde, secila prej të cilave korrespondon ose me alfabetin e një gjuhe ose me një grup personazhe të veçanta, të ngjashme në funksionet e tyre. Diagrami më poshtë përmban një listë të përgjithshme të nëngrupeve Unicode 3.0 (Figura 2).

Figura 2

Standardi Unicode është baza për ruajtjen e tekstit në shumë moderne sistemet kompjuterike. Megjithatë, ai nuk është i pajtueshëm me shumicën e protokolleve të internetit, sepse kodet e tij mund të përmbajnë çdo vlerë bajt, dhe protokollet zakonisht përdorin bajt 00 - 1F dhe FE - FF si bajt shërbimi. Për të arritur pajtueshmërinë, janë zhvilluar disa formate të transformimit të Unicode (UTF, Unicode Transformation Formats), nga të cilat UTF-8 është më i zakonshmi sot. Ky format përcakton duke ndjekur rregullat duke konvertuar çdo kod Unicode në një grup bajtësh (një deri në tre) të përshtatshëm për transport me protokollet e internetit.


Këtu x, y, z tregojnë pjesët e kodit burimor që duhet të nxirren, duke filluar me atë më pak të rëndësishëm, dhe të futen në bajtet e rezultatit nga e djathta në të majtë derisa të plotësohen të gjitha pozicionet e specifikuara.

Zhvillimi i mëtejshëm i standardit Unicode shoqërohet me shtimin e planeve të reja gjuhësore, d.m.th. karaktere në intervalet 10000 - 1FFFF, 20000 - 2FFFF, etj., ku supozohet të përfshijë kodimin për skriptet e gjuhëve të vdekura që nuk përfshihen në tabelën e mësipërme. Për të koduar këto karaktere shtesë, ajo u zhvillua format i ri UTF-16.

Pra, ekzistojnë 4 mënyra kryesore për të koduar bajtet e Unicode:

UTF-8: 128 karaktere të koduara në një bajt (format ASCII), 1920 karaktere të koduara në 2 bajt ((shkronja romake, greke, cirilike, kopte, armene, hebraike, arabe), 63488 karaktere të koduara në 3 bajt (kineze, japoneze etj. .) 2,147,418,112 karakteret e mbetura (jo të përdorura ende) mund të kodohen me 4, 5 ose 6 bajt.

UCS-2: Çdo karakter përfaqësohet nga 2 bajt. Ky kodim përfshin vetëm 65,535 karakteret e para nga formati Unicode.

UTF-16: Një shtesë e UCS-2, përmban 1,114,112 karaktere të formatit Unicode. 65.535 karakteret e para përfaqësohen me 2 bajt, pjesa tjetër me 4 bajt.

USC-4: Çdo karakter është i koduar në 4 bajt.

Besoni apo jo, ekziston një format për imazhet e integruara në shfletues. Ky format ju lejon të ngarkoni imazhe përpara se ato të nevojiten, siguron paraqitjen e imazhit në mënyrë të rregullt ose ekranet e retinës dhe ju lejon të shtoni në Imazhet CSS. OK, kjo nuk është plotësisht e vërtetë. Nuk është një format imazhi, megjithëse gjithçka tjetër ende zbatohet. Duke e përdorur atë, mund të krijoni ikona që janë të pavarura nga rezolucioni, nuk kërkojnë kohë ngarkimi dhe janë të stiluara duke përdorur CSS.

Çfarë është Unicode?

Unicode është aftësia për të shfaqur saktë shkronjat dhe shenjat e pikësimit nga gjuhë të ndryshme në një faqe. Është tepër i dobishëm: përdoruesit do të jenë në gjendje të ndërveprojnë me faqen tuaj anembanë botës dhe ai do të tregojë atë që dëshironi - mund të jetë frëngjisht me thekse ose Kanji.

Unicode vazhdon të zhvillohet: versioni 8.0 është tani aktual, i cili përmban më shumë se 120 mijë karaktere (në artikullin origjinal të botuar në fillim të vitit 2014, po flisnim për versionin 6.3 dhe 110 mijë karaktere).

Përveç shkronjave dhe numrave, Unicode ka edhe simbole dhe ikona të tjera. NË versionet e fundit këto përfshinin emoji, të cilat mund t'i shihni në mesazherin iOS.

Faqet HTML krijohen nga një sekuencë karakteresh Unicode dhe konvertohen në bajt kur dërgohen në rrjet. Çdo shkronjë dhe çdo simbol i çdo gjuhe ka kodin e vet unik dhe kodohet kur skedari ruhet.

Kur përdorni sistemin e kodimit UTF-8, mund të futni drejtpërdrejt karaktere Unicode në tekst, por gjithashtu mund t'i shtoni ato në tekst duke specifikuar një lidhje simbolike numerike. Për shembull, ky është një simbol i zemrës dhe ju mund ta nxirrni këtë simbol thjesht duke shtuar kodin në shënim.

Kjo referencë numerike mund të specifikohet në format dhjetor ose heksadecimal. Formati dhjetor kërkon shtimin e një x në fillim, shënimi do të prodhojë të njëjtën zemër ( ) si versioni i mëparshëm. (2665 është versioni heksadecimal i 9829).

Nëse shtoni një karakter Unicode duke përdorur CSS, atëherë mund të përdorni vetëm vlera heksadecimal.

Disa nga karakteret më të përdorura të Unicode kanë emra teksti ose shkurtesa më të paharrueshme në vend të kodeve numerike - për shembull, ampersand (& - &). Simbolet e tilla quhen mnemonikë në HTML, lista e tyre e plotë gjendet në Wikipedia.

Pse duhet të përdorni Unicode?

Pyetje e mirë, këtu janë disa arsye:

  1. Për të përdorur karakteret e duhura nga gjuhë të ndryshme.
  2. Për të zëvendësuar ikonat.
  3. Për të zëvendësuar ikonat e lidhura nëpërmjet @font-face .
  4. Për të vendosur klasa CSS

Karaktere të vlefshme

Arsyeja e parë nuk kërkon asnjë veprime shtesë. Nëse HTML ruhet si UTF-8 dhe kodimi i tij transmetohet në rrjet si UTF-8, gjithçka duhet të funksionojë siç pritej.

duhet. Fatkeqësisht, jo të gjithë shfletuesit dhe pajisjet mbështesin të gjithë karakteret e Unicode në mënyrë të barabartë (më saktë, jo të gjitha fontet mbështesin komplet i plotë personazhe). Për shembull, karakteret emoji të shtuara së fundmi nuk mbështeten kudo.

Për të mbështetur UTF-8 në HTML5, shtoni (nëse nuk keni akses në cilësimet e serverit, duhet të shtoni gjithashtu ). Me doktipin e vjetër, ( ).

Ikonat

Arsyeja e dytë për përdorimin e Unicode është se ai ka një numër të madh karakteresh të dobishëm që mund të përdoren si ikona. Për shembull, , ≡ dhe .

Avantazhi i tyre i dukshëm është se ju nuk keni nevojë për asnjë skedarë shtesë t'i shtoni ato në faqe, që do të thotë se faqja juaj do të jetë më e shpejtë. Ju gjithashtu mund të ndryshoni ngjyrën e tyre ose të shtoni një hije duke përdorur CSS. Dhe duke shtuar tranzicione ( tranzicioni css) mund ta ndryshoni pa probleme ngjyrën e ikonës kur rri pezull mbi të pa asnjë imazhe shtesë.

Le të themi se dua të përfshij një tregues vlerësimi me yje në faqen time. Unë mund ta bëj kështu:

★ ★ ★ ☆ ☆

Do të merrni rezultatin e mëposhtëm:

Por nëse nuk jeni me fat, do të shihni diçka të tillë:

I njëjti vlerësim për BlackBerry 9000

Kjo ndodh nëse karakteret e përdorura nuk janë në fontin e shfletuesit ose pajisjes (për fat të mirë, këta yje janë të mbështetur mirë dhe më të vjetër Telefonat BlackBerry janë përjashtimi i vetëm këtu).

Nëse një karakter Unicode mungon, ai mund të zëvendësohet nga një shumëllojshmëri karakteresh, duke filluar nga një katror bosh (□) deri në një diamant me një pikëpyetje (�).

Si e gjeni një karakter Unicode që mund të jetë i përshtatshëm për t'u përdorur në dizajnin tuaj? Mund ta kërkoni në një faqe si Unicodinator, duke parë karakteret e disponueshme, por ka edhe opsioni më i mirë. - Ky sajt i mrekullueshëm ju lejon të vizatoni ikonën që po kërkoni dhe më pas ju ofron një listë të karaktereve të ngjashme të Unicode.

Përdorimi i Unicode me ikonat @font-face

Nëse po përdorni ikona të lidhura me një font të jashtëm nëpërmjet @font-face , karakteret Unicode mund të përdoren si kthim prapa. Në këtë mënyrë mund të shfaqni një karakter të ngjashëm Unicode në ato pajisje ose shfletues ku @font-face nuk mbështetet:

Në të majtë janë ikonat Font Awesome në Chrome, dhe në të djathtë janë karakteret Unicode që i zëvendësojnë ato në Opera Mini.

Shumë vegla për hamendjen e @font-face përdorin një sërë karakteresh Unicode nga zona e përdorimit privat. Problemi me këtë qasje është se nëse @font-face nuk mbështetet, kodet e karaktereve i kalohen përdoruesit pa asnjë kuptim.

E shkëlqyeshme për krijimin e grupeve të ikonave në @font-face dhe ju lejon të zgjidhni një karakter të përshtatshëm Unicode si bazë për ikonën.

Por kini kujdes - disa shfletues dhe pajisje nuk u pëlqejnë personazhe individuale Unicode kur përdoret me @font-face. Vlen të kontrolloni mbështetjen e karaktereve Unicode me Unify - ky aplikacion do t'ju ndihmojë të përcaktoni nëse një karakter është i sigurt për t'u përdorur në grupin e ikonave @font-face.

Mbështetje e karaktereve Unicode

Problemi kryesor me përdorimin e karaktereve të Unicode si rezervë është mbështetja e dobët në lexuesit e ekranit (përsëri, disa informacione rreth kësaj mund të gjenden në Unify), kështu që është e rëndësishme të zgjidhni me kujdes karakteret që përdorni.

Nëse ikona juaj është thjesht një element dekorativ pranë një etikete teksti që lexohet nga një lexues ekrani, nuk keni pse të shqetësoheni shumë. Por nëse ikona vendoset veçmas, ia vlen të shtoni një etiketë teksti të fshehur për të ndihmuar përdoruesit e lexuesit të ekranit. Edhe nëse një karakter Unicode lexohet nga një lexues ekrani, ekziston mundësia që ai të jetë shumë i ndryshëm nga qëllimi i tij i synuar. Për shembull, ≡ (≡) si ikonë hamburgeri do të lexohet si "identike" nga VoiceOver në iOS.

Unicode në emrat e klasave CSS

Dihet që nga viti 2007 se Unicode mund të përdoret në emrat e klasave dhe fletët e stileve. Pikërisht atëherë Jonathan Snook shkroi për përdorimin e karaktereve Unicode në klasat ndihmëse kur vendosen qoshet e rrumbullakosura. Kjo ide nuk ka fituar shumë popullaritet, por ia vlen të dihet për mundësinë e përdorimit të Unicode në emrat e klasave (karaktere të veçanta ose cirilike).

Zgjedhja e fontit

Shumë pak fonte mbështesin grupin e plotë të karaktereve Unicode, kështu që kur zgjidhni një font, sigurohuni që ai të ketë karakteret që ju nevojiten.

Shumë ikona në Segoe UI Symbol ose Arial Unicode MS. Këto fonte janë të disponueshme si në PC ashtu edhe në Mac; Lucida Grande gjithashtu ka një numër të mjaftueshëm karakteresh Unicode. Ju mund t'i shtoni këto fonte në deklaratën e familjes së shkronjave për të siguruar disponueshmërinë sasia maksimale Karakteret Unicode për përdoruesit që kanë të instaluar këto fonte.

Përcaktimi i mbështetjes së Unicode

Do të ishte shumë e përshtatshme për të qenë në gjendje të kontrolloni praninë e një karakteri të veçantë Unicode, por nuk ka asnjë mënyrë të garantuar për ta bërë këtë.

Karakteret e Unicode mund të jenë efektive nëse mbështeten. Për shembull, një emoji në rreshtin e subjektit të një emaili e bën atë të dallohet nga pjesa tjetër në kuti postare.

konkluzioni

Ky artikull mbulon vetëm bazat e Unicode. Shpresoj që ta gjeni të dobishëm dhe t'ju ndihmojë të kuptoni më mirë Unicode dhe ta përdorni atë në mënyrë efektive.

Lista e lidhjeve

  • (Gjenerator i grupit të ikonave @font-face bazuar në Unicode)
  • Shape Catcher (mjet i njohjes së karaktereve Unicode)
  • Unicodinator (tabela e karaktereve Unicode)
  • Unify (duke kontrolluar mbështetjen e karaktereve Unicode në shfletues)
  • Unitools (Koleksion i mjeteve për të punuar me Unicode)

Unë vetë nuk më pëlqejnë shumë titujt si "Pokemon në lëngun e vet për dummies/tenxhere/tepsi", por duket se është pikërisht kështu - do të flasim për gjëra themelore, puna me të cilat shpesh çon në shumë probleme dhe shumë kohë të humbur rreth çështjes - "Pse nuk funksionon?" Nëse ende keni frikë dhe/ose nuk e kuptoni Unicode, ju lutemi referojuni cat.

Per cfare?

Pyetja kryesore për një fillestar, i cili ndeshet me një numër mbresëlënës kodimesh dhe, në shikim të parë, mekanizma konfuzë për të punuar me to (për shembull, në Python 2.x). Përgjigja e shkurtër është sepse ndodhi kështu :)

Për ata që nuk e dinë, kodimi është një mënyrë për të paraqitur numrat, shkronjat dhe të gjithë karakteret e tjera në kujtesën e kompjuterit (lexo: në zero-një/numra). Për shembull, një hapësirë ​​përfaqësohet si 0b100000 (në binar), 32 (në dhjetor) ose 0x20 (në sistemi heksadecimal duke llogaritur).

Pra, një herë e një kohë kishte shumë pak memorie dhe të gjithë kompjuterëve u duheshin 7 bit për të përfaqësuar të gjitha karakteret e nevojshme (numrat, alfabetin latin të vogël/të madh, një grup karakteresh dhe të ashtuquajturat karaktere të kontrolluara - të gjithë 127 numrat e mundshëm iu dhanë dikush). Në atë kohë kishte vetëm një kodim - ASCII. Koha kaloi, të gjithë ishin të lumtur, dhe ata që nuk ishin të lumtur (lexuan - të cilëve u mungonte shenja " " ose shkronja amtare "ш") - përdorën 128 karakteret e mbetura sipas gjykimit të tyre, domethënë krijuan kodime të reja. Kështu u shfaqën ISO-8859-1 dhe cp1251 dhe KOI8 ynë (domethënë cirilik). Së bashku me ta, u shfaq problemi i interpretimit të bajteve si 0b1******** (d.m.th., karaktere / numra nga 128 në 255) - për shembull, 0b11011111 në kodimin cp1251 është "I" jonë amtare. në kodimin ISO 8859-1 është gjermanishtja greke Eszett (kërkohet) "ß". Siç pritej, komunikimi në rrjet dhe ndarja e thjeshtë e skedarëve ndërmjet kompjuterë të ndryshëm u kthye në "zot-di-çfarë", pavarësisht nga fakti se titujt si "Content-Encoding" në Protokolli HTTP, letrat e emailit dhe faqet HTML e shpëtuan pak situatën.

Në atë moment u mblodhën mendje të ndritura dhe propozuan standard i ri- Unicode. Ky është një standard, jo një kodim - vetë Unicode nuk përcakton se si karakteret do të ruhen në një hard disk ose do të transmetohen përmes një rrjeti. Ai përcakton vetëm marrëdhënien midis një karakteri dhe një numri të caktuar, dhe formati sipas të cilit këta numra do të shndërrohen në bajt përcaktohet nga kodimet Unicode (për shembull, UTF-8 ose UTF-16). Aktiv ky moment standardi Unicode ka pak më shumë se 100 mijë karaktere, ndërsa UTF-16 mund të mbështesë më shumë se një milion (UTF-8 - edhe më shumë).

Unë rekomandoj të lexoni librin e shkëlqyeshëm të Joel Spolsky Minimumi absolut që çdo zhvillues softuerësh absolutisht, pozitivisht duhet të dijë për Unicode dhe grupe karakteresh për një diskutim më të plotë dhe argëtues mbi këtë temë.

Shkoni te pika!

Natyrisht, ka mbështetje për Unicode edhe në Python. Por, për fat të keq, vetëm në Python 3 të gjitha vargjet u bënë Unicode dhe fillestarët duhet të vriten nga gabime si:

>>> me open("1.txt") si fh: s = fh.read() >>> print s koschey >>> parser_result = u"Baba Yaga" # detyrë për qartësi, le të imagjinojmë se ky është rezultati puna e disa analizuesve >>> ", rreshti 1, in analizues_rezultati + s UnicodeDecode Gabim: kodiku "ascii" nuk mund të dekodojë bajtin 0xea në pozicionin 0: rendorja nuk është në interval (128)
ose si kjo:
>>> str(rezultati_parser) Gjurmimi (telefonata më e fundit e fundit): Skedari " ", rreshti 1, in str(rezultati_parser) UnicodeEncode Gabim: kodiku "ascii" nuk mund të kodojë karaktere në pozicionin 0-3: rendorja nuk është në intervalin (128)
Le ta kuptojmë, por me radhë.

Pse dikush do të përdorte Unicode?
Pse analizuesi im i preferuar html kthen Unicode? Lëreni të kthejë një varg të rregullt, dhe unë do të merrem me të atje! E drejtë? Jo ne te vertete. Edhe pse secili prej karaktereve ekzistues në Unicode mund (ndoshta) të përfaqësohet në disa kodime me një bajt (ISO-8859-1, cp1251 dhe të tjerët quhen me një bajt, pasi kodojnë çdo karakter në saktësisht një bajt), por çfarë të bëj nëse duhet të ketë karaktere në varg nga kodime të ndryshme? Caktoni një kodim të veçantë për secilin karakter? Jo, sigurisht, ju duhet të përdorni Unicode.
Pse na duhet lloj i ri"unicode"?
Tani kalojmë në pjesën më interesante. Çfarë është një varg në Python 2.x? Është e thjeshtë byte. Vetëm të dhëna binare që mund të jenë çdo gjë. Në fakt, kur shkruajmë diçka si: >>> x = "abcd" >>> x "abcd", interpretuesi nuk krijon një variabël që përmban katër shkronjat e para të alfabetit latin, por vetëm sekuencën ("a" , "b ", "c", "d") nga katër bajt dhe shkronja latine përdoren këtu ekskluzivisht për të përcaktuar këtë vlerë të veçantë të bajtit. Kjo do të thotë, "a" këtu është thjesht një sinonim për të shkruar "\x61", dhe jo pak më shumë. Për shembull:

>>> "\x61" "a" >>> struct.unpack(">4b", x) # "x" është vetëm katër karaktere të nënshkruara/të panënshkruara (97, 98, 99, 100) >>> struct.unpack (">2h", x) # ose dy pantallona të shkurtra (24930, 25444) >>> struct.unpack(">l", x) # ose një të gjatë (1633837924,) >>> struct.unpack (">f" , x) # ose float (2.6100787562286154e+20,) >>> struct.unpack(">d", x * 2) # ose gjysma e dyfishit (1.2926117739473244e+161,)
Kjo eshte e gjitha!

Dhe përgjigja e pyetjes - pse na duhet "unicode" është tashmë më e dukshme - na duhet një lloj që do të përfaqësohet nga karaktere, jo nga bajt.

Mirë, e kuptoj se çfarë është një varg. Atëherë çfarë është Unicode në Python?
"Lloji i unicode" është kryesisht një abstraksion që zbaton idenë e Unicode (një grup karakteresh dhe numrat e tyre të lidhur). Një objekt i tipit "unicode" nuk është më një sekuencë bytesh, por një sekuencë karakteresh vetë, pa asnjë ide se si të ruhen në mënyrë efektive këto karaktere në kujtesën e kompjuterit. Nëse dëshironi, ky është një nivel më i lartë abstraksioni sesa vargjet e bajtit (kjo është ajo që Python 3 i quan vargjet e zakonshme që përdoren në Python 2.6).
Si të përdorni Unicode?
Një varg Unicode në Python 2.6 mund të krijohet në tre (të paktën, natyrshëm) mënyra:
  • u"" literal: >>> u"abc" u"abc"
  • metoda "deshifrimi" për një varg bajt: >>> "abc".decode("ascii") u"abc"
  • Funksioni "unicode": >>> unicode("abc", "ascii") u"abc"
ascii në dy shembujt e fundit është specifikuar si kodimi që do të përdoret për të kthyer bajt në karaktere. Fazat e këtij transformimi duken diçka si kjo:

"\x61" -> kodimi ascii-> latinishtja e vogël "a" -> u"\u0061" (pika unike për këtë shkronjë) ose "\xe0" -> kodimi c1251 -> cirilik i vogël "a" -> u"\u0430"

Si të merrni një të rregullt nga një varg Unicode? Kodoni atë:

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

Algoritmi i kodimit është natyrisht i kundërt i atij të dhënë më sipër.

Le të kujtojmë dhe të mos ngatërrojmë - Unicode == karaktere, varg == bytes dhe bytes -> diçka kuptimplote (karaktere) është duke de-koduar (dekoduar), dhe karakteret -> byte janë duke koduar (shifruar).

I pa koduar :(
Le të shohim shembuj nga fillimi i artikullit. Si funksionon lidhja e vargut dhe unicode? Varg i thjeshtë duhet të konvertohet në një varg Unicode, dhe meqenëse interpretuesi nuk e njeh kodimin, ai përdor kodimin e paracaktuar - ascii. Nëse ky kodim nuk arrin të dekodojë vargun, do të marrim një gabim të shëmtuar. Në këtë rast, ne duhet ta konvertojmë vetë vargun në një varg Unicode, duke përdorur kodimin e saktë:

>>> lloji i printimit (rezultati_parser), rezultati_parser Baba Yaga >>> s = "koschey" >>> analizues_rezultati + s Traceback (telefonata më e fundit e fundit): Skedari " ", rreshti 1, in analizues_rezultati + s UnicodeDecodeGabim: kodiku "ascii" nuk mund të dekodojë bajtin 0xea në pozicionin 0: rendor jo në intervalin (128) >>> rezultati_parser + s.dekodi("cp1251") u"\xe1\xe0\xe1\xe0- \xff\xe3\xe0\u043a\u043e\u0449\u0435\u0439" >>> printim analizues_rezultati + s.decode("cp1251") Baba-Yagakoschey >>> printo "&".join((rezultati_parser, s.decode ("cp1251"))) Baba Yaga & Koschey # Është më mirë kështu :)

"UnicodeDecodeError" është zakonisht një tregues që vargu duhet të deshifrohet në Unicode duke përdorur kodimin e duhur.

Tani duke përdorur vargjet "str" ​​dhe Unicode. Mos përdorni vargjet "str" ​​dhe Unicode :) Në "str" ​​nuk ka asnjë mënyrë për të specifikuar kodimin, kështu që kodimi i paracaktuar do të përdoret gjithmonë dhe çdo karakter > 128 do të rezultojë në një gabim. Përdorni metodën "encode":

>>> Llojet e printimit, s koschey >>> str(s) Traceback (thirrja më e fundit e fundit): Skedar " ", rreshti 1, in str(s) UnicodeEncode Gabim: kodiku "ascii" nuk mund të kodojë karaktere në pozicionin 0-4: rendorja nuk është në intervalin (128) >>> s = s.encode("cp1251") >>> lloji(t) printimi, s Koschey

"UnicodeEncodeError" është një shenjë që na duhet të specifikojmë kodimin e saktë kur konvertojmë një varg Unicode në një të rregullt (ose përdorim parametrin e dytë "ignore"\"replace"\"xmlcharrefreplace" në metodën "encode").

Unë dua më shumë!
Mirë, le të përdorim përsëri Baba Yaga nga shembulli i mësipërm:

>>> parser_rezultat = u"Baba Yaga" #1 >>> analizues_rezultati u"\xe1\xe0\xe1\xe0-\xff\xe3\xe0" #2 >>> printim analizues_rezultati áàáà-ÿãà #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
Shembulli nuk është krejtësisht i thjeshtë, por ka gjithçka (ose pothuajse gjithçka). Cfare po ndodh ketu:

  1. Çfarë kemi në hyrje? Bajtet që IDLE i kalon përkthyesit. Çfarë ju duhet në fund? Unicode, domethënë karaktere. Gjithçka që mbetet është t'i ktheni bajtet në karaktere - por keni nevojë për kodim, apo jo? Çfarë kodimi do të përdoret? Le të shohim më tej.
  2. Këtu pikë e rëndësishme: >>> "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" E vërtetë Siç mund ta shihni, Python nuk shqetësohet me zgjedhjen e një kodimi - bajtet thjesht konvertohen në pika Unicode:
    >>> ord("a") 224 >>> ord(u"a") 224
  3. Problemi i vetëm është se karakteri i 224-të në cp1251 (kodimi i përdorur nga interpretuesi) nuk është aspak i njëjtë me 224 në Unicode. Është për shkak të kësaj që ne kemi gabime kur përpiqemi të printojmë vargun tonë Unicode.
  4. Si mund ta ndihmoj gjyshen time? Rezulton se 256 karakteret e para të Unicode janë të njëjta si në kodimin ISO-8859-1\latin1, përkatësisht, nëse e përdorim për të koduar një varg Unicode, do të marrim bajtet që kemi futur vetë (për të interesuarit - Objects/unicodeobject.c, duke kërkuar përkufizimin e funksionit "unicode_encode_ucs1"):
    >>> parser_result.encode("latin1") "\xe1\xe0\xe1\xe0-\xff\xe3\xe0"
  5. Si të merrni një grua në Unicode? Ju duhet të specifikoni se cilin kodim të përdorni:
    >>> parser_result.encode("latin1").decode("cp1251") u"\u0431\u0430\u0431\u0430-\u044f\u0433\u0430"
  6. Metoda nga pika #5 sigurisht që nuk është aq e nxehtë, është shumë më e përshtatshme të përdorni unicode të integruar.
Në fakt nuk është edhe aq keq me fjalët "u"", pasi problemi shfaqet vetëm në tastierë. Në të vërtetë, në rastin e përdorimit të karaktereve jo-ascii në skedari burimor Python do të insistojë në përdorimin e një titulli si "# -*- kodimi: -*-" (PEP 0263), dhe vargjet e Unicode do të përdorin kodimin e duhur.

Ekziston gjithashtu një mënyrë për të përdorur "u""" për të përfaqësuar, për shembull, alfabetin cirilik, pa specifikuar pikat e kodimit ose të palexueshme të Unicode (d.m.th. "u"\u1234""). Metoda nuk është plotësisht e përshtatshme, por interesante - të përdorni kodet e entitetit unicode:

>>> s = u"\N(SHKRONJA E VOGËL CIRILIK KA)\N(SHKRONJA E VOGËL CIRILIKE O)\N(SHKRONJA E VOGËL CIRILIKE SHCHA)\N(SHKRONJA E VOGËL CIRILIKE IE)\N(SHKRONJA E VOGËL CIRILIKE E SHKURTËR I)" > >> print s koschey

Epo, kjo është e gjitha. Këshillat bazë janë të mos ngatërroni "encode"\"decode" dhe të kuptoni ndryshimet midis bajteve dhe karaktereve.

Python 3
Këtu nuk ka kod, sepse nuk ka përvojë. Dëshmitarët pohojnë se gjithçka është shumë më e thjeshtë dhe më argëtuese atje. Kushdo që merr macet për të demonstruar ndryshimet midis këtu (Python 2.x) dhe atje (Python 3.x) - respekt dhe respekt.

Të shëndetshëm

Meqenëse po flasim për kodime, unë do të rekomandoj një burim që herë pas here ndihmon për të kapërcyer hajdutët - http://2cyr.com/decode/?lang=ru.

Etiketa:

  • piton
  • unicode
  • kodimi
Shto etiketa

Artikujt më të mirë mbi këtë temë