O le isi uila: matou te teuina manoa Unicode 30-60% sili atu fa'atusatusa nai lo UTF-8

O le isi uila: matou te teuina manoa Unicode 30-60% sili atu fa'atusatusa nai lo UTF-8

Afai o oe o se tagata atiaʻe ma o loʻo e feagai ma le galuega o le filifilia o se encoding, o le Unicode o le a toetoe lava a avea ma tali saʻo. Ole auala fa'atusa fa'apitoa e fa'alagolago i le tala, ae o le tele o taimi o lo'o i ai se tali lautele iinei fo'i - UTF-8. O le mea lelei e uiga i ai o le faʻatagaina oe e faʻaoga uma mataitusi Unicode e aunoa ma le faʻaaluina faʻapea foʻi tele bytes i le tele o tulaga. E moni, mo gagana e faʻaaogaina e sili atu nai lo na o le alafapeta Latina, "e le tele" e sili atu lua paita i le tagata. E mafai ea ona sili atu le lelei e aunoa ma le toe fo'i atu i fa'asologa anamua e fa'atapula'aina ai i tatou i le na'o le 256 mataitusi avanoa?

I lalo ifo ou te fautua atu e faamasani oe lava i laʻu taumafaiga e tali lenei fesili ma faʻatino se algorithm faigofie e mafai ai ona e teuina laina i le tele o gagana o le lalolagi e aunoa ma le faʻaopoopoina o le redundancy o loʻo i le UTF-8.

Fa'ailoga. O le a vave ona ou faia ni nai faʻaagaga taua: o le fofo faʻamatalaina e le o ofoina atu e avea o se sui lautele mo UTF-8, e naʻo le talafeagai i se lisi vaapiapi o mataupu (sili atu i latou i lalo), ma e leai se tulaga e tatau ona faʻaaogaina e fegalegaleai ai ma APIs lona tolu (e le o iloa e uiga i ai). O le tele o taimi, o algorithms compression lautele (mo se faʻataʻitaʻiga, deflate) e talafeagai mo le teuina faʻapipiʻi o voluma tetele o faʻamaumauga o tusitusiga. E le gata i lea, ua i ai i le faagasologa o le fatuina o laʻu fofo, na ou maua ai se tulaga o loʻo i ai i le Unicode lava ia, lea e foia ai le faafitauli lava e tasi - e sili atu ona faigata (ma e masani ona leaga), ae o se tulaga taliaina, ae le naʻo le tuʻuina. faatasi i luga o tulivae. O le a ou ta'u atu foi e uiga ia te ia.

E uiga i le Unicode ma le UTF-8

Muamua, o nai upu e uiga i le mea Unicode и UTF-8.

E pei ona e iloa, 8-bit encodings sa masani ona lauiloa. Faatasi ai ma i latou, sa faigofie mea uma: 256 mataitusi e mafai ona faanumeraina i numera mai le 0 i le 255, ma numera mai le 0 i le 255 e mafai ona faʻatusalia o le tasi le paita. Afai tatou te toe foʻi i tua i le amataga, o le ASCII encoding e faʻatapulaʻaina atoa i le 7 bits, o le mea sili ona taua i lona faʻataʻitaʻiga byte o le zero, ma o le tele o 8-bit encodings e fetaui ma ia (e eseese i le "luga" vaega, lea e pito sili ona taua o le tasi).

E fa'apefea ona 'ese'ese le Unicode mai na fa'ailoga ma pe aisea ua tele ai fa'amatalaga fa'apitoa e feso'ota'i ma ia - UTF-8, UTF-16 (BE ma LE), UTF-32? Sei o tatou faavasega i le faasologa.

O le tulaga masani Unicode e fa'amatala na'o le feso'ota'iga i le va o mata'itusi (ma i nisi tulaga, vaega ta'itasi o mata'itusi) ma a latou numera. Ma e tele naua numera mafai i lenei tulaga - mai 0x00 i 0x10FFFF (1 vaega). Afai matou te mananaʻo e tuʻu se numera i sea ituaiga i se fesuiaiga, e le lava le 114 poʻo le 112 paita mo i matou. Ma talu ai e leʻo faʻatulagaina lelei a matou gaioiga mo le galulue i numera tolu-byte, o le a faʻamalosia i matou e faʻaoga le tele o le 1 bytes i le amio! O le UTF-2 lea, ae o le mea tonu lava o lenei "faʻamaumau" e le o lauiloa ai lenei faatulagaga.

O le mea e lelei ai, o le faasologa o mataitusi i totonu o le Unicode e le o se mea faʻafuaseʻi. Ua vaevaeina a latou seti atoa i le 17 "vaalele", o ia mea taitasi e aofia ai le 65536 (0x10000) «fa'ailoga fa'ailoga" O le manatu o se "code point" iinei e faigofie numera o tagata, tofia i ai e le Unicode. Ae, e pei ona taʻua i luga, i le Unicode e le gata o tagata taʻitoʻatasi e faanumeraina, ae faʻapea foʻi a latou vaega ma faʻailoga tautua (ma o nisi taimi e leai se mea e fetaui ma le numera - atonu mo le taimi nei, ae mo i matou e le taua tele), o lea. e sili atu le sa'o i taimi uma talanoa patino e uiga i le numera o latou lava, ae le o faailoga. Ae ui i lea, i le mea o loʻo mulimuli mai, mo le faʻapuupuuga, o le a masani ona ou faʻaogaina le upu "faailoga", faʻaalia le faaupuga "code point".

