Računalniki Windows internet

Kodiranje znakov - PIE.Wiki. Kodiranje besedilnih informacij

Unicode je sistem za kodiranje znakov, ki ga uporabljajo računalniki za shranjevanje in izmenjavo besedilnih podatkov. Unicode ima edinstveno številko (ali kodno točko) za vsak znak v glavnih svetovnih sistemih pisanja. Ta sistem vključuje tudi tehnične simbole, ločila in številne druge simbole, ki se uporabljajo pri pisanju.

Poleg tega, da je preslikava znakov, Unicode vključuje tudi algoritme za ujemanje in kodiranje dvostranskih skript, kot je arabščina, ter specifikacije za normalizacijo besedilnih oblik.

V tem razdelku je splošen opis Unicode. Za več popolne informacije in za seznam podprtih jezikov, katerih znake je mogoče kodirati z Unicode, glejte spletno stran konzorcija Unicode.

Kodne točke

Simboli so enote informacij, ki približno ustrezajo enoti besedila v naravnem jeziku. Unicode opredeljuje, kako se znaki razlagajo in ne prikazujejo.

Slika znaka (glif), ki je prikazana, ali vizualna predstavitev znaka, je znak, ki se pojavi na zaslonu monitorja ali natisnjeni strani. V nekaterih sistemih pisanja lahko en znak ustreza več glifom ali pa več znakov lahko ustreza enemu glifu. Na primer, "ll" v španščini je en glif, vendar dva znaka: "l" in "l".

V Unicode se znaki pretvorijo v kodne točke. Kodne točke so številke, ki jih konzorcij Unicode dodeli vsakemu znaku v vsakem sistemu zapisov. Kodne točke so predstavljene kot "U +" in štiri številke in/ali črke. Sledijo primeri kodnih točk za štiri različne znake: male črke l, male črke u z umlautom, beta in male črke e z akutnim znakom.

Unicode vsebuje 1.114.112 kodnih točk; do danes imajo dodeljenih več kot 96.000 znakov.

Ravni (ravnine)

Kodni prostor Unicode za znake je razdeljen na 17 ravnin, od katerih vsaka vsebuje 65.536 kodnih točk.

Prva raven (ravnina) -ravnina 0- je osnovna večjezična ravnina (BMP). Večina najpogosteje uporabljenih znakov je kodiranih z uporabo BMP, in to je sloj, na katerem je danes kodiranih največ znakov. BMP vsebuje kodne točke za skoraj vse znake v sodobnih jezikih in mnoge posebne znake... V BMP je približno 6300 neuporabljenih kodnih točk, ki bodo uporabljene za dodajanje več znakov v prihodnosti.

Naslednja raven (ravnina) -ravnina 1- je dodatna večjezična ravnina (SMP). SMP se uporablja za kodiranje starodavnih znakov, pa tudi glasbenih in matematični simboli.

Kodiranje znakov

Kodiranje znakov definira vsak znak, njegovo kodno točko in kako je kodna točka predstavljena v bitih. Če ne veste, katero kodiranje je bilo uporabljeno, ne boste mogli pravilno razlagati niza znakov.

Obstaja zelo veliko kodirnih shem, vendar je zelo težko pretvoriti njihove podatke med njimi in le malo jih lahko upošteva prisotnost znakov v več kot dveh ali treh različnih jezikih. Na primer, če je vaš računalnik privzeto nastavljen na uporabo OEM-Latin II in brskate po spletnem mestu, ki uporablja IBM EBCDIC-Cyrillic, potem vsi znaki, ki bodo predstavljeni v cirilici in ne bodo kodirani v shemi Latin II, ne bodo Te znake bodo nadomestili drugi znaki, kot so vprašaji in kvadratki.

Ker Unicode vsebuje kodne točke za večino znakov sodobnih jezikih, potem bo uporaba kodiranja znakov Unicode omogočila vašemu računalniku interpretacijo skoraj vseh znanih znakov.

Obstajajo tri glavne sheme Unicode za kodiranje znakov: UTF-8, UTF-16 in UTF-32. UTF je kratica za Unicode Transformation Format. Številke, ki sledijo UTF, označujejo velikost enot (v bajtih), uporabljenih za kodiranje.

  • UTF-8 uporablja 8-bitno kodno enoto spremenljive širine. UTF-8 uporablja 1 do 6 bajtov za kodiranje znaka; za kodiranje istega znaka lahko uporabi manj, enakih ali več bajtov kot UTF-16. V sistemu Windows-1251 je vsaka koda od 0 do 127 (U + 0000 do U + 0127) shranjena v enem bajtu. Samo kodne točke 128 (U + 0128) in višje so shranjene z uporabo 2 do 6 bajtov.
  • UTF-16 uporablja eno 16-bitno kodno enoto s fiksno širino. Je relativno kompakten in vse najpogosteje uporabljene znake je mogoče kodirati z eno samo 16-bitno kodno enoto. Do drugih znakov je mogoče dostopati z uporabo parov 16-bitnih kodnih enot.
  • UTF-32 za kodiranje katerega koli znaka so potrebni 4 bajti. V večini primerov bo dokument, kodiran UTF-32, približno dvakrat večji od dokumenta, kodiranega UTF-16. Vsak znak je kodiran v eni 32-bitni kodirni enoti s fiksno širino. UTF-32 lahko uporabite, če niste omejeni na disku in želite za vsak znak uporabiti eno kodno enoto.

Vse tri oblike kodiranja lahko kodirajo iste znake in jih je mogoče prevesti iz enega v drugega brez izgube podatkov.

Obstajajo tudi druga kodiranja: na primer UTF-7 in UTF-EBCDIC. Obstaja tudi GB18030, ki je kitajski ekvivalent UTF-8 in podpira poenostavljene in tradicionalne kitajske znake. Za ruski jezik je priročno uporabljati windows-1251.

Avtorske pravice © 1995-2014 Esri. Vse pravice pridržane.

Unicode je zelo velik in zapleten svet, saj vam standard omogoča, da predstavljate in delate v računalniku z vsemi glavnimi skriptami sveta. Nekateri pisni sistemi obstajajo že več kot tisoč let in mnogi od njih so se razvili skoraj neodvisno drug od drugega v različnih delih sveta. Ljudje so si izmislili toliko stvari in pogosto so si med seboj tako različne, da je bilo vse to združiti v en sam standard izjemno težka in ambiciozna naloga.

Če želite resnično razumeti Unicode, si morate vsaj površno predstavljati značilnosti vseh skript, s katerimi vam standard omogoča delo. Toda ali je to res potrebno za vsakega razvijalca? Rekli bomo ne. Za uporabo Unicode pri večini vsakodnevnih opravil je dovolj, da poznate razumno najmanj informacij, nato pa se po potrebi poglobite v standard.

V tem članku bomo govorili o osnovnih načelih Unicode in izpostavili tista pomembna praktična vprašanja, s katerimi se bodo razvijalci zagotovo soočili pri svojem vsakodnevnem delu.

Zakaj ste potrebovali Unicode?

Pred pojavom Unicode so se skoraj univerzalno uporabljala enobajtna kodiranja, pri katerih je bila meja med samimi znaki, njihova predstavitev v računalniškem pomnilniku in prikaz na zaslonu precej poljubna. Če ste delali z enim ali drugim nacionalnim jezikom, so bila v vašem sistemu nameščena ustrezna kodiranja pisav, ki so omogočala črpanje bajtov z diska na zaslonu tako, da so uporabniku smiselni.

Če ste na tiskalnik natisnili besedilno datoteko in na papirni strani videli niz nerazumljivih krakozjabr, je to pomenilo, da ustrezne pisave niso bile naložene v tiskalno napravo in ni interpretirala bajtov na način, kot bi želeli.

Ta pristop na splošno in zlasti enobajtno kodiranje je imel številne pomembne pomanjkljivosti:

  1. Istočasno je bilo mogoče delati le z 256 znaki, prvih 128 pa je bilo rezerviranih za latinico in kontrolne znake, v drugi polovici pa je bilo treba poleg znakov nacionalne abecede najti prostor za psevdografično znaki (╔ ╗).
  2. Pisave so bile vezane na določeno kodiranje.
  3. Vsako kodiranje je predstavljalo svoj nabor znakov in pretvorba iz enega v drugega je bila mogoča le z delnimi izgubami, ko so manjkajoče znake nadomestili z grafično podobnimi.
  4. Prenos datotek med napravami z različnimi operacijskimi sistemi je bil težaven. Treba je bilo imeti program za pretvorbo ali pa poleg datoteke nositi dodatne pisave. Obstoj interneta, kot ga poznamo, je bil nemogoč.
  5. Na svetu obstajajo neabecedni sistemi pisanja (hieroglifska pisava), ki jih v enobajtnem kodiranju načeloma ni mogoče predstaviti.

Osnovna načela Unicode

Vsi dobro razumemo, da računalnik ne pozna nobenih idealnih entitet, ampak deluje z biti in bajti. Toda računalniške sisteme še vedno ustvarjajo ljudje, ne stroji, in včasih je za vas in jaz bolj priročno, da operiramo s špekulativnimi koncepti, nato pa preidemo od abstraktnega k konkretnemu.

