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".
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 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
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. 10111111
→ 10000000
), 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
I'uga o su'ega ma fa'atusatusaga ile UTF-8
Sa ou faia foi
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 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:
- Lua paita
10yyyyyy yxxxxxxx
e le gata e faailoa ai se faailoga ma se numerayyyyyy yxxxxxxx
, ae suia foi alafapeta o iai nei iyyyyyy y0000000
(o lona uiga matou te manatua mea uma sei vagana ai mea e sili ona taua 7 faagutu); - 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:
- Tolu paita
110yyyyy yxxxxxxx xxxxxxxx
faailoa mai se faailoga ma se numerayyyyyy yxxxxxxx xxxxxxxx
, sui alafapeta o iai nei iyyyyyy 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); - 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.
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
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 0x1FFF
ae 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.
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.
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 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 muamua
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.
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 -
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.
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
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
puna: www.habr.com