O le isi uila: matou te teuina manoa Unicode 30-60% sili atu fa'atusatusa nai lo UTF-8
Vaalele Unicode. E pei ona e vaʻai, o le tele o ia (vaalele 4 i le 13) e leʻo faʻaaogaina.

O le mea e sili ona mataʻina o le "palapala" autu uma o loʻo taoto i le zero plane, e taʻua o "Va'alele Autu Gagana Tele". Afai o se laina o loʻo i ai tusitusiga i se tasi o gagana faʻaonaponei (e aofia ai le Saina), e te le alu i tua atu o lenei vaalele. Ae e le mafai foi ona e tipi ese le isi vaega o le Unicode - mo se faʻataʻitaʻiga, o emoji e tele lava i le pito o le. le isi vaalele,"Va'alele Fa'aopoopo gagana e tele"(e sau mai 0x10000 i 0x1FFFF). O lea ua faia e UTF-16 lenei mea: o tagata uma e pa'u i totonu Va'alele Autu Gagana Tele, o lo'o fa'ailogaina “pei o iai” ma se numera lua-paita tutusa. Ae ui i lea, o nisi o numera i lenei laina e le o faʻaalia ai ni faʻamatalaga patino, ae faʻaalia mai pe a maeʻa lenei pea paita e manaʻomia ona tatou mafaufau i le isi - e ala i le tuʻufaʻatasia o tau o nei paita e fa, tatou te maua se numera e aofia ai. le vaega Unicode aoga atoa. O lenei manatu ua taʻua o “ulugaliʻi sui”—atonu na e faalogo i ai.

O lea e manaʻomia ai e le UTF-16 le lua poʻo (i tulaga e seasea tupu) fa paita i le "code point". E sili atu lenei mea nai lo le faʻaaogaina o paita e fa i taimi uma, ae o le Latina (ma isi mataitusi ASCII) pe a faʻapipiʻiina i lenei auala e faʻaumatia le afa o le avanoa i zeros. UTF-8 ua mamanuina e faasaʻo ai lenei: ASCII i totonu o loʻo i ai, pei o le taimi muamua, naʻo le tasi le paita; code mai 0x80 i 0x7FF - lua paita; mai 0x800 i 0xFFFF - tolu, ma mai 0x10000 i 0x10FFFF - fa. I le tasi itu, ua lelei le alafapeta Latina: ua toe foʻi mai le fesoʻotaʻiga ma le ASCII, ma o le tufatufaina atu e sili atu ona "faʻasalalau" mai le 1 i le 4 bytes. Ae o alafapeta e ese mai i le Latina, talofa, e le aoga i soʻo se auala pe a faʻatusatusa i le UTF-16, ma o le toʻatele o loʻo manaʻomia nei le tolu paita nai lo le lua - o le laina o loʻo ufiufi e se lua-byte faʻamaumauga ua faʻaititia i le 32 taimi, ma 0xFFFF i 0x7FF, ma e le o Saina poʻo, mo se faʻataʻitaʻiga, Georgian e aofia ai i totonu. Cyrillic ma isi alafapeta e lima - hurray - laki, 2 paita i le amio.

Aisea e tupu ai lenei mea? Se'i o tatou va'ai pe fa'apefea ona fa'atusa e UTF-8 fa'ailoga amio:
O le isi uila: matou te teuina manoa Unicode 30-60% sili atu fa'atusatusa nai lo UTF-8
O lo'o fa'aoga sa'o e fa'atusa ai numera, o fa'ailoga ua fa'ailogaina i le fa'ailoga o lo'o fa'aogaina iinei x. E mafai ona iloa i totonu o se faʻamaumauga e lua-byte e naʻo le 11 ia vaega (mai le 16). O pito ta'imua iinei e na'o se galuega fesoasoani. I le tulaga o le fa-byte faʻamaumauga, 21 mai le 32 bits o loʻo tuʻuina atu mo le numera numera - e foliga mai o le tolu paita (lea e maua ai le aofaʻi o 24 bits) o le a lava, ae o faʻailoga tautua e 'ai tele.