Pomembno! Eno od osrednjih načel filozofije Unicode je jasno razlikovanje med znaki, njihovo predstavitvijo v računalniku in njihovim prikazom na izhodni napravi.

Uveden je koncept abstraktnega znaka unicode, ki obstaja izključno v obliki špekulativnega koncepta in dogovora med ljudmi, zapisanega v standardu. Vsak znak Unicode je povezan z nenegativnim celim številom, ki se imenuje njegova kodna točka.

Tako je na primer znak unicode U + 041F velika cirilična črka P. Obstaja več načinov za predstavitev tega znaka v računalniškem pomnilniku, tako kot obstaja več tisoč načinov za prikaz na zaslonu monitorja. Toda hkrati P bo v Afriki tudi P ali U + 041F.

To je znana inkapsulacija ali ločitev vmesnika od implementacije, koncept, ki je dobro deloval v programiranju.

Izkazalo se je, da je ob upoštevanju standarda vsako besedilo mogoče kodirati kot zaporedje znakov Unicode

Pozdravljeni U + 041F U + 0440 U + 0438 U + 0432 U + 0435 U + 0442
zapišite ga na kos papirja, zapakirajte v kuverto in pošljite na kateri koli del sveta. Če vedo za obstoj Unicode, potem bodo besedilo zaznali popolnoma enako kot vi in ​​jaz. Ne bodo imeli niti najmanjšega dvoma, da je predzadnji znak ravno mala cirilica e(U + 0435) ne reči latinica mala e(U + 0065). Upoštevajte, da o predstavitvi bajtov nismo rekli niti besede.

Čeprav se znaki unicode imenujejo simboli, ne ustrezajo vedno znaku v tradicionalnem naivnem pomenu, kot so črka, številka, ločilo ali hieroglif. (Za več podrobnosti glejte pod spojlerjem.)

Primeri različnih znakov Unicode

Obstajajo čisto tehnični znaki Unicode, na primer:

  • U + 0000: ničelni znak;
  • U + D800 – U + DFFF: manjši in glavni nadomestki za tehnično predstavitev kodnih točk v območju od 10000 do 10FFFF (beri: zunaj BMP / BMP) v družini kodiranja UTF-16;
  • itd.
Obstajajo ločila, kot je U + 200F: oznaka za spreminjanje smeri pisanja od desne proti levi.

Obstaja cela kohorta prostorov različnih širin in namenov (glej odličen članek o habru :):

  • U + 0020 (presledek);
  • U + 00A0 (neprekinjeni presledek, v HTML);
  • U + 2002 (polkrožni prostor ali En prostor);
  • U + 2003 (okrogel prostor ali Em prostor);
  • itd.
Obstajajo kombinirani diakritični znaki - vse vrste črt, pik, tild itd., Ki spreminjajo / pojasnjujejo pomen prejšnjega znaka in njegovega obrisa. Na primer:
  • U + 0300 in U + 0301: znaki primarnega (akutnega) in sekundarnega (šibkega) stresa;
  • U + 0306: kratko (nadpis), kot v th;
  • U + 0303: nadpisna tilda
  • itd.
Obstajajo celo takšne eksotike, kot so jezikovne oznake (U + E0001, U + E0020 – U + E007E in U + E007F), ki so zdaj v limbu. Zamišljeni so bili kot možnost označevanja določenih delov besedila kot pripadajočih določeni jezikovni različici (recimo ameriški in britanski angleščini), kar bi lahko vplivalo na podrobnosti o tem, kako je besedilo prikazano.

Kaj je simbol, kakšna je razlika med grafemsko gručo (beri: zaznano kot eno samo celo podobo simbola) od unicode simbola in od kodnega kvanta, vam bomo povedali naslednjič.

Unicode kodni prostor

Kodni prostor Unicode je sestavljen iz 1 114 112 kodnih točk, ki segajo od 0 do 10FFFF. Od tega je bilo za deveto različico standarda dodeljenih vrednosti le 128.237. Del prostora je rezerviran za zasebno uporabo in konzorcij Unicode obljublja, da nikoli ne bo dodelil vrednosti položajem s teh posebnih področij.

Zaradi udobja je celoten prostor razdeljen na 17 ravnin (zdaj jih je vključenih šest). Do nedavnega je bilo običajno reči, da se boste najverjetneje morali soočiti le z osnovno večjezično ravnino (BMP), ki vključuje znake Unicode od U + 0000 do U + FFFF. (Če pogledamo malo naprej: znaki BMP so v UTF-16 predstavljeni v dveh bajtih, ne v štirih). V letu 2016 je ta teza že vprašljiva. Tako lahko na primer v uporabniškem sporočilu najdete priljubljene znake Emoji in jih morate znati pravilno obdelati.

Kodiranja

Če želimo pošiljati besedilo preko interneta, moramo zaporedje unicode znakov kodirati kot zaporedje bajtov.

Standard Unicode vključuje številna kodiranja Unicode, kot sta UTF-8 in UTF-16BE / UTF-16LE, ki omogočajo kodiranje celotnega prostora kodnih točk. Pretvorbo med temi kodiranjemi je mogoče prosto izvesti brez izgube informacij.

Prav tako nihče ni preklical enobajtnega kodiranja, vendar vam omogočajo, da kodirate svoj individualni in zelo ozek del spektra Unicode - 256 ali manj kodnih točk. Za taka kodiranja obstajajo tabele in so na voljo vsakomur, kjer je vsaka vrednost posameznega bajta povezana z znakom unicode (glej na primer CP1251.TXT). Kljub omejitvam se enobajtna kodiranja izkažejo za zelo praktična, ko gre za delo z veliko paleto enojezičnih besedilne informacije.

UTF-8 je najbolj razširjeno kodiranje Unicode na internetu (prevzelo je leta 2008), predvsem zaradi svoje ekonomičnosti in pregledne združljivosti s sedembitnim ASCII. Latinski in službeni znaki, osnovna ločila in številke – t.j. vsi sedembitni znaki ASCII so kodirani v UTF-8 v enem bajtu, enako kot v ASCII. Znaki številnih večjih pisem, razen nekaterih redkejših hieroglifov, so v njem predstavljeni z dvema ali tremi bajti. Največja kodna točka, ki jo definira standard, 10FFFF, je kodirana v štirih bajtih.

Upoštevajte, da je UTF-8 kodiranje spremenljive dolžine. Vsak znak Unicode v njem je predstavljen z zaporedjem kodnih kvantov z najmanjšo dolžino enega kvanta. Številka 8 pomeni bitno dolžino kodne enote - 8 bitov. Za družino kodiranja UTF-16 je velikost kvanta kode 16 bitov. Za UTF-32 - 32 bitov.

Če pošiljate stran HTML s cirilično besedilo po omrežju, potem lahko UTF-8 prinese zelo oprijemljivo korist, ker vse oznake ter bloki JavaScript in CSS bodo učinkovito kodirani v enem bajtu. Na primer domača stran Habra v UTF-8 je 139Kb, v UTF-16 pa že 256Kb. Za primerjavo, če uporabljate win-1251 z izgubo zmožnosti shranjevanja nekaterih znakov, se bo velikost v primerjavi z UTF-8 zmanjšala le za 11Kb na 128Kb.

Za shranjevanje podatkov nizov v aplikacijah se pogosto uporabljajo 16-bitna kodiranja Unicode zaradi njihove preprostosti, pa tudi dejstva, da so znaki glavnih svetovnih sistemov pisanja kodirani v enem šestnajstbitnem kvantu. Tako na primer Java uspešno uporablja UTF-16 za interno predstavitev nizov. Operacijski sistem Windows uporablja tudi UTF-16 interno.

V vsakem primeru, dokler ostanemo v prostoru Unicode, v resnici ni pomembno, kako so informacije o nizu shranjene v eni sami aplikaciji. Če vam format notranjega pomnilnika omogoča pravilno kodiranje vseh več kot milijon kodnih točk in ni izgube informacij na meji aplikacije, na primer pri branju iz datoteke ali kopiranju v odložišče, potem je vse v redu.

Za pravilno interpretacijo besedila, prebranega z diska ali iz omrežne vtičnice, morate najprej določiti njegovo kodiranje. To se naredi bodisi z uporabo metainformacij, ki jih posreduje uporabnik, zapisanih v besedilu ali blizu njega, ali pa je določeno hevristično.

V suhem ostanku

Informacij je veliko in smiselno je na kratko povzeti vse, kar je bilo napisano zgoraj:
  • Unicode predpostavlja jasno razlikovanje med znaki, njihovo predstavitvijo v računalniku in njihovim prikazom na izhodni napravi.
  • Znaki Unicode ne ustrezajo vedno znaku v tradicionalnem naivnem pomenu, kot so črka, številka, ločilo ali hieroglif.
  • Kodni prostor Unicode je sestavljen iz 1 114 112 kodnih točk, ki segajo od 0 do 10FFFF.
  • Osnovna večjezična ravnina vključuje znake Unicode od U + 0000 do U + FFFF, ki so kodirani v UTF-16 v dveh bajtih.
  • Vsako kodiranje Unicode vam omogoča kodiranje celotnega prostora kodnih točk Unicode in pretvorba med različnimi takšnimi kodami se izvede brez izgube informacij.
  • Enobajtna kodiranja lahko kodirajo le majhen del spektra unicode, vendar so lahko uporabna pri delu z veliko količino enojezičnih informacij.
  • Kodi UTF-8 in UTF-16 imajo spremenljive dolžine kode. V UTF-8 je lahko vsak znak Unicode kodiran z enim, dvema, tremi ali štirimi bajti. V UTF-16 dva ali štirje bajti.
  • Notranji format shranjevanja besedilnih informacij znotraj ločene aplikacije je lahko poljuben, pod pogojem, da pravilno deluje s celotnim prostorom kodnih točk Unicode in da ni izgube pri čezmejnem prenosu podatkov.