E leaga lea mea? Pe lava. I le tasi itu, afai tatou te popole tele e uiga i le avanoa, o loʻo i ai a tatou algorithms compression e faigofie ona faʻaumatia uma le entropy faaopoopo ma le faʻaogaina. I le isi itu, o le sini a Unicode o le tuʻuina atu lea o faʻamatalaga sili ona lautele e mafai. Mo se faʻataʻitaʻiga, e mafai ona matou tuʻuina atu se laina faʻapipiʻi i le UTF-8 e faʻailoga lea na galue muamua i le ASCII, ma aua le fefe neʻi vaʻaia se uiga mai le ASCII laina e le o iai (pe a uma, i le UTF-8 uma. bytes amata mai le zero bit - o le mea tonu lea o le ASCII). Ma afai tatou te manaʻo faʻafuaseʻi e tipi ese se siʻusiʻu laʻititi mai se manoa tele e aunoa ma le faʻavasegaina mai le amataga (pe toe faʻafoʻisia se vaega o faʻamatalaga pe a maeʻa se vaega faʻaleagaina), e faigofie mo i tatou ona maua le offset lea e amata ai se tagata (ua lava. e faase'e paita e fai sina prefix 10).

Aisea la e fai ai se mea fou?

I le taimi lava e tasi, e iai taimi e iai taimi e le talafeagai ai le faʻaogaina o algorithms e pei o le deflate, ae e te manaʻo e ausia le teuina o manoa. O le tagata lava ia, na ou feagai ma lenei faʻafitauli pe a mafaufau i le fausiaina la'au prefix compressed mo se lomifefiloi tele e aofia ai upu i gagana faifua. I le tasi itu, o upu taʻitasi e matua puupuu lava, o le faʻapipiʻiina o le a le aoga. I le isi itu, o le faʻatinoga o laʻau na ou mafaufau i ai na mamanuina ina ia mafai ai e byte taʻitasi o le manoa teuina e maua ai se laʻau eseʻese, ma o le faʻaitiitia o latou numera na aoga tele. I la'u faletusi Az.js (E pei o pymorphy2, lea e faʻavae ai) o se faʻafitauli tutusa e mafai ona foia faigofie - manoa faʻapipiʻi i totonu DAWG- lomifefiloi, teuina i totonu lelei tuai CP1251. Ae, e pei ona faigofie ona malamalama, e aoga lenei mea mo naʻo se alafapeta faʻatapulaʻa - e le mafai ona faʻaopoopoina se laina i le gagana Saina i se lomifefiloi.

Tuʻueseese, ou te manaʻo e matauina se tasi o mea le lelei e tulaʻi mai pe a faʻaaogaina le UTF-8 i se faʻatulagaga faʻamaumauga. O le ata o loʻo i luga o loʻo faʻaalia ai pe a tusia se tagata e pei o ni paita e lua, o fasipepa e fesoʻotaʻi ma lona numera e le o mai i se laina, ae o loʻo tuʻueseese e se paʻu. 10 i le ogatotonu: 110xxxxx 10xxxxxx. Ona o lenei mea, pe a oʻo i lalo ifo 6 bits o le byte lona lua o loʻo tafe i totonu o le faʻailoga tagata (o lona uiga, e tupu se suiga. 1011111110000000), ona sui ai lea o le paita muamua. E foliga mai o le mataitusi "p" o loʻo faʻaalia e bytes 0xD0 0xBF, ma o le isi “r” ua uma 0xD1 0x80. I se la'au prefix, e o'o atu ai i le vaeluaina o le node matua i le lua - tasi mo le prefix. 0xD0, ma le isi mo 0xD1 (e ui o le alafapeta Cyrillic atoa e mafai ona faʻaogaina naʻo le paita lona lua).

O le a le mea na ou maua

I le feagai ai ma lenei faʻafitauli, na ou filifili ai e faʻataʻitaʻi le taʻalo i taʻaloga ma fasi, ma i le taimi lava e tasi ia faʻamasani atili i le fausaga o Unicode atoa. O le taunuuga o le UTF-C encoding format ("C" mo māopoopo), lea e le sili atu i le 3 bytes i le code point, ma e masani ona faʻatagaina oe e faʻaalu naʻo tasi le paita faaopoopo mo le laina fa'ailoga atoa. E mafua ai le mea moni e faapea i luga o le tele o alafapeta e le o le ASCII o ia faʻailoga e foliga mai 30-60% sili atu fa'atusatusa nai lo UTF-8.

Ua ou tuʻuina atu faʻataʻitaʻiga o le faʻatinoina o le faʻaogaina ma le decoding algorithms i le fomu JavaScript ma Go faletusi, e mafai ona e faʻaogaina saoloto i latou i lau code. Ae o le a ou faamamafaina pea i se tulaga o lenei faatulagaga e tumau pea o se " uila vilivae ", ma ou te le fautuaina le faʻaaogaina. e aunoa ma le iloaina pe aisea e te manaomia ai. E sili atu lenei mea o se faʻataʻitaʻiga nai lo se "faʻaleleia atili o le UTF-8". Ae ui i lea, o le code iina o loʻo tusia lelei, maʻoti, faʻatasi ai ma le tele o faʻamatalaga ma suʻega suʻega.

O le isi uila: matou te teuina manoa Unicode 30-60% sili atu fa'atusatusa nai lo UTF-8
I'uga o su'ega ma fa'atusatusaga ile UTF-8

Sa ou faia foi itulau demo, lea e mafai ai ona e iloiloina le faʻatinoga o le algorithm, ona ou taʻu atu lea ia te oe nisi mea e uiga i ana mataupu faavae ma le atinaʻe.

Fa'ate'aina o mea fa'aletonu

Na ou aveina UTF-8 e fai ma faavae, ioe. O le mea muamua ma sili ona manino e mafai ona suia i totonu o le faʻaitiitia o le numera o tautua bits i paita taʻitasi. Mo se faʻataʻitaʻiga, o le muamua byte i le UTF-8 e amata i taimi uma 0, po o le 11 - o se prefix 10 E na'o paita nei e iai. Tatou sui le prefix 11 i 1, ma mo isi bytes o le a tatou aveesea atoatoa prefixes. O le a le mea o le a tupu?

0xxxxxxx — 1 paita
10xxxxxx xxxxxxxx - 2 paita
110xxxxx xxxxxxxx xxxxxxxx - 3 paita

Fa'atali, o fea o iai le fa'amaumauga e fa-paita? Ae e le o toe manaʻomia - pe a tusia i le tolu paita, ua maua nei le 21 bits avanoa ma e lava lea mo numera uma e oʻo atu i le 0x10FFFF.

O le a le mea ua tatou ositaulagaina iinei? O le mea pito sili ona taua o le suʻeina o tuaoi o uiga mai se nofoaga faʻapitoa i totonu o le pa. E le mafai ona tatou fa'asino i se byte fa'atonu ma su'e le amataga o le isi uiga mai ai. O se tapula'a lea o la tatou faatulagaga, ae i le fa'atinoga e seasea mana'omia. E masani ona mafai ona tatou tamoʻe i totonu o le pa puipui mai le amataga (aemaise lava pe a oʻo mai i laina pupuu).

O le tulaga o loʻo aofia ai gagana faʻatasi ma 2 bytes ua sili atu foi ona lelei: o le taimi nei o le lua-byte format e maua ai le tele o 14 bits, ma o tulafono nei e oʻo atu i 0x3FFF. O Saina e le manuia (o latou uiga e tele lava mai 0x4E00 i 0x9FFF), ae o Georgians ma le tele o isi tagata e sili atu le fiafia - o latou gagana e fetaui ma le 2 paita i le amio.

Ulufale i le tulaga encoder

Sei o tatou mafaufau nei e uiga i meatotino o laina lava ia. O le lomifefiloi e masani ona aofia ai upu e tusia i mataitusi o le alafapeta lava e tasi, ma e moni foi lea mo le tele o isi tusitusiga. E lelei le ta'u tasi o lenei alafapeta, ona ta'u atu lea na'o le numera o le mataitusi i totonu. Se'i va'ai pe o le a fesoasoani le fa'atulagaina o mataitusi i le laulau Unicode.

E pei ona taʻua i luga, ua vaevaeina Unicode i vaalele 65536 fa'ailoga ta'itasi. Ae e le o se vaega aoga tele (e pei ona uma ona fai mai, o le tele o taimi tatou te i ai i le vaalele zero). E sili atu le manaia o le vaevaega e poloka. O laina nei e le o toe i ai se umi tumau, ma e sili atu ona anoa - o se tulafono, e tuʻufaʻatasia e taʻitasi mataitusi mai le alafapeta e tasi.

O le isi uila: matou te teuina manoa Unicode 30-60% sili atu fa'atusatusa nai lo UTF-8
O se poloka o loo i ai mataitusi o le alafapeta Bengali. Ae paga lea, mo mafuaʻaga faʻasolopito, o se faʻataʻitaʻiga lea o le afifiina e le o matua mafiafia - 96 mataitusi o loʻo faʻasalalau solo i luga ole 128 poloka poloka poloka.

O le amataga o poloka ma o latou lapopoa e masani lava ona faʻateleina o le 16 - e faia lenei mea mo le faigofie. E le gata i lea, o le tele o poloka e amata ma faʻaiʻu i luga o tau e faʻateleina o le 128 poʻo le 256 - mo se faʻataʻitaʻiga, o le alafapeta Cyrillic autu e maua ai le 256 paita mai. 0x0400 i 0x04FF. E faigofie tele lenei mea: pe a tatou faʻasaoina le prefix tasi 0x04, ona mafai lea ona tusia soo se uiga Cyrillic i le tasi paita. E moni, o le auala lenei o le a tatou le maua ai le avanoa e toe foʻi atu ai i le ASCII (ma soʻo se isi lava tagata lautele). O lea matou te faia lenei mea:

  1. Lua paita 10yyyyyy yxxxxxxx e le gata e faailoa ai se faailoga ma se numera yyyyyy yxxxxxxx, ae suia foi alafapeta o iai nei i yyyyyy y0000000 (o lona uiga matou te manatua mea uma sei vagana ai mea e sili ona taua 7 faagutu);
  2. Tasi paita 0xxxxxxx o le uiga lea o le alafapeta o iai nei. Na'o le mana'omia o le fa'aopoopo i le offset na matou manatua i le Laasaga 1. E ui matou te le'i suia le alafapeta, o le offset e leai, o lea na matou fa'atumauina le fetaui ma le ASCII.

E faʻapea foʻi mo tulafono laiti e manaʻomia 3 bytes:

  1. Tolu paita 110yyyyy yxxxxxxx xxxxxxxx faailoa mai se faailoga ma se numera yyyyyy yxxxxxxx xxxxxxxx, sui alafapeta o iai nei i yyyyyy y0000000 00000000 (manatua mea uma vagana ai tamaiti laiti 15 faagutu), ma siaki le pusa o loʻo tatou i ai nei umi faiga (pe a suia le alafapeta i tua i le lua-byte tasi, o le a matou toe setiina lenei fuʻa);
  2. Lua paita 0xxxxxxx xxxxxxxx i le faiga umi o le uiga o le alafapeta o loʻo iai nei. E faʻapea foʻi, matou te faʻaopoopoina ma le offset mai le laasaga 1. Pau lava le eseesega o le taimi nei matou te faitau i le lua bytes (ona ua matou sui i lenei faiga).

Fa'alogo lelei: a'o tatou mana'omia le fa'ailoga mataitusi mai le 7-bit Unicode laina tutusa, matou te fa'aaluina le 1 paita fa'aopoopo i le amataga ma le aofa'i o le tasi paita i le tagata.

O le isi uila: matou te teuina manoa Unicode 30-60% sili atu fa'atusatusa nai lo UTF-8
Galue mai se tasi o lomiga muamua. E masani ona taia le UTF-8, ae o loʻo iai pea le avanoa e faʻaleleia atili ai.

O le a le mea e sili atu ona leaga? Muamua, o loʻo i ai le tatou tulaga, o lona uiga fa'asologa o alafapeta o lo'o iai nei ma le pusa siaki faiga umi. O lenei mea e fa'atapula'aina ai i tatou: o lea la e mafai ona fa'ailoga ese'ese mataitusi tutusa i tulaga eseese. O le suʻeina o substrings, mo se faʻataʻitaʻiga, e tatau ona faia i le amanaia o lenei mea, ae le na o le faʻatusatusaina o bytes. Lona lua, o le taimi lava na matou suia ai le alafapeta, na amata ona leaga i le faʻaogaina o mataitusi ASCII (ma e le gata o le alafapeta Latina, ae faʻapea foʻi ma faʻailoga faavae, e aofia ai avanoa) - latou te manaʻomia le toe suia o le alafapeta i le 0, o lona uiga, toe fa'aopoopo le byte (ona toe fo'i ai lea o le isi i le tatou manatu autu).