Hitra opomba o kodiranju

Z izrazom kodiranje lahko pride do zmede. Znotraj Unicode se kodiranje pojavi dvakrat. Prvič, ko je nabor znakov kodiran, v smislu, da je vsakemu znaku Unicode dodeljena ustrezna kodna točka. Ta postopek pretvori nabor znakov Unicode v kodiran nabor znakov. Ko se zaporedje znakov Unicode drugič pretvori v bajtni niz, se ta postopek imenuje tudi kodiranje.

V angleški terminologiji obstajata dva različna glagola za kodiranje in za kodiranje, vendar so tudi domači govorci pogosto zmedeni glede njih. Poleg tega se izraz nabor znakov ali nabor znakov uporablja kot sinonim za izraz kodiran nabor znakov.

Vse to povemo dejstvu, da je smiselno biti pozoren na kontekst in razlikovati situacije, ko gre za kodni položaj abstraktnega znaka unicode in ko gre za njegovo bajtno predstavitev.

končno

Unicode je toliko različnih vidikov, da je nemogoče zajeti vse v enem članku. In nepotrebno. Zgornje informacije so dovolj, da se izognemo zmedi v osnovnih načelih in delu z besedilom pri večini vsakdanjih opravil (beri: ne da bi presegli BMP). V naslednjih člankih bomo govorili o normalizaciji, podali popolnejši zgodovinski pregled razvoja kodiranja, govorili o težavah ruske jezikovne terminologije Unicode in pripravili gradivo o praktičnih vidikih uporabe UTF-8 in UTF-16 .

Unicode

Logotip konzorcija Unicode

Unicode(najpogosteje) oz Unicode(angl. Unicode) je standard za kodiranje znakov, ki omogoča, da so znaki predstavljeni v skoraj vseh pisnih jezikih.

Standard je leta 1991 predlagala neprofitna organizacija "Unicode Consortium" (eng. Unicode Consortium, Unicode Inc.).

Uporaba tega standarda omogoča kodiranje zelo velikega števila znakov iz različnih pisem: v dokumentih Unicode lahko soobstajajo kitajski znaki, matematični znaki, črke grške abecede, latinice in cirilice, zato preklapljanje med kodnimi stranmi postane nepotrebno.

Standard je sestavljen iz dveh glavnih delov: univerzalnega nabora znakov (eng. UCS, univerzalni nabor znakov) in družino kodiranja (eng. UTF, Unicode format transformacije).

Univerzalni nabor znakov definira medsebojno korespondenco znakov s kodami - elementi kodnega prostora, ki predstavljajo nenegativna cela števila. Družina kodiranja definira strojno predstavitev zaporedja kod UCS.

Kode Unicode so razdeljene na več področij. Območje s kodami U + 0000 do U + 007F vsebuje znake ASCII z ustreznimi kodami. Sledijo področja znakov različnih pisav, ločil in tehničnih simbolov.

Nekatere kode so rezervirane za prihodnjo uporabo. Pod ciriličnimi znaki so dodeljena področja znakov s kodami od U + 0400 do U + 052F, od U + 2DE0 do U + 2DFF, od U + A640 do U + A69F (glej Cirilica v Unicode).

  • 1 Predpogoji za ustvarjanje in razvoj Unicode
  • 2 različici Unicode
  • 3 Kodni prostor
  • 4 Sistem kodiranja
    • 4.1 Politika konzorcija
    • 4.2 Združevanje in podvajanje simbolov
  • 5 Spreminjanje znakov
  • 6 Normalizacijski algoritmi
    • 6.1 NFD
    • 6.2 NFC
    • 6.3 NFKD
    • 6.4 NFKC
    • 6.5 Primeri
  • 7 Dvosmerno pisanje
  • 8 predstavljenih simbolov
  • 9 ISO / IEC 10646
  • 10 načinov predstavitve
    • 10.1 UTF-8
    • 10.2 Vrstni red bajtov
    • 10.3 Unicode in tradicionalna kodiranja
    • 10.4 Izvedbe
  • 11 Načini vnosa
  • 12 Težave z Unicode
  • 13 "Unicode" ali "Unicode"?

Predpogoji za nastanek in razvoj Unicode

Do poznih osemdesetih let prejšnjega stoletja so 8-bitni znaki postali standard. Hkrati je bilo veliko različnih 8-bitnih kodiranj in nenehno so se pojavljala nova.

To je bilo razloženo tako z nenehnim širjenjem obsega podprtih jezikov kot z željo po ustvarjanju kodiranja, ki je delno združljiva z nekaterimi drugimi (tipičen primer je pojav alternativnega kodiranja za ruski jezik zaradi izkoriščanja zahodnih jezikov). programi, ustvarjeni za kodiranje CP437).

Posledično se je pojavilo več težav:

  1. problem "krakozyabra";
  2. problem omejenega nabora znakov;
  3. problem pretvorbe enega kodiranja v drugo;
  4. problem podvojenih pisav.

Problem "krakozyabr"- problem prikaza dokumentov v napačnem kodiranju. Problem bi lahko rešili bodisi z doslednim uvajanjem metod za določanje uporabljenega kodiranja bodisi z uvedbo enotnega (skupnega) kodiranja za vse.

Težava z omejenim naborom znakov... Težavo bi lahko rešili bodisi s preklopom pisav v dokumentu bodisi z uvedbo "širokega" kodiranja. Preklapljanje pisav se v urejevalnikih besedil že dolgo izvaja, pogosto pa so bile uporabljene pisave z nestandardnim kodiranjem, t.i. "Dingbat pisave". Kot rezultat, so se pri poskusu prenosa dokumenta v drug sistem vsi nestandardni znaki spremenili v "krakozyabry".

Problem pretvorbe enega kodiranja v drugega... Težavo bi lahko rešili bodisi s prevajanjem pretvorbenih tabel za vsak par kodiranj ali z uporabo vmesne pretvorbe v tretje kodiranje, ki vključuje vse znake vseh kodiranj.

Težava s podvojenimi pisavami... Za vsako kodiranje je bila ustvarjena lastna pisava, tudi če so nabori znakov v kodiranju delno ali v celoti sovpadali. Težavo bi lahko rešili z ustvarjanjem "velikih" pisav, iz katerih bi nato izbrali znake, potrebne za dano kodiranje. Vendar je to zahtevalo ustvarjanje enotnega registra simbolov, da bi ugotovili, kaj čemu ustreza.

Prepoznana je bila potreba po enem samem "širokem" kodiranju. Ugotovljeno je bilo, da so kodiranja s spremenljivo dolžino, ki se pogosto uporabljajo v vzhodni Aziji, pretežka za uporabo, zato je bilo odločeno za uporabo znakov s fiksno širino.

Uporaba 32-bitnih znakov se je zdela preveč potratna, zato je bilo odločeno, da uporabimo 16-bitne.

Prva različica Unicode je bila kodiranje s fiksno velikostjo znakov 16 bitov, kar pomeni, da je bilo skupno število kod 2 16 (65 536). Od takrat so bili simboli označeni s štirimi šestnajstiškimi številkami (npr. U + 04F0). Hkrati je bilo načrtovano, da se v Unicode kodirajo ne vsi obstoječi znaki, ampak le tisti, ki so potrebni v vsakdanjem življenju. Redko uporabljene simbole je bilo treba postaviti v "območje zasebne uporabe", ki je prvotno zasedlo kode U + D800 ... U + F8FF.

Da bi Unicode uporabljali tudi kot posrednik pri medsebojnem pretvarjanju različnih kodiranj, so bili vanj vključeni vsi znaki, predstavljeni v vseh najbolj znanih kodiranju.

V prihodnosti pa je bilo odločeno, da se vsi simboli kodirajo in v zvezi s tem znatno razširijo kodno domeno.

Hkrati so se znakovne kode začele obravnavati ne kot 16-bitne vrednosti, temveč kot abstraktne številke, ki jih je mogoče v računalniku predstaviti na različne načine (glej metode predstavitve).

Ker so bili v številnih računalniških sistemih (na primer Windows NT) fiksni 16-bitni znaki že uporabljeni kot privzeto kodiranje, je bilo odločeno, da se vsi najpomembnejši znaki kodirajo le znotraj prvih 65.536 mest (t. i. angleščina. osnovno večjezično letalo, BMP).

Preostali prostor se uporablja za "dodatne znake" (eng. dopolnilni znaki): sistemi pisanja izumrlih jezikov ali zelo redko uporabljenih kitajskih črk, matematičnih in glasbenih simbolov.