E lelei le alafapeta e tasi, e sili atu le lua

Sei o tatou taumafai e sui teisi a tatou prefix, faʻapipiʻi le tasi i le tolu o loʻo faʻamatalaina i luga:

0xxxxxxx — 1 byte i le tulaga masani, 2 i le faiga umi
11xxxxxx — 1 paita
100xxxxx xxxxxxxx - 2 paita
101xxxxx xxxxxxxx xxxxxxxx - 3 paita

O le isi uila: matou te teuina manoa Unicode 30-60% sili atu fa'atusatusa nai lo UTF-8

I le taimi nei i se fa'amaumauga e lua-byte o lo'o i ai se vaega itiiti e maua - fa'ailoga fa'ailoga i luga 0x1FFFae leai 0x3FFF. Ae ui i lea, o loʻo vaʻaia pea le tele nai lo le lua-byte UTF-8 codes, o le tele o gagana masani o loʻo fetaui i totonu, o le mea sili ona iloagofie ua paʻu i fafo. talatala и katakana, ua faanoanoa Iapani.

O le a lenei tulafono fou? 11xxxxxx? Ole la'ititi lea o le "fa'aputu" o le 64 mataitusi i le lapopoa, e fa'amalieina la tatou alafapeta autu, o lea na ou ta'ua ai o le ausilali (ausilali) alafapeta. A tatou fesuiai le alafapeta o loo i ai nei, o se vaega o le alafapeta tuai e avea ma ausilali. Mo se faʻataʻitaʻiga, na matou sui mai le ASCII i le Cyrillic - o loʻo i ai nei le 64 mataitusi o loʻo i ai Alafapeta Latina, numera, avanoa ma koma (sili ona fa'aofi so'o i tusitusiga e le o ASCII). Toe sui i le ASCII - ma o le vaega autu o le alafapeta Cyrillic o le a avea ma alafapeta fesoasoani.

Faʻafetai i le avanoa i alafapeta e lua, e mafai ona tatou taulimaina se numera tele o tusitusiga ma tau maualalo mo le fesuiaiga o alafapeta (faʻailoga e masani ona taʻitaʻia ai le toe foʻi i le ASCII, ae a maeʻa, o le a tatou maua le tele o mataitusi e le o le ASCII mai le alafapeta faaopoopo, e aunoa ma toe sui).

Ponesi: fa'apipi'i muamua le alafapeta 11xxxxxx ma le filifilia o lona uluai offset e avea 0xC0, matou te maua se vaega o feso'ota'iga ma le CP1252. I se isi faaupuga, o le tele (ae le o mea uma) tusitusiga Europa i Sisifo o loʻo faʻapipiʻiina i le CP1252 o le a foliga tutusa ile UTF-C.

Ae ui i lea, o loʻo tulaʻi mai se faigata: faʻafefea ona maua se fesoasoani mai le alafapeta autu? E mafai ona e tu'ua le fa'ailoga tutusa, ae - talofa - o lo'o ta'alo nei le fausaga Unicode ia i matou. E masani lava o le vaega autu o le alafapeta e le o le amataga o le poloka (mo se faʻataʻitaʻiga, o le laumua o Rusia "A" o loʻo i ai le code. 0x0410, e ui o le poloka Cyrillic e amata i 0x0400). O le mea lea, a uma ona ave muamua 64 mataitusi i totonu o le teu, e mafai ona tatou le maua le avanoa i le siʻusiʻu vaega o le alafapeta.