Za združljivost s starimi 16-bitnimi sistemi je bil izumljen sistem UTF-16, kjer je prvih 65.536 pozicij, z izjemo pozicij iz intervala U + D800 ... U + DFFF, prikazanih neposredno kot 16-bitna števila, ostali pa so predstavljeni kot "nadomestni pari" (prvi element para iz regije U + D800... U + DBFF, drugi element para iz regije U + DC00... U + DFFF). Za nadomestne pare je bil uporabljen del kodnega prostora (2048 mest), ki je bil namenjen »zasebni rabi«.

Ker lahko UTF-16 prikaže samo 2 20 +2 16 −2048 (1 112 064) znakov, je bila ta številka izbrana kot končna vrednost kodnega prostora Unicode (območje kod: 0x000000-0x10FFFF).

Čeprav je bilo območje kode Unicode razširjeno preko 2-16 že v različici 2.0, so bili prvi znaki v "top" območju postavljeni šele v različici 3.1.

Vloga tega kodiranja v spletnem sektorju nenehno narašča. V začetku leta 2010 je bil delež spletnih mest, ki uporabljajo Unicode, približno 50-odstoten.

Različice Unicode

Delo na dokončnem oblikovanju standarda se nadaljuje. Nove različice so izdane, ko se tabele simbolov spreminjajo in posodabljajo. Vzporedno se izdajajo novi dokumenti ISO/IEC 10646.

Prvi standard je bil izdan leta 1991, zadnji leta 2016, naslednjega pričakujemo poleti 2017. Različice standardov 1.0-5.0 so bile objavljene kot knjige in imajo ISBN.

Številka različice standarda je sestavljena iz treh števk (na primer "4.0.1"). Tretja številka se spremeni, ko se v standard izvedejo manjše spremembe, ki ne dodajajo novih znakov.

Kodni prostor

Čeprav zapisni obliki UTF-8 in UTF-32 omogočata kodiranje do 2.331 (2.147.483.648) kodnih točk, je bilo odločeno, da se za združljivost z UTF-16 uporabi samo 1.112.064. Vendar je tudi to za trenutek več kot dovolj – v različici 6.0 je uporabljenih nekaj manj kot 110.000 kodnih točk (109.242 grafičnih in 273 drugih simbolov).

Kodni prostor je razdeljen na 17 letala(angl. letala) 2 16 (65 536) znakov vsak. talna ravnina ( ravnina 0) je poklican osnovni (osnovni) in vsebuje simbole najpogostejših skript. Ostala letala so dodatna ( dopolnilno). Prvo letalo ( letalo 1) se uporablja predvsem za zgodovinske pisave, drugi ( letalo 2) - za redko uporabljene kitajske črke (CJK), tretji ( letalo 3) je rezerviran za arhaične kitajske znake. Letala 15 in 16 sta rezervirana za zasebno uporabo.

Za označevanje znakov Unicode uporabite zapis, kot je "U + xxxx"(Za kode 0 ... FFFF) ali" U + xxxxx"(Za kode 10000 ... FFFFF) ali" U + xxxxxx"(Za kode 100000 ... 10FFFF), kjer xxx- šestnajstiške številke. Na primer, znak "i" (U + 044F) ima kodo 044F 16 = 1103 10.

Sistem kodiranja

Univerzalni kodirni sistem (Unicode) je nabor grafičnih simbolov in način njihovega kodiranja za računalniško obdelavo besedilnih podatkov.

Grafični simboli so simboli, ki imajo vidno sliko. Grafični znaki so v nasprotju s kontrolnimi znaki in znaki za oblikovanje.

Grafični simboli vključujejo naslednje skupine:

  • črke, ki jih vsebuje vsaj ena od podprtih abeced;
  • številke;
  • ločila;
  • posebni znaki (matematični, tehnični, ideogrami itd.);
  • ločevalniki.

Unicode je sistem za linearno predstavitev besedila. Znake z dodatnimi nadpisi ali podpisi lahko predstavimo kot zaporedje kod, zgrajenih po določenih pravilih (sestavljeni znak) ali kot en sam znak (monolitna različica, vnaprej sestavljen znak). Vklopljeno ta trenutek(2014), se domneva, da so vse črke velikih skript vključene v Unicode, in če je simbol na voljo v sestavljeni različici, ga ni treba podvajati v monolitni obliki.

Politika konzorcija

Konzorcij ne ustvarja novega, ampak navaja ustaljeni red stvari. Na primer, slike emoji so bile dodane, ker so jih japonski mobilni operaterji obsežno uporabljali.

Če želite to narediti, dodajanje simbola poteka skozi zapleten postopek. In na primer, simbol ruskega rublja ga je v treh mesecih prenesel preprosto zato, ker je dobil uradni status.

Blagovne znamke so kodirane le izjemoma. Torej, v Unicode ni zastave Windows ali jabolka Apple.

Ko se znak enkrat pojavi v kodiranju, se ne bo nikoli premaknil ali izginil. Če morate spremeniti vrstni red znakov, to ne storite s spreminjanjem položajev, temveč z nacionalnim vrstnim redom razvrščanja. Obstajajo tudi druga, bolj subtilna zagotovila stabilnosti - na primer normalizacijske tabele se ne bodo spremenile.

Združevanje in podvajanje simbolov

Isti simbol ima lahko več oblik; v Unicode so ti obrazci v eni kodni točki:

  • če se je zgodilo zgodovinsko. Na primer, arabske črke imajo štiri oblike: ločeno, na začetku, na sredini in na koncu;
  • ali če je en jezik sprejet v eni obliki, v drugi pa - drugi. Bolgarska cirilica se razlikuje od ruske, kitajske črke pa od japonščine.

Po drugi strani pa, če sta v preteklosti obstajali dve različni kodni točki v pisavah, ostajata različni v Unicode. Mala grška sigma ima dve obliki in imata različne položaje. Razširjena latinska črka Å (A s krogom) in znak angstroma Å, grško pismoμ in predpona »mikro« µ sta različna simbola.

Seveda so podobni znaki v nepovezanih skriptah postavljeni v različne kodne točke. Na primer, črka A v latinici, cirilici, grščini in Cherokeeju so različni simboli.

Izjemno redko je, da je isti znak postavljen na dva različna kodna mesta, da se poenostavi obdelava besedila. Matematična poteza in ista poteza za označevanje mehkobe zvokov sta različna simbola, druga se šteje za črko.

Spreminjanje znakov

Predstavitev znaka "Y" (U + 0419) v obliki osnovnega znaka "I" (U + 0418) in modificirajočega znaka "" (U + 0306)

Grafični znaki v Unicode se delijo na razširjene in nerazširjene (brez širine). Nerazširjeni znaki ne zavzamejo prostora v vrstici, ko so prikazani. Sem spadajo zlasti naglasna znamenja in druga diakritična znamenja. Tako razširjeni kot nerazširjeni znaki imajo svoje kode. Razširjeni simboli se sicer imenujejo osnovni (eng. osnovni znaki), in nepodaljšani - modificirajoči (eng. kombiniranje znakov); slednji pa se ne morejo samostojno srečati. Znak "á" je na primer lahko predstavljen kot zaporedje osnovnega znaka "a" (U + 0061) in modifikatorskega znaka "́" (U + 0301) ali kot monoliten znak "á" (U + 00E1).

Posebna vrsta spreminjajočih se znakov so izbirniki sloga obraza (eng. izbirniki variacij). Veljajo samo za tiste simbole, za katere so opredeljene takšne različice. V različici 5.0 so uteži definirane za številne matematične simbole, za simbole tradicionalne mongolske abecede in za simbole mongolske kvadratne pisave.

Algoritmi za normalizacijo

Ker so lahko predstavljeni enaki simboli različne kode, primerjava nizov bajt za bajtom postane nemogoča. Algoritmi za normalizacijo normalizacijske oblike) rešite ta problem s pretvorbo besedila v določeno standardno obliko.

Ulivanje se izvaja z zamenjavo simbolov z enakovrednimi s pomočjo tabel in pravil. "Dekompozicija" je zamenjava (razgradnja) enega znaka na več sestavnih znakov, "sestava", nasprotno, pa je zamenjava (povezava) več sestavnih znakov z enim znakom.

Standard Unicode opredeljuje 4 algoritme za normalizacijo besedila: NFD, NFC, NFKD in NFKC.

NFD

NFD, inž. n ormalizacija f orm D ("D" iz angleščine. d ekompozicija), normalizacijska oblika D je kanonična dekompozicija - algoritem, po katerem se izvaja rekurzivna zamenjava monolitnih simbolov (eng. vnaprej sestavljeni znaki) na več komponent (eng. sestavljeni znaki) v skladu s tabelami razgradnje.

Å
U + 00C5
A
U + 0041
̊
U + 030A
U + 1E69
s
U + 0073
̣
U + 0323
̇
U + 0307
ḍ̇
U + 1E0B U + 0323
d
U + 0064
̣
U + 0323
̇
U + 0307
q̣̇
U + 0071 U + 0307 U + 0323
q
U + 0071
̣
U + 0323
̇
U + 0307

NFC

NFC, inž. n ormalizacija f orm C ("C" iz angleščine. c nasprotovanje), normalizacijska oblika C je algoritem, po katerem se kanonična razgradnja in kanonična kompozicija izvajata zaporedno. Prvič, kanonična dekompozicija (algoritem NFD) reducira besedilo na obliko D. Nato kanonična sestava, inverzna NFD, obdela besedilo od začetka do konca, pri čemer upošteva naslednja pravila:

  • simbol Sšteje začetniče ima modifikacijski razred enak nič glede na tabelo znakov Unicode;
  • v katerem koli zaporedju znakov, ki se začne z znakom S, simbol C blokiran od S, le če med S in C ali obstaja kakšen simbol B ki je bodisi začetni ali ima enak ali večji modifikacijski razred kot C... To pravilo velja samo za nize, ki so šli skozi kanonično razgradnjo;
  • simbol šteje primarni sestavljeno, če ima kanonično razgradnjo v tabeli znakov Unicode (ali kanonično razgradnjo za hangul in ni vključena na seznam izključitev);
  • simbol X lahko najprej kombinirate s simbolom Yče in samo če obstaja primarni kompozit Z, kanonično enakovredno zaporedju<X, Y>;
  • če je naslednji znak C ne blokira zadnji začetni osnovni znak L in ga je mogoče z njim najprej uspešno kombinirati, potem L nadomesti s kompozitnim L-C, a C odstranili.
o
U + 006F
̂
U + 0302
H
U + 0048
U + 2460
1
U + 0031
U + FF76
U + 30AB
U + FB01
U + FB01
f jaz
U + 0066 U + 0069
f jaz
U + 0066 U + 0069
2
U + 0032 U + 2075
2
U + 0032 U + 2075
2
U + 0032 U + 2075
2 5
U + 0032 U + 0035
2 5
U + 0032 U + 0035
ẛ̣
U + 1E9B U + 0323
ſ ̣ ̇
U + 017F U + 0323 U + 0307
̣
U + 1E9B U + 0323
s ̣ ̇
U + 0073 U + 0323 U + 0307
U + 1E69
th
U + 0439
in ̆
U + 0438 U + 0306
th
U + 0439
in ̆
U + 0438 U + 0306
th
U + 0439
e
U + 0451
e ̈
U + 0435 U + 0308
e
U + 0451
e ̈
U + 0435 U + 0308
e
U + 0451
A
U + 0410
A
U + 0410
A
U + 0410
A
U + 0410
A
U + 0410
U + 304C
U + 304B U + 3099
U + 304C
U + 304B U + 3099
U + 304C
U + 2167
U + 2167
U + 2167
V jaz jaz jaz
U + 0056 U + 0049 U + 0049 U + 0049
V jaz jaz jaz
U + 0056 U + 0049 U + 0049 U + 0049
ç
U + 00E7
c ̧
U + 0063 U + 0327
ç
U + 00E7
c ̧
U + 0063 U + 0327
ç
U + 00E7

Dvosmerno pismo

Standard Unicode podpira jezike pisanja s smerjo od leve proti desni (eng. od leve proti desni, LTR), in s pisanjem od desne proti levi (eng. od desne proti levi, RTL) - na primer arabske in hebrejske črke. V obeh primerih so znaki shranjeni v "naravnem" vrstnem redu; njihov prikaz ob upoštevanju želene smeri črke zagotavlja aplikacija.

Poleg tega Unicode podpira kombinirana besedila, ki združujejo fragmente z različnimi smermi črke. Ta funkcija se imenuje dvosmernost(angl. dvosmerno besedilo, BiDi). Nekateri poenostavljeni besedilni procesorji (na primer v mobilni telefon) lahko podpira Unicode, ne pa dvosmerne podpore. Vsi znaki Unicode so razdeljeni v več kategorij: napisani od leve proti desni, napisani od desne proti levi in ​​napisani v kateri koli smeri. Simboli slednje kategorije (predvsem ločila), ko so prikazani, zavzamejo smer okoliškega besedila.

Predstavljeni simboli


Diagram osnovne večjezične ravnine Unicode

Unicode vključuje skoraj vse sodobne skripte, vključno z:

  • arabsko
  • armenski,
  • bengalščina,
  • birmanščina,
  • glagol
  • grški
  • gruzijski,
  • devanagari,
  • judovski,
  • cirilica,
  • kitajski (kitajski znaki se aktivno uporabljajo v japonščini, pa tudi občasno v korejščini),
  • koptski,
  • kmerski,
  • latinščina,
  • tamilščina,
  • korejščina (hangul),
  • Cherokee,
  • etiopski,
  • japonščina (ki poleg zlogovne abecede vključuje tudi kitajske znake)

drugo.

Za akademske namene so dodane številne zgodovinske pisave, med drugim: germanske rune, staroturške rune, starogrška pisava, egipčanski hieroglifi, klinopis, majevska pisava, etruščanska abeceda.

Unicode ponuja široko paleto matematičnih in glasbenih simbolov ter piktogramov.

Unicode načeloma ne vključuje državnih zastav, logotipov podjetij in izdelkov, čeprav jih najdemo v pisavah (na primer logotip Apple v kodiranju MacRoman (0xF0) oz. Windows logotip v pisavi Wingdings (0xFF)). V pisavah Unicode je treba logotipe postaviti samo v območje znakov po meri.

ISO/IEC 10646

Konzorcij Unicode tesno sodeluje z delovna skupina ISO / IEC / JTC1 / SC2 / WG2, ki razvija mednarodni standard 10646 (ISO / IEC 10646). Sinhronizacija je vzpostavljena med standardom Unicode in ISO/IEC 10646, čeprav vsak standard uporablja svojo terminologijo in dokumentacijski sistem.

Sodelovanje konzorcija Unicode z Mednarodno organizacijo za standardizacijo (eng. Mednarodna organizacija za standardizacijo, ISO ) se je začelo leta 1991. Leta 1993 je ISO izdal standard DIS 10646.1. Za sinhronizacijo z njim je konzorcij odobril različico 1.1 standarda Unicode, ki je bila dopolnjena z dodatnimi znaki iz DIS 10646.1. Posledično so vrednosti kodiranih znakov v Unicode 1.1 in DIS 10646.1 popolnoma enake.

Sodelovanje med obema organizacijama se je nadaljevalo tudi v prihodnje. Leta 2000 je bil standard Unicode 3.0 sinhroniziran z ISO / IEC 10646-1: 2000. Prihajajoča tretja različica ISO/IEC 10646 bo sinhronizirana z Unicode 4.0. Morda bodo te specifikacije celo objavljene kot enoten standard.

Podobno kot formata UTF-16 in UTF-32 v standardu Unicode ima standard ISO / IEC 10646 tudi dve glavni obliki kodiranja znakov: UCS-2 (2 bajta na znak, podobno kot UTF-16) in UCS-4 (4 bajti na znak, podobno kot UTF-32). UCS pomeni univerzalni multi-oktet(večbajtni) nabor kodiranih znakov(angl. univerzalni nabor kodiranih znakov z več okteti ). UCS-2 se lahko šteje za podmnožico UTF-16 (UTF-16 brez nadomestnih parov), UCS-4 pa je sinonim za UTF-32.

Razlike med standardi Unicode in ISO/IEC 10646:

  • rahle razlike v terminologiji;
  • ISO / IEC 10646 ne vključuje razdelkov, potrebnih za popolno implementacijo podpore Unicode:
    • ni podatkov o binarnem kodiranju znakov;
    • ni opisa primerjalnih algoritmov (eng. primerjanje) in upodabljanje (eng. upodabljanje) znaki;
    • ni seznama lastnosti simbolov (na primer ni seznama lastnosti, potrebnih za implementacijo podpore za dvosmerno (eng. dvosmerni) črke).

Predstavitvene metode

Unicode ima več oblik predstavitve (eng. Format transformacije Unicode, UTF ): UTF-8, UTF-16 (UTF-16BE, UTF-16LE) in UTF-32 (UTF-32BE, UTF-32LE). Predstavitveni obrazec UTF-7 je bil razvit tudi za prenos po sedembitnih kanalih, vendar zaradi nezdružljivosti z ASCII ni bil razširjen in ni bil vključen v standard. 1. aprila 2005 sta bili predlagani dve humoristični vlogi: UTF-9 in UTF-18 (RFC 4042).

Sistemi, ki temeljijo na Microsoft Windows NT in Windows 2000 ter Windows XP, uporabljajo predvsem obrazec UTF-16LE. Na podoben UNIX operacijski sistemi GNU/Linux, BSD in Mac OS X so sprejeli obliko UTF-8 za datoteke in UTF-32 ali UTF-8 za obdelavo znakov v pomnilnik z naključnim dostopom.

Punycode je druga oblika kodiranja zaporedij znakov Unicode v tako imenovana zaporedja ACE, ki so sestavljena samo iz alfanumeričnih znakov, kot je dovoljeno v imenih domen.

UTF-8

UTF-8 je predstavitev Unicode, ki zagotavlja najboljšo združljivost s starejšimi sistemi, ki so uporabljali 8-bitne znake.