Ina ia foia lenei faafitauli, sa ou alu ma le lima i nisi o poloka e fetaui ma gagana eseese, ma faʻamaonia le faʻaogaina o le alafapeta fesoasoani i totonu o le autu autu mo i latou. O le alafapeta Latina, e pei o se tuusaunoaga, sa masani ona toe faatulagaina e pei o le base64.

O le isi uila: matou te teuina manoa Unicode 30-60% sili atu fa'atusatusa nai lo UTF-8

Pa'i mulimuli

Sei o tatou mafaufau mulimuli po o fea se isi mea e mafai ona tatou faaleleia ai se mea.

Manatua o le faatulagaga 101xxxxx xxxxxxxx xxxxxxxx e fa'atagaina oe e fa'aigoa numera e o'o i 0x1FFFFF, ma Unicode e muta muamua, i 0x10FFFF. I se isi faaupuga, o le numera code mulimuli o le a faʻatusalia 10110000 11111111 11111111. O le mea lea, e mafai ona tatou fai atu pe a fai o le byte muamua o le fomu 1011xxxx (o fea xxxx sili atu i le 0), o lona uiga o se isi mea. Mo se faʻataʻitaʻiga, e mafai ona e faʻaopoopoina isi 15 mataitusi o loʻo avanoa pea mo le faʻailoga i le tasi paita, ae na ou filifili e fai ese.

Se'i o tatou va'ai i na poloka Unicode e mana'omia le tolu paita i le taimi nei. O le mea moni, e pei ona taʻua muamua, o tagata Saina nei - ae e faigata ona faia se mea ma i latou, e 21 afe i latou. Ae o hiragana ma katakana na lele foi iina - ma ua le toe tele naua, e itiiti ifo i le lua selau. Ma, talu ai na matou manatuaina Iapani, e iai foʻi emojis (o le mea moni, o loʻo salalau i le tele o nofoaga i le Unicode, ae o poloka autu o loʻo i totonu o le lautele. 0x1F300 - 0x1FBFF). Afai e te mafaufau i le mea moni o loʻo i ai nei emojis o loʻo faʻapotopotoina mai le tele o faʻailoga i le taimi e tasi (mo se faʻataʻitaʻiga, le emoji ‍‍‍O le isi uila: matou te teuina manoa Unicode 30-60% sili atu fa'atusatusa nai lo UTF-8 e aofia ai le tele o 7 codes!), Ona avea ai lea ma se maasiasi atoatoa le faʻaaluina o le tolu paita i luga o taʻitasi (7 × 3 = 21 paita mo le manatu o se tasi faʻailoga, o se moemiti).

O le mea lea, matou te filifilia ni nai laina filifilia e fetaui ma emoji, hiragana ma katakana, toe faanumera i latou i se lisi faʻaauau e tasi ma faʻailoga i latou e lua paita nai lo le tolu:

1011xxxx xxxxxxxx

Sili: o le emoji ua taʻua muamuaO le isi uila: matou te teuina manoa Unicode 30-60% sili atu fa'atusatusa nai lo UTF-8, e aofia ai 7 code points, ave 8 bytes i le UTF-25, ma matou fetaui i ai 14 (e lua paita mo taʻiala taʻitasi). I le ala, na musu Habr e eliina (i le tuai ma le faatonu fou), o lea na tatau ai ona ou faʻaofiina i se ata.

Sei o tatou taumafai e faaleleia se isi faafitauli. E pei ona tatou manatua, o le alafapeta faavae e taua maualuga 6 bits, lea tatou te manatua ma fa'apipi'i i le fa'ailoga o fa'ailoga ta'itasi o lo'o soso'o mai. I le tulaga o mataitusi Saina o loʻo i totonu o le poloka 0x4E00 - 0x9FFF, ole bit 0 poʻo le 1. E le faigofie tele lenei mea: tatou te manaʻomia le fesuiaʻi pea o le alafapeta i le va o nei tau e lua (faʻaalu tolu paita). Ae ia maitauina i le umi, mai le code lava ia e mafai ona tatou toesea le numera o mataitusi tatou te faʻapipiʻiina i le faʻaogaina o le auala pupuu (pe a uma togafiti uma o loʻo faʻamatalaina i luga, o le 10240 lea) - ona suia lea o le tele o hieroglyphs. 0x2600 - 0x77FF, ma i lenei tulaga, i lenei tulaga atoa, o le 6 pito sili ona taua (mai le 21) o le a tutusa ma le 0. O le mea lea, o faʻasologa o hieroglyphs o le a faʻaogaina le lua bytes i le hieroglyph (lea e sili ona lelei mo se tele tele), e aunoa ma mafua ai suiga ole alafapeta.