Besedilo, ki vsebuje samo znake, oštevilčene manj kot 128, se pretvori v navadno besedilo ASCII, če je napisano v UTF-8. Nasprotno pa se v besedilu UTF-8 prikaže kateri koli bajt z vrednostjo manjšo od 128 Znak ASCII z isto kodo.

Preostali znaki Unicode so predstavljeni z zaporedji, dolgimi od 2 do 6 bajtov (pravzaprav samo do 4 bajtov, saj v Unicode ni znakov s kodo, večjo od 10FFFF, in ni načrtov, da bi jih uvedli v future), v katerem ima prvi bajt vedno obliko 11xxxxxx in ostalo - 10xxxxxx... V UTF-8 se ne uporabljajo nadomestni pari, 4 bajti so dovolj za pisanje katerega koli znaka Unicode.

UTF-8 sta izumila Ken Thompson in Rob Pike 2. septembra 1992 in implementirana v načrtu 9... Standard UTF-8 je zdaj uradno vključen v RFC 3629 in ISO/IEC 10646 Priloga D.

Znaki UTF-8 so izpeljani iz Unicode, kot sledi:

Unicode UTF-8: 0x00000000 - 0x0000007F: 0xxxxxxx 0x00000080 - 0x000007FF: 110xxxxx 10xxxxxx 0x00000800 - 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx 0x00010000 - 0x001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxx

Teoretično možno, vendar tudi ni vključeno v standard:

0x00200000 - 0x03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 0x04000000 - 0x7FFFFFFF: 11111100xxx 1xxxxx 1xxx 1xxxx 1xxxxxxxxxxxxxxxxxxxxxx

Čeprav UTF-8 omogoča, da isti znak določite na več načinov, je pravilen le najkrajši. Preostale obrazce je treba iz varnostnih razlogov zavrniti.

Vrstni red bajtov

V podatkovnem toku UTF-16 se lahko nizki bajt zapiše bodisi pred visokim (eng. UTF-16 z malim endianom), ali po starejšem (eng. UTF-16 big-endian). Podobno obstajata dve različici štiribajtnega kodiranja - UTF-32LE in UTF-32BE.

Za določitev formata predstavitve Unicode na začetku besedilna datoteka podpis je napisan - znak U + FEFF (neprekinjeni presledek z ničelno širino), imenovan tudi oznaka zaporedja bajtov(angl. oznaka vrstnega reda bajtov (BOM)). To omogoča razlikovanje med UTF-16LE in UTF-16BE, saj znak U + FFFE ne obstaja. Včasih se uporablja tudi za označevanje formata UTF-8, čeprav pojem vrstnega reda bajtov za to obliko ne velja. Datoteke, ki sledijo tej konvenciji, se začnejo s temi zaporedji bajtov:

UTF-8 EF BB BF UTF-16BE FE FF UTF-16LE FF FE UTF-32BE 00 00 FE FF UTF-32LE FF FE 00 00

Na žalost ta metoda ne razlikuje zanesljivo med UTF-16LE in UTF-32LE, saj Unicode dovoljuje znak U + 0000 (čeprav se prava besedila redko začnejo z njim).

Datoteke v kodiranju UTF-16 in UTF-32, ki ne vsebujejo BOM, morajo biti v bajtnem vrstnem redu big-endian (unicode.org).

Unicode in tradicionalna kodiranja

Uvedba Unicode je spremenila pristop k tradicionalnim 8-bitnim kodiranjem. Če je bilo prej kodiranje določeno s pisavo, je zdaj določeno s korespondenčno tabelo med tem kodiranjem in Unicode.

Pravzaprav so 8-bitna kodiranja postala predstavitev podmnožice Unicode. To je precej olajšalo ustvarjanje programov, ki morajo delati z veliko različnimi kodirji: zdaj, če želite dodati podporo za še eno kodiranje, morate dodati še eno iskalno tabelo Unicode.

Poleg tega številni formati podatkov omogočajo vstavljanje poljubnih znakov Unicode, tudi če je dokument napisan v starem 8-bitnem kodiranju. Na primer, lahko uporabite kode ampersand v HTML.

Izvajanje

Večina sodobnih operacijskih sistemov zagotavlja določeno stopnjo podpore Unicode.

V operacijskih sistemih družine Windows NT se za interno predstavitev imen datotek in drugih sistemskih nizov uporablja dvobajtno kodiranje UTF-16LE. Sistemski klici, ki sprejemajo parametre niza, so na voljo v enobajtnih in dvobajtnih različicah. Za več informacij glejte članek Unicode o družini operacijskih sistemov Microsoft Windows.

UNIX-u podobni operacijski sistemi, vključno z GNU / Linux, BSD, OS X, uporabljajo kodiranje UTF-8 za predstavljanje Unicode. Večina programov lahko obravnava UTF-8 kot tradicionalna enobajtna kodiranja, ne glede na to, da je znak predstavljen kot več zaporednih bajtov. Za delo s posameznimi znaki se nizi običajno prekodirajo v UCS-4, tako da ima vsak znak strojno besedo.

Ena prvih uspešnih komercialnih implementacij Unicode je bila sreda Java programiranje... V bistvu je opustil 8-bitno predstavitev znakov v korist 16-bitne. Ta rešitev je povečala porabo pomnilnika, vendar nam je omogočila vrnitev pomembne abstrakcije v programiranje: poljuben posamezen znak (vrsta char). Zlasti programer bi lahko delal z nizom kot s preprostim nizom. Žal uspeh ni bil dokončen, Unicode je prerasel 16-bitno omejitev in do J2SE 5.0 je poljuben znak spet začel zasedati spremenljivo število pomnilniških enot - ena char ali dva (glej nadomestni par).

Večina programskih jezikov zdaj podpira nize Unicode, čeprav se njihova predstavitev lahko razlikuje glede na izvedbo.

Metode vnosa

Ker nobena postavitev tipkovnice ne more dovoliti vnosa vseh znakov Unicode hkrati, je potrebna podpora operacijskih sistemov in aplikacij. alternativne metode vnesite poljubne znake Unicode.

Microsoft Windows

Čeprav pripomoček Character Map (charmap.exe) od začetka v sistemu Windows 2000 podpira znake Unicode in vam omogoča, da jih kopirate v odložišče, je ta podpora omejena samo na osnovno ravnino (znakovne kode U + 0000… U + FFFF). Simboli s kodami iz U + 10000 "Tabela simbolov" se ne prikaže.

Podobna tabela je na primer v Microsoft Word.

Včasih lahko vnesete šestnajstiško kodo, pritisnete Alt + X in koda bo zamenjana z ustreznim znakom, na primer v WordPadu, Microsoft Wordu. V urejevalnikih Alt + X izvede tudi obratno transformacijo.

V mnogih programih MS Windows, da bi dobili Znak Unicode, medtem ko držite tipko Alt, vnesite decimalno vrednost kode znakov številsko tipkovnico... Kombinacije Alt + 0171 ("), Alt + 0187 (") in Alt + 0769 (naglasni znak) bodo na primer uporabne pri tipkanju cirilic. Zanimivi sta tudi kombinaciji Alt + 0133 (…) in Alt + 0151 (-).

Macintosh

Mac OS 8.5 in novejši podpira metodo vnosa, imenovano "Unicode Hex Input". Medtem ko držite tipko Option, morate vnesti štirimestno šestnajstiško kodo zahtevanega znaka. Ta metoda omogoča vnašanje znakov s kodami, večjimi od U + FFFF, z uporabo nadomestnih parov; take pare bo operacijski sistem samodejno zamenjal z enojnimi znaki. Pred uporabo tega načina vnosa ga morate aktivirati v ustreznem razdelku sistemskih nastavitev in nato v meniju tipkovnice izbrati kot trenutni način vnosa.

Od Mac OS X 10.2 obstaja tudi aplikacija Paleta znakov, ki vam omogoča, da izberete znake iz tabele, v kateri lahko izberete znake iz določenega bloka ali znake, ki jih podpira določena pisava.

GNU / Linux

GNOME ima tudi pripomoček Symbol Map (prej gucharmap), ki vam omogoča prikaz simbolov za določen blok ali sistem pisanja in ponuja možnost iskanja po imenu ali opisu simbola. Ko je koda želenega znaka znana, jo lahko vnesete v skladu s standardom ISO 14755: medtem ko držite tipke Ctrl + ⇧ Shift, vnesite šestnajstiško kodo (začenši z neko različico GTK +, morate vnesti kodo s pritiskom "U"). Vnesena šestnajstiška koda je lahko dolga do 32 bitov, kar vam omogoča, da vnesete poljubne znake Unicode brez uporabe nadomestnih parov.

Vse aplikacije X Window, vključno z GNOME in KDE, podpirajo vnos s tipko Compose. Za tipkovnice, ki nimajo namenske tipke Compose, lahko v ta namen dodelite katero koli tipko - na primer ⇪ Caps lock.

Konzola GNU / Linux omogoča tudi vnos znaka Unicode s svojo kodo - za to je treba decimalno kodo znaka vnesti kot števke razširjenega bloka tipkovnice, medtem ko držite tipko Alt. Znake lahko vnesete z njihovo šestnajstiško kodo: za to morate držati tipko AltGr in vnesti števke A-F uporabite tipke na razširjenem bloku tipkovnice od NumLock do ↵ Enter (v smeri urinega kazalca). Podprt je tudi vnos v skladu z ISO 14755. Za delovanje zgornjih metod morate v konzoli omogočiti način Unicode s klicem unicode_start(1) in s klicem izberite ustrezno pisavo setfont(8).

Mozilla Firefox za Linux podpira vnos znakov ISO 14755.

Težave z Unicode

V Unicode sta angleška "a" in poljska "a" enak znak. Na enak način se ruski "a" in srbski "a" štejeta za isti simbol (vendar se razlikuje od latinskega "a"). To načelo kodiranja ni univerzalno; očitno rešitev "za vse priložnosti" sploh ne more obstajati.

  • Kitajska, korejska in japonska besedila so tradicionalno napisana od zgoraj navzdol, začenši v zgornjem desnem kotu. Preklapljanje med vodoravnim in navpičnim črkovanjem za te jezike v Unicode ni predvideno - to je treba storiti z označevalnimi jeziki ali notranjimi mehanizmi urejevalnikov besedil.
  • Unicode omogoča različne teže istega znaka, odvisno od jezika. Torej imajo lahko kitajski znaki različne sloge v kitajščini, japonščini (kanji) in korejščini (hancha), vendar so hkrati v Unicode označeni z istim simbolom (tako imenovana poenotenje CJK), čeprav so še vedno poenostavljeni in polni znaki. imajo različne kode... Prav tako ruski in srbski jezik uporabljata različen poševni slog. NS in T(v srbščini sta videti kot u in w, glej srbski poševni tisk). Zato morate zagotoviti, da je besedilo vedno pravilno označeno kot povezano z enim ali drugim jezikom.
  • Prevod iz malih črk v velike je odvisen tudi od jezika. Na primer: v turščini sta črki İi in Iı - tako so turška pravila o spreminjanju velikih in malih črk v nasprotju z angleškimi, ki zahtevajo, da se "i" prevede v "I". Podobne težave obstajajo v drugih jezikih - na primer v kanadskem francoskem narečju je register preveden nekoliko drugače kot v Franciji.
  • Tudi pri arabskih številkah obstajajo določene tipografske tankosti: številke so lahko "velike" in "male črke", sorazmerne in enoprostorne - za Unicode med njimi ni razlike. Takšni odtenki ostajajo pri programski opremi.

Nekatere pomanjkljivosti niso povezane s samim Unicode, temveč z zmogljivostmi besedilnih procesorjev.

  • Datoteke nelatinskega besedila v Unicode vedno zavzamejo več prostora, saj en znak ni kodiran z enim bajtom, kot v različnih nacionalnih kodirjih, temveč z zaporedjem bajtov (izjema je UTF-8 za jezike, katerih abeceda ustreza v ASCII, pa tudi prisotnost dveh znakov v besedilu in več jezikov, katerih abeceda ne ustreza ASCII). Datoteka pisave, potrebna za prikaz vseh znakov v tabeli Unicode, zavzema razmeroma velik pomnilniški prostor in je računsko bolj intenzivna kot samo pisava v uporabniškem nacionalnem jeziku. S povečanjem moči računalniških sistemov in znižanjem stroškov pomnilnika in diskovnega prostora postaja ta problem vse manj pomemben; vendar ostaja pomemben za prenosne naprave, kot so mobilni telefoni.
  • Čeprav je podpora Unicode implementirana v najpogostejših operacijskih sistemih, se še vedno ne uporabljajo vsi programsko opremo podpira pravilno delo z njim. Zlasti oznake za zaporedje bajtov (BOM) niso vedno obdelane in naglašeni znaki so slabo podprti. Težava je začasna in je posledica primerjalne novosti standardov Unicode (v primerjavi z enobajtnimi nacionalnimi kodami).
  • Zmogljivost vseh programov za obdelavo nizov (vključno z razvrščanjem v bazi podatkov) se zmanjša, če se namesto enobajtnih kodiranj uporabi Unicode.

Nekateri redki sistemi pisanja še vedno niso pravilno predstavljeni v Unicode. Upodobitev "dolgih" nadpisnih znakov, ki segajo na več črk, kot na primer v cerkvenoslovanščini, še ni izvedena.

Unicode ali Unicode?

"Unicode" je lastno ime (ali del imena, na primer Unicode Consortium) in splošno ime, ki izhaja iz angleškega jezika.

Na prvi pogled je bolje uporabiti črkovanje "Unicode". V ruskem jeziku že obstajajo morfemi "uni-" (besede z latinskim elementom "uni-" so bile tradicionalno prevedene in zapisane z "uni-": univerzalno, enopolarno, poenotenje, enotno) in "koda". proti, blagovne znamke, izposojeni iz angleškega jezika, se običajno prenašajo s pomočjo praktične transkripcije, v kateri je deetimologizirana kombinacija črk "uni-" zapisana v obliki "uni-" ("Unilever", "Unix" itd.) , torej na enak način kot v primeru črk za črko okrajšav, kot je UNICEF »Mednarodni sklad Združenih narodov za izredne razmere« - UNICEF.

Črkovanje "Unicode" je že trdno vstopilo v besedila v ruskem jeziku. Wikipedia uporablja pogostejšo različico. V MS Windows se uporablja možnost Unicode.

Na spletni strani konzorcija je posebna stran, kjer so težave s prenosom besede "Unicode" na različnih jezikih in sistemi pisanja. Za rusko cirilično abecedo je določena možnost "Unicode".

Za težave, povezane s kodiranjem, običajno poskrbi programska oprema, zato pri uporabi kodiranja običajno ni težav. Če se pojavijo težave, jih običajno ustvarijo slabi programi - pošljite jih v smeti.

Vabim vse, da spregovorijo

Kaj je kodiranje

V ruščini se "nabor znakov" imenuje tudi tabela "nabor znakov", postopek uporabe te tabele za prevajanje informacij iz računalniške predstavitve v človeško in značilnost besedilne datoteke, ki odraža uporabo določenega sistema. kod v njej pri prikazovanju besedila.

Kako je besedilo kodirano

Nabor simbolov, ki se uporabljajo pri pisanju besedila, se v računalniški terminologiji imenuje abeceda; število simbolov v abecedi običajno imenujemo njegova moč. Za predstavitev besedilnih informacij v računalniku se najpogosteje uporablja abeceda s kapaciteto 256 znakov. Eden od njegovih znakov nosi 8 bitov informacij, zato binarna koda vsakega znaka zavzame 1 bajt računalniškega pomnilnika. Vsi znaki takšne abecede so oštevilčeni od 0 do 255, vsaka številka pa ustreza 8-bitni binarni kodi, ki je redna številka znaka v dvojiškem številskem sistemu – od 00000000 do 11111111. Samo prvih 128 znakov z številke od nič (binarna koda 00000000) do 127 (01111111). Sem spadajo male črke in velike črke Latinska abeceda, številke, ločila, oklepaji itd. Preostalih 128 kod, ki se začnejo s 128 (binarna koda 10000000) in končajo z 255 (11111111), se uporablja za kodiranje črk nacionalnih abeced, službenih in znanstvenih simbolov.

Vrste kodiranja