Isi fofo: SCSU, BOCU-1

O tagata tomai faapitoa i le Unicode, faatoa uma ona faitau le ulutala o le tusiga, e foliga mai e faanatinati e faamanatu atu ia te oe o loʻo i ai saʻo i totonu o tulaga Unicode. Fuafuaga Fa'amau Fa'atonu mo Unicode (SCSU), o loʻo faʻamatalaina se auala faʻapipiʻi e tutusa lelei ma le faʻamatalaina i le tusiga.

Ou te taʻutino atu ma le faamaoni: Na ou aʻoaʻoina e uiga i lona i ai ina ua uma ona ou matua loloto i le tusiaina o laʻu filifiliga. Ana ou iloa e uiga i ai mai le amataga, masalo semanu ou te taumafai e tusi se faʻatinoga nai lo le sau i laʻu lava auala.

O le mea e manaia ai, o le SCSU o loʻo faʻaogaina manatu e tutusa lelei ma mea na ou maua mai ia te aʻu lava (nai lo le manatu o le "alphabets" latou te faʻaogaina "windows", ma e tele naua avanoa nai lo aʻu). I le taimi lava e tasi, o lenei faʻatulagaga e iai foʻi mea le lelei: e sili atu le latalata i faʻamalosi algorithms nai lo le faʻaogaina. Aemaise lava, o le faʻataʻitaʻiga e tuʻuina atu ai le tele o auala faʻatusa, ae e le o taʻu mai pe faʻapefea ona filifili le mea sili ona lelei - mo lenei mea, e tatau i le encoder ona faʻaogaina se ituaiga o heuristics. O le mea lea, o le SCSU encoder e gaosia lelei afifi o le a sili atu ona faigata ma sili atu le faigata nai lo laʻu algorithm.

Mo le faʻatusatusaga, na ou faʻafeiloaʻi se faʻatinoga faigofie o le SCSU i le JavaScript - e tusa ai ma le numera o le numera na foliga mai e faʻatusatusa i laʻu UTF-C, ae i nisi tulaga o le taunuuga e sefulu pasene le leaga (o nisi taimi e sili atu, ae e le tele). Mo se faʻataʻitaʻiga, o tusitusiga i le gagana Eperu ma le Eleni na faʻaogaina e UTF-C 60% sili atu nai lo SCSU (masalo ona o latou alafapeta faʻatusatusa).

E ese mai, o le a ou faʻaopopo e ese mai le SCSU o loʻo i ai foi se isi auala e faʻamaonia ai le Unicode - BOCU-1, ae faʻamoemoe mo le fetaui o MIME (lea ou te leʻi manaʻomia) ma e fai sina eseʻese auala e faʻaogaina ai. Ou te leʻi iloiloina lona aoga, ae e foliga mai ia te aʻu e foliga mai e le maualuga atu nai lo le SCSU.

Fa'aleleia atili

O le algorithm na ou tuʻuina atu e le o se mea lautele e ala i le mamanu (atonu o le mea lea e sili atu ona ese ai aʻu sini mai sini a le Unicode Consortium). Ua uma ona ou taʻua na atiaʻe muamua mo se galuega e tasi (teuina o se lolomifefiloi gagana i totonu o se prefix tree), ma o nisi o ona foliga atonu e le fetaui lelei mo isi galuega. Ae o le mea moni e le o se tulaga masani e mafai ona avea ma se faʻaopoopoga - e faigofie ona e suia e fetaui ma ou manaʻoga.

Mo se faʻataʻitaʻiga, i le auala manino e mafai ai ona e faʻaumatia le i ai o le setete, fai faʻailoga e leai ni setete - ae aua le faʻafouina suiga. offs, auxOffs и is21Bit i le encoder ma decoder. I lenei tulaga, o le a le mafai ona faʻapipiʻi lelei faʻasologa o mataitusi o le alafapeta lava e tasi, ae o le ai ai se faʻamautinoaga o le tagata lava e tasi e faʻapipiʻiina i taimi lava e tasi, e tusa lava po o le a le tala.

E le gata i lea, e mafai ona e faʻaogaina le encoder i se gagana faʻapitoa e ala i le suia o le tulaga le lelei - mo se faʻataʻitaʻiga, taulaʻi i tusitusiga Rusia, seti le encoder ma decoder i le amataga. offs = 0x0400 и auxOffs = 0. E fetaui lelei lenei mea i le tulaga o le tulaga e leai ni setete. I se tulaga lautele, o le a tutusa lea ma le faʻaogaina o le valu-bit encoding tuai, ae aunoa ma le aveesea o le mafai e faʻapipiʻi mataitusi mai Unicode uma pe a manaʻomia.

O le isi fa'aletonu na ta'ua muamua o le tele o tusitusiga ua fa'ailoga i le UTF-C e leai se auala vave e su'e ai le tuaoi uiga sili ona latalata i se byte fa'atonu. Afai e te tipi ese le mea mulimuli, fai mai, 100 paita mai le faʻailoga faʻapipiʻi, e te lamatia le maua o lapisi e le mafai ona e faia i ai. O le faʻailoga e leʻo fuafuaina mo le teuina o ogalaau tele-gigabyte, ae i se tulaga lautele e mafai ona faʻasaʻo. Byte 0xBF e le tatau ona foliga mai o le paita muamua (ae atonu o le lona lua poʻo le tolu). O le mea lea, pe a faʻapipiʻi, e mafai ona e faʻaofiina le faʻasologa 0xBF 0xBF 0xBF uma, fai mai, 10 KB - ona, afai e te manaʻomia le suʻeina o se tuaoi, o le a lava le suʻeina o le vaega filifilia seia maua se faʻailoga tutusa. Mulimuli i le mea mulimuli 0xBF ua mautinoa o le amataga lea o se amio. (Pe a faʻavasegaina, o lenei faʻasologa o paita e tolu, ioe, e manaʻomia le le amanaiaina.)

E tauaofai

Afai na e faitau i lenei mamao, faamalo! Ou te faʻamoemoe o oe, pei o aʻu, na e aʻoaʻoina se mea fou (pe faʻafouina lou mafaufau) e uiga i le fausaga o Unicode.

O le isi uila: matou te teuina manoa Unicode 30-60% sili atu fa'atusatusa nai lo UTF-8
Itulau fa'aaliga. O le faʻataʻitaʻiga o le Eperu o loʻo faʻaalia ai le lelei i luga o le UTF-8 ma le SCSU.

Ole su'esu'ega o lo'o fa'amatalaina i luga e le tatau ona manatu o se soliga i tulaga fa'ata'atia. Ae ui i lea, e masani lava ona ou faamalieina i taunuuga o laʻu galuega, o lea ou te fiafia ai ia i latou e fetufaai: mo se faʻataʻitaʻiga, o se faletusi JS minified e na o le 1710 bytes (ma e leai se faʻalagolago, ioe). E pei ona ou taʻua i luga, o lana galuega e mafai ona maua i itulau demo (o loʻo i ai foi se seti o tusitusiga e mafai ona faʻatusatusa i le UTF-8 ma le SCSU).

Mulimuli ane, o le a ou toe faʻafeiloaʻi atu i mataupu o loʻo faʻaogaina ai le UTF-C leai se aoga:

  • Afai e lava le umi o au laina (mai le 100-200 mataitusi). I lenei tulaga, e tatau ona e mafaufau e uiga i le faʻaogaina o algorithms faʻamalosi e pei o le faʻafefe.
  • Afai e te mana'omia ASCII manino, o lona uiga, e taua mo oe le faʻasologa o faʻasologa e le o iai ni tulafono ASCII e leʻi i ai i le manoa muamua. O le manaʻoga mo lenei mea e mafai ona aloese pe afai, pe a fegalegaleai ma isi vaega APIs (mo se faʻataʻitaʻiga, galue ma se faʻamaumauga), e te pasia le faʻasologa o le faʻasologa o se seti o bytes, ae le o ni manoa. A leai, e te ono maua ni fa'alavelave fa'afuase'i.
  • Afai e te manaʻo e mafai ona vave suʻeina tuaoi o uiga i se faʻasalaga faʻapitoa (mo se faʻataʻitaʻiga, pe a faʻaleagaina se vaega o se laina). E mafai ona faia lenei mea, ae naʻo le suʻeina o le laina mai le amataga (poʻo le faʻaogaina o le suiga o loʻo faʻamatalaina i le vaega muamua).
  • Afai e te manaʻomia le faʻatinoina vave o gaioiga i luga o mea o loʻo i totonu o manoa (faʻavasega i latou, suʻe mo substrings i totonu, faʻatasi). O lenei mea e manaʻomia ai manoa e faʻavasega muamua, o lea o le UTF-C o le a faʻagesegese nai lo UTF-8 i nei tulaga (ae sili atu le vave nai lo algorithms compression). Talu ai ona o le manoa lava e tasi e faʻapipiʻiina i le auala lava e tasi, e le manaʻomia le faʻatusatusaga saʻo o le decoding ma e mafai ona faia i luga o le byte-by-byte faavae.

lata mai: le tagata e faaaogaina Tyomitch i faʻamatalaga o loʻo i lalo lafoina se kalafi e faʻamaonia ai tapulaʻa faʻaoga a le UTF-C. E faʻaalia ai o le UTF-C e sili atu le lelei nai lo le faʻaogaina lautele algorithm (se fesuiaiga o le LZW) pe a fai e puupuu le manoa faʻapipiʻi. ~140 mataitusi (ae ui i lea, ou te matauina o le faʻatusatusaga na faia i luga o le tasi tusitusiga, mo isi gagana atonu e ese le iʻuga).
O le isi uila: matou te teuina manoa Unicode 30-60% sili atu fa'atusatusa nai lo UTF-8

puna: www.habr.com

Faaopoopo i ai se faamatalaga