Najbolj znana kodirna tabela je ASCII (ameriška standardna koda za izmenjavo informacij). Prvotno je bil razvit za prenos besedil po telegrafu, takrat pa je bil 7-bitni, torej je bilo za kodiranje angleških znakov, službenih in kontrolnih znakov uporabljenih le 128 7-bitnih kombinacij. V tem primeru je prvih 32 kombinacij (kod) služilo za kodiranje kontrolnih signalov (začetek besedila, konec vrstice, povratek na nosilec, klic, konec besedila itd.). Pri razvoju prvih IBM-ovih računalnikov je bila ta koda uporabljena za predstavitev simbolov v računalniku. Ker v izvorno kodo ASCII je imel samo 128 znakov, za njihovo kodiranje je bilo dovolj bajtnih vrednosti z 8. bitom enakim 0. Bajtne vrednosti z 8. bitom enakim 1 so se začele uporabljati za predstavljanje psevdografičnih znakov, matematičnih znakov in nekaterih znakov iz jezikov, ki niso angleščina (grščina, nemška preglasa, francoska diakritička itd.). Ko so začeli računalnike prilagajati drugim državam in jezikom, ni bilo več dovolj prostora za nove simbole. Za popolno podporo jezikom, ki niso angleščina, je IBM predstavil več kodnih tabel za posamezne države. Tako je bila za skandinavske države predlagana tabela 865 (nordijska), za arabske države - tabela 864 (arabščina), za Izrael - tabela 862 (Izrael) itd. V teh tabelah so bile nekatere kode iz druge polovice kodne tabele uporabljene za predstavitev znakov nacionalnih abeced (z izključitvijo nekaterih psevdografičnih znakov). Situacija z ruskim jezikom se je razvila na poseben način. Očitno je mogoče zamenjati znake v drugi polovici kodne tabele različne poti... Tako se je za ruski jezik pojavilo več različnih tabel kodiranja cirilice: KOI8-R, IBM-866, CP-1251, ISO-8551-5. Vsi predstavljajo simbole prve polovice tabele na enak način (od 0 do 127) in se razlikujejo po predstavitvi simbolov ruske abecede in psevdografike. Za jezike, kot sta kitajščina ali japonščina, 256 znakov na splošno ni dovolj. Poleg tega vedno obstaja problem izpisovanja ali shranjevanja v eni datoteki hkrati različnih jezikih(na primer pri citiranju). Zato univerzalno kodna tabela UNICODE, ki vsebuje simbole, ki se uporabljajo v jezikih vseh ljudstev sveta, pa tudi različne službene in pomožne simbole (ločila, matematični in tehnični simboli, puščice, diakritični znaki itd.). Očitno en bajt ni dovolj za kodiranje tako velikega števila znakov. Zato UNICODE uporablja 16-bitne (2-bajtne) kode za predstavitev 65.536 znakov. Do danes je bilo uporabljenih okoli 49.000 kod (zadnja pomembna sprememba je bila uvedba simbola valute EURO septembra 1998). Zaradi združljivosti s prejšnjimi kodami je prvih 256 kod enakih kot v standardu ASCII. V standardu UNICODE, razen posebnega binarna koda(te kode so običajno označene s črko U, ki ji sledi znak + in dejanska koda v šestnajstiški predstavitvi) vsakemu znaku je dodeljeno posebno ime. Druga komponenta standarda UNICODE so algoritmi za pretvorbo kod UNICODE ena proti ena v zaporedju bajtov spremenljive dolžine. Potreba po takšnih algoritmih je posledica dejstva, da vse aplikacije ne morejo delati z UNICODE. Nekatere aplikacije razumejo samo 7-bitne kode ASCII, druge aplikacije razumejo 8-bitne kode ASCII. Takšne aplikacije uporabljajo tako imenovane razširjene kode ASCII za predstavitev znakov, ki ne sodijo v nabor 128 ali 256 znakov, kadar so znaki kodirani z nizi bajtov spremenljive dolžine. UTF-7 se uporablja za reverzibilno pretvorbo kod UNICODE v razširjene 7-bitne kode ASCII, UTF-8 pa za reverzibilno pretvorbo kod UNICODE v razširjene 8-bitne kode ASCII. Upoštevajte, da tako ASCII kot UNICODE in drugi standardi za kodiranje znakov ne opredeljujejo podob znakov, temveč le sestavo nabora znakov in način, kako je predstavljen v računalniku. Poleg tega (kar morda ni takoj očitno) je zelo pomemben vrstni red naštevanja znakov v nizu, saj najbolj vpliva na algoritme razvrščanja. To je tabela ujemanja simbolov iz določenega niza (recimo simbolov, ki se uporabljajo za predstavljanje informacij o angleški jezik, ali v različnih jezikih, kot v primeru UNICODE) in označite z izrazom tabela kodiranja znakov ali nabor znakov. Vsako standardno kodiranje ima ime, na primer KOI8-R, ISO_8859-1, ASCII. Na žalost ni standarda za kodiranje imen.

Pogosta kodiranja

ISO 646 o ASCII EBCDIC ISO 8859: o ISO 8859-1 - ISO 8859-11, ISO 8859-13, ISO 8859-14, ISO 8859-15 o CP437, CP737, CP850, CP852, CP85 7, CP850, CP850 CP861, CP863, CP865, CP866, CP869 Microsoftova kodiranja Windows: o Windows-1250 za srednjeevropske jezike, ki uporabljajo latinične črke o Windows-1251 za cirilično abecedo o Windows-1252 za ​​zahodne jezike o Windows-1253 za grščino o Windows-1254 za turščino o Windows-1255 za hebrejščino o Windows-1256 za arabščino o Windows-1257 za baltske jezike o Windows-1258 za vietnamščino MacRoman, MacCyrillic KOI8 (KOI8-R, KOI8-U ...), KOI-7 bolgarsko kodiranje ISCII VISCII Big5 (najbolj znan različica Microsoft CP950 ) o HKSCS Guobiao o GB2312 o GBK (Microsoft CP936) o GB18030 Shift JIS za japonsko (Microsoft CP932) EUC-KR za korejsko (Microsoft CP949) ISO-2022 in EUC za kitajsko pisanje UTF-16 in UTF-8 kodiranja Znaki Unicode

V kodirnem sistemu ASCII(Ameriška standardna koda za izmenjavo informacij) vsak znak je predstavljen z enim bajtom, ki lahko kodira 256 znakov.

ASCII ima dve kodirni tabeli - osnovno in razširjeno. Osnovna tabela določa vrednosti kod od 0 do 127, razširjena pa se nanaša na znake s številkami od 128 do 255. To je dovolj, da z različnimi kombinacijami osmih bitov izrazimo vse znake angleškega in ruskega jezika. , tako male kot velike črke, kot tudi ločila, simbole za osnovne aritmetične operacije in pogoste posebne simbole, ki jih lahko opazimo na tipkovnici.

Prvih 32 kod osnovne tabele, ki se začnejo z ničlo, dobijo proizvajalci strojne opreme (predvsem proizvajalci računalnikov in tiskalnih naprav). To področje vsebuje tako imenovane kontrolne kode, ki ne ustrezajo nobenim jezikovnim znakom, zato te kode niso prikazane niti na zaslonu niti na tiskalnih napravah, lahko pa jih nadzorujemo, kako se izpisujejo drugi podatki. Od kode 32 do kode 127 so postavljeni simboli angleške abecede, ločila, številke, računske operacije in pomožni simboli, vse je vidno na latinskem delu računalniške tipkovnice.

Drugi, razširjeni del je namenjen nacionalnim kodnim sistemom. Na svetu obstaja veliko nelatiničnih abeced (arabska, hebrejska, grška itd.), vključno s cirilico. Tudi nemške, francoske, španske razporeditve tipkovnic se razlikujejo od angleških.

Angleški del tipkovnice je imel včasih veliko standardov, zdaj pa jih je vse nadomestila ena sama koda ASCII. Za rusko tipkovnico je bilo tudi veliko standardov: GOST, GOST-alternative, ISO (Mednarodna standardna organizacija - Mednarodni inštitut za standardizacijo), vendar so ti trije standardi dejansko zamrli, čeprav se lahko srečajo nekje, v nekaterih predpotopnih računalnikih ali v računalniških omrežij.

Glavno kodiranje znakov ruskega jezika, ki se uporablja v računalnikih z operacijskim sistemom sistem Windows poklical Windows-1251, je za cirilico razvil Microsoft. Seveda je absolutna večina računalniških besedilnih podatkov kodiranih v sistemu Windows-1251. Mimogrede, kodiranja z drugačno štirimestno številko je razvil Microsoft za druge običajne abecede: arabsko, japonsko in druge.

Drugo običajno kodiranje se imenuje KOI-8(koda za izmenjavo informacij, osemmestna) - njen nastanek sega v čase Sveta za medsebojno gospodarsko pomoč vzhodnoevropskih držav. Danes je kodiranje KOI-8 razširjeno v računalniških omrežjih na ozemlju Rusije in v ruskem sektorju interneta. Zgodi se, da neko besedilo pisma ali kaj drugega ni berljivo, kar pomeni, da morate preklopiti s KOI-8 na Windows-1251. deset

V 90. letih so največji proizvajalci programske opreme: Microsoft, Borland, isti Adobe odločili, da je treba razviti drugačen sistem kodiranja besedila, v katerem bo vsakemu znaku dodeljen ne 1, ampak 2 bajta. Ime je dobila Unicode, in je možno kodirati 65.536 znakov tega polja, kar je dovolj, da se prilega eni tabeli nacionalnih abeced za vse jezike planeta. Večino Unicode (približno 70%) zasedajo kitajski znaki, v Indiji je 11 različnih nacionalnih abeced, obstaja veliko eksotičnih imen, na primer: pisanje kanadskih staroselcev.

Ker je kodiranju vsakega znaka v Unicode dodeljenih ne 8, ampak 16 bitov, se velikost besedilne datoteke podvoji. To je bila nekoč ovira za uvedbo 16-bitnega sistema. in zdaj, pri gigabajtnih trdih diskih, na stotine megabajtov RAM-a, gigahertz procesorji, podvojitev obsega besedilnih datotek, ki v primerjavi, na primer z grafiko, zavzamejo zelo malo prostora, pravzaprav ni pomembna.

Cirilica v Unicode se uvršča od 768 do 923 (osnovni znaki) in od 924 do 1023 (razširjena cirilica, različne manj pogoste nacionalne črke). Če program ni prilagojen za cirilično Unicode, potem je možno, da besedilni znaki niso prepoznani kot cirilica, ampak kot razširjena latinica (kode od 256 do 511). In v tem primeru se namesto besedila na zaslonu prikaže nesmiseln niz različnih eksotičnih simbolov.

To je mogoče, če je program zastarel, ustvarjen pred letom 1995. Ali pa redka, o kateri se nihče ni trudil rusificirati. Možno je tudi, da operacijski sistem Windows, ki je nameščen v računalniku, ni v celoti konfiguriran za cirilično abecedo. V tem primeru morate narediti ustrezne vnose v register.