Baesekele e 'ngoe: re boloka likhoele tsa Unicode 30-60% ho feta UTF-8

Baesekele e 'ngoe: re boloka likhoele tsa Unicode 30-60% ho feta UTF-8

Haeba u moqapi 'me u tobane le mosebetsi oa ho khetha encoding, Unicode e batla e le tharollo e nepahetseng kamehla. Mokhoa o ikhethileng oa boemeli o ipapisitse le moelelo oa taba, empa hangata ho na le karabo e akaretsang mona - UTF-8. Ntho e ntle ka eona ke hore e u lumella ho sebelisa litlhaku tsohle tsa Unicode ntle le ho sebelisa chelete hape li-byte tse ngata maemong a mangata. Ke 'nete, lipuong tse sebelisang ho feta alfabeta ea Selatine, "eseng haholo" bonyane li-byte tse peli ho motho ka mong. Na re ka etsa betere ntle le ho khutlela ho likhoutu tsa khale tse re lekanyetsang feela litlhaku tse 256 tse fumanehang?

Ka tlase ke etsa tlhahiso ea ho tloaelana le teko ea ka ea ho araba potso ena le ho kenya ts'ebetsong algorithm e bonolo e u lumellang ho boloka mela ka lipuo tse ngata tsa lefats'e ntle le ho eketsa boteng bo teng ho UTF-8.

Boithorollo. Hang-hang ke tla etsa lipeheletso tse 'maloa tsa bohlokoa: tharollo e hlalositsoeng ha e fanoe e le sebaka sa bokahohle sa UTF-8, e loketse feela lethathamong le moqotetsane la linyeoe (ho feta ho tsona ka tlase), 'me ha ho joalo ha hoa lokela ho sebelisoa ho sebelisana le li-API tsa batho ba bang (ba sa tsebeng le ka eona). Hangata, li-algorithms tsa morero o akaretsang (mohlala, deflate) li loketse polokelo e kopaneng ea data e ngata ea mongolo. Ntle le moo, ke se ke ntse ke theha tharollo ea ka, ke fumane tekanyetso e teng ho Unicode ka boeona, e rarollang bothata bo ts'oanang - e batla e rarahane ('me hangata e mpe), empa e ntse e le tekanyetso e amohelehang, eseng feela e behiloeng. mmoho ka lengole. Le ka eena ke tla u bolella.

Mabapi le Unicode le UTF-8

Ho qala, mantsoe a seng makae mabapi le hore na ke eng Unicode и UTF-8.

Joalo ka ha u tseba, li-encoding tsa 8-bit li ne li tumme. Ka bona, ntho e 'ngoe le e' ngoe e ne e le bonolo: litlhaku tse 256 li ka baloa ka linomoro ho tloha ho 0 ho ea ho 255, 'me linomoro ho tloha ho 0 ho ea ho 255 li ka hlalosoa e le byte e le' ngoe. Haeba re khutlela qalong, khouto ea ASCII e lekanyelitsoe ka ho felletseng ho li-bits tse 7, kahoo karolo ea bohlokoa ka ho fetesisa ea boemeli ba eona ke zero, 'me boholo ba li-encoding tsa 8-bit li lumellana le eona (li fapana feela ka "holimo" karolo, moo karolo ea bohlokoahali e leng e le 'ngoe).

Unicode e fapana joang le likhoutu tseo, 'me ke hobane'ng ha liemahale tse ngata tse ikhethileng tse amanang le eona - UTF-8, UTF-16 (BE le LE), UTF-32? A re e hlophiseng ka tatellano.

Tekanyetso ea mantlha ea Unicode e hlalosa feela mangolo a teng lipakeng tsa litlhaku ('me maemong a mang, likarolo tsa batho ka bomong) le linomoro tsa tsona. 'Me ho na le linomoro tse ngata tse ka khonehang boemong bona - ho tloha 0x00 ho 0x10FFFF (likotoana tse 1). Haeba re ne re batla ho kenya nomoro mofuteng o joalo ho feto-fetoha, ha ho li-byte tse 114 kapa tse 112 tse tla re lekana. 'Me kaha li-processor tsa rona ha lia etsoa haholo bakeng sa ho sebetsa ka linomoro tsa li-byte tse tharo, re tla qobelloa ho sebelisa boholo ba li-byte tse 1 ho motho ka mong! Ena ke UTF-2, empa ke ka lebaka la "tšenyo" ena hore sebopeho sena ha se ratoe.

Ka lehlohonolo, tatellano ea litlhaku ka har'a Unicode ha e iketsahalle feela. Sehlopha sohle sa bona se arotsoe ka "17"lifofane", e 'ngoe le e 'ngoe ea tsona e na le 65536 (0x10000""lintlha tsa khoutu" Mohopolo oa "code point" mona o bonolo nomoro ea sebapali, e abetsoeng ho eona ke Unicode. Empa, joalo ka ha ho boletsoe ka holimo, ho Unicode ha se litlhaku tsa motho ka mong feela tse baloang, empa le likarolo tsa tsona le matšoao a lits'ebeletso ('me ka linako tse ling ha ho letho ho hang le lumellanang le palo - mohlomong hajoale, empa ho rona sena ha se bohlokoa hakaalo), kahoo ho nepahetse ho feta kamehla bua ka ho khetheha ka palo ea linomoro ka botsona, eseng matšoao. Leha ho le joalo, ho tse latelang, molemong oa ho khutsufatsa, hangata ke tla sebelisa lentsoe "letšoao", le bolelang lentsoe "code point".

Baesekele e 'ngoe: re boloka likhoele tsa Unicode 30-60% ho feta UTF-8
Lifofane tsa Unicode. Joalokaha u ka bona, boholo ba eona (lifofane 4 ho 13) e ntse e sa sebelisoe.

Ho makatsang ka ho fetesisa ke hore "pulp" eohle e ka sehloohong e ka sefofaneng sa zero, se bitsoa "Sefofane sa Motheo sa Lipuo Tse Ngata". Haeba mola o na le mongolo ho e 'ngoe ea lipuo tsa sejoale-joale (ho kenyeletsoa le Sechaena), u ke ke ua fetela ka nģ'ane ho sefofane sena. Empa u ka se khone ho khaola Unicode - mohlala, li-emoji li fumaneha haholo qetellong ea sefofane se latelang,"Sefofane sa Tlatsetso sa Lipuo Tse Ngata"(ho tloha ho 0x10000 ho 0x1FFFF). Kahoo UTF-16 e etsa sena: litlhaku tsohle tse oelang ka hare Sefofane sa Motheo sa Lipuo Tse Ngata, li kentsoe “joalokaha li le” ka nomoro ea li-byte tse peli. Leha ho le joalo, lipalo tse ling tsa mefuta ena ha li bontše litlhaku tse itseng ho hang, empa li bontša hore ka mor'a para ena ea li-byte re lokela ho nahana ka e 'ngoe - ka ho kopanya boleng ba li-byte tsena tse' nè hammoho, re fumana palo e koahelang. lethathamo lohle le sebetsang la Unicode. Khopolo ena e bitsoa “banyalani ba emeng e mong”—e ka ’na eaba u utloile ka bona.

Kahoo UTF-16 e hloka tse peli kapa (maemong a sa tloaelehang haholo) li-byte tse 'ne ka "code point". Sena se molemo ho feta ho sebelisa li-byte tse 'ne ka linako tsohle, empa Selatine (le litlhaku tse ling tsa ASCII) ha e kentsoe ka tsela ena e senya halofo ea sebaka ho zero. UTF-8 e etselitsoe ho lokisa sena: ASCII ho eona e nka, joalo ka pele, byte e le 'ngoe feela; likhoutu ho tloha 0x80 ho 0x7FF - li-byte tse peli; ho tloha 0x800 ho 0xFFFF - tse tharo, le ho tloha 0x10000 ho 0x10FFFF - bane. Ka lehlakoreng le leng, alfabeta ea Selatine e se e le ntle: ho lumellana le ASCII ho khutlile, 'me kabo e "jalehile" ho tloha ho 1 ho ea ho 4 bytes. Empa litlhaku tse ling ntle le Selatine, oho, ha li rue molemo ka tsela leha e le efe ha li bapisoa le UTF-16, 'me tse ngata hona joale li hloka li-byte tse tharo ho e-na le tse peli - moeli o koahetsoeng ke tlaleho ea li-byte tse peli o fokotsehile ka makhetlo a 32. 0xFFFF ho 0x7FF, mme ha se Sechaena kapa, ka mohlala, Segeorgia ha se akaretsoe ho eona. Cyrillic le lialfabeta tse ling tse hlano - hurray - lehlohonolo, li-byte tse 2 ka sebopeho.

Ke hobane'ng ha see se etsahala? Ha re boneng hore na UTF-8 e emela likhoutu tsa litlhaku joang:
Baesekele e 'ngoe: re boloka likhoele tsa Unicode 30-60% ho feta UTF-8
Ka ho toba ho emela lipalo, likotoana tse tšoailoeng ka letšoao li sebelisoa mona x. Ho ka bonoa hore tlalehong ea li-byte tse peli ho na le li-bits tse joalo tse 11 feela (ho 16). Li-bits tse etellang pele mona li na le ts'ebetso e thusang feela. Tabeng ea rekoto ea li-byte tse 'ne, li-bits tse 21 ho tse 32 li abetsoe nomoro ea lintlha tsa khoutu - ho ka bonahala eka li-byte tse tharo (tse fanang ka kakaretso ea likotoana tse 24) li tla lekana, empa matšoao a litšebeletso a ja haholo.

Na see se sebe? E seng joalo hantle. Ka lehlakoreng le leng, haeba re tsotella sebaka haholo, re na le li-algorithms tsa compression tse ka felisang habonolo entropy eohle e eketsehileng le redundancy. Ka lehlakoreng le leng, sepheo sa Unicode e ne e le ho fana ka likhoutu tsa bokahohleng ka ho fetesisa. Mohlala, re ka beha mohala o kentsoeng ho UTF-8 ho khoutu e neng e sebetsa feela le ASCII, 'me re se ts'ohe hore e tla bona sebapali sa ASCII se seng se le sieo (ka mor'a tsohle, ho UTF-8 kaofela. li-byte tse qalang ho tloha ho zero bit - sena ke hantle seo ASCII e leng sona). 'Me haeba ka tšohanyetso re batla ho khaola mohatla o monyenyane ho tloha khoele e kholo ntle le ho e hlalosa ho tloha qalong (kapa ho tsosolosa karolo ea boitsebiso ka mor'a karolo e senyehileng), ho bonolo hore re fumane mokhoa oa ho fokotsa moo motho a qalang teng (ho lekane. ho tlola dibaiti tse nang le sehlongoapele se senyane 10).

Joale ke hobane'ng ha u qapa ntho e ncha?

Ka nako e ts'oanang, ka linako tse ling ho na le maemo ha li-algorithms tsa compression joalo ka deflate li sa sebetse hantle, empa u batla ho fihlela polokelo e kopaneng ea likhoele. Ka boeena, ke ile ka kopana le bothata bona ha ke nahana ka ho haha sefate sa sehlongoapele se petelitsoeng bakeng sa bukantswe e kgolo ho kenyeletswa le mantswe a dipuo tse sa tshwaneng. Ka lehlakoreng le leng, lentsoe le leng le le leng le lekhutšoanyane haholo, kahoo ho le hatella ho ke ke ha thusa. Ka lehlakoreng le leng, ts'ebetsong ea sefate eo ke neng ke e nahana e ne e etselitsoe hore byte e 'ngoe le e' ngoe ea khoele e bolokiloeng e hlahise vertex ea sefate e arohaneng, kahoo ho fokotsa palo ea bona ho ne ho le molemo haholo. Laebraring ea ka Az.js (Joalo ka pymorphy2, eo e theiloeng holim'a eona) bothata bo ts'oanang bo ka rarolloa habonolo - likhoele tse kentsoeng MOKHOA-dictionary, bolokoa moo ka hare CP1251 ea khale. Empa, joalo ka ha ho le bonolo ho utloisisa, sena se sebetsa hantle feela bakeng sa alfabeta e lekanyelitsoeng - mohala oa Sechaena o ke ke oa eketsoa bukeng e joalo.

Ka thoko, ke rata ho ela hloko ntho e 'ngoe e sa thabiseng e hlahang ha u sebelisa UTF-8 ka sebopeho sa data. Setšoantšo se ka holimo se bontša hore ha tlhaku e ngotsoe e le li-byte tse peli, likotoana tse amanang le palo ea eona ha li tle ka tatellano, empa li aroloa ka para ea li-bits. 10 mahareng: 110xxxxx 10xxxxxx. Ka lebaka la sena, ha likotoana tse 6 tse tlase tsa li-byte tsa bobeli li phalla ka har'a khoutu ea sebopeho (ke hore, phetoho e etsahala. 1011111110000000), ebe li-byte tsa pele le tsona lia fetoha. Hoa etsahala hore lengolo "p" le hlalosoa ke li-byte 0xD0 0xBF, mme “r” e latelang e se e ntse e le teng 0xD1 0x80. Sefateng sa sehlongwapele, sena se lebisa ho arohaneng ha node ya motswadi ho ba tse pedi - e le nngwe bakeng sa sehlongwapele 0xD0, le e 'ngoe bakeng sa 0xD1 (le hoja alfabeta eohle ea Cyrillic e ne e ka khoutooa feela ka li-byte tsa bobeli).

Ke fumane eng

Ha ke tobane le bothata bona, ke nkile qeto ea ho itloaetsa ho bapala lipapali ka likotoana, 'me ka nako e ts'oanang ke tloaelane le sebopeho sa Unicode ka kakaretso. Sephetho e bile sebopeho sa khouto sa UTF-C ("C" bakeng sa diseke), e sa sebeliseng li-byte tse fetang 3 ka ntlha ea khoutu, 'me hangata e u lumella ho sebelisa chelete feela baiti e le 'ngoe e eketsehileng bakeng sa mohala o kentsoeng kaofela. Sena se lebisa tabeng ea hore ho lialfabeta tse ngata tseo e seng tsa ASCII encoding e joalo e fetoha 30-60% e kopane ho feta UTF-8.

Ke hlahisitse mehlala ea ts'ebetsong ea li-encoding le li-decoding algorithms ka mokhoa Lilaebrari tsa JavaScript le Go, u ka li sebelisa ka bolokolohi khoutu ea hau. Empa ke ntse ke tla hatisa hore ka tsela e itseng mokhoa ona o lula e le "baesekele", 'me ha ke khothaletse ho e sebelisa ntle le ho hlokomela hore na ke hobane'ng ha u e hloka. Sena e ntse e le teko ho feta "ntlafatso ea UTF-8" e tebileng. Leha ho le joalo, khoutu e teng e ngotsoe ka makhethe, ka bokhuts'oane, ka palo e kholo ea maikutlo le tlhahlobo ea liteko.

Baesekele e 'ngoe: re boloka likhoele tsa Unicode 30-60% ho feta UTF-8
Liphetho tsa liteko le papiso le UTF-8

Le ’na ke ile ka etsa joalo leqephe la demo, moo o ka hlahlobang ts'ebetso ea algorithm, 'me joale ke tla u bolella ho eketsehileng ka melao-motheo ea eona le ts'ebetso ea nts'etsopele.

Ho tlosa likarolo tse sa hlokahaleng

Ke nkile UTF-8 e le motheo, ehlile. Ntho ea pele le e hlakileng ka ho fetisisa e ka fetoloang ho eona ke ho fokotsa palo ea li-bits tsa lits'ebeletso ho byte ka 'ngoe. Mohlala, baiti ea pele ho UTF-8 e lula e qala ka efe kapa efe 0, kapa ka 11 - sehlongoapele 10 Ke li-byte tse latelang feela tse nang le eona. Ha re nkele sehlongwapele sebaka 11 mabapi le 1, 'me bakeng sa li-byte tse latelang re tla tlosa li-prefixes ka ho feletseng. Ho tla etsahala'ng?

0xxxxxxx - 1 Byte
10xxxxxx xxxxxxxx - li-byte tse 2
110xxxxx xxxxxxxx xxxxxxxx - li-byte tse 3

Ema, rekoto ea li-byte tse 'ne e hokae? Empa ha e sa hlokahala - ha re ngola ka li-byte tse tharo, joale re na le li-bits tse 21 'me sena se lekane bakeng sa linomoro tsohle ho fihlela. 0x10FFFF.

Re iteletse eng moo? Ntho ea bohlokoa ka ho fetisisa ke ho lemoha meeli ea litlhaku ho tloha sebakeng se seng se le seng ho buffer. Re ke ke ra supa ntho e itseng feela ebe re fumana tšimoloho ea motho ea latelang ho eona. Ena ke moeli oa sebopeho sa rona, empa ts'ebetsong sena ha se hlokahale ka seoelo. Hangata re khona ho matha ka har'a buffer ho tloha qalong (haholo-holo ha ho tluoa meleng e mekgutshwane).

Boemo ba lipuo tse koahelang ka li-byte tse 2 le bona bo se bo le betere: joale sebopeho sa li-byte tse peli se fana ka mefuta e mengata ea li-bits tse 14, 'me tsena ke likhoutu ho fihlela. 0x3FFF. Machaena ha a na lehlohonolo (litšoantšo tsa bona hangata li tsoa ho 0x4E00 ho 0x9FFF), empa batho ba Georgia le batho ba bang ba bangata ba natefeloa haholo - lipuo tsa bona le tsona li lekana ka li-byte tse 2 ka sebopeho se le seng.

Kenya boemo ba encoder

Ha re nahane joale ka thepa ea mela ka boeona. Hangata buka e hlalosang mantsoe e na le mantsoe a ngotsoeng ka litlhaku tsa alfabeta e tšoanang, ’me sena ke ’nete le litemaneng tse ling tse ngata. Ho ka ba molemo ho bontša alfabeta ena hang, ebe u bontša feela palo ea tlhaku e ka hare ho eona. Ha re boneng hore na tlhophiso ea litlhaku tse tafoleng ea Unicode e tla re thusa.

Joalokaha ho boletsoe ka holimo, Unicode e arotsoe ka sefofane 65536 likhoutu ka 'ngoe. Empa sena ha se karohano e molemo haholo (joalokaha ho se ho boletsoe, hangata re le sefofaneng sa zero). Ho khahlisang haholoanyane ke karohano ka diboloko. Mekhahlelo ena ha e sa na bolelele bo tsitsitseng, 'me e na le moelelo haholoanyane - joalo ka molao, e' ngoe le e 'ngoe e kopanya litlhaku ho tsoa ho alfabeta e tšoanang.

Baesekele e 'ngoe: re boloka likhoele tsa Unicode 30-60% ho feta UTF-8
Sebaka se nang le litlhaku tsa alfabeta ea Benghali. Ka bomalimabe, ka mabaka a nalane, ona ke mohlala oa sephutheloana se sa teteaneng haholo - litlhaku tse 96 li hasane ka pherekano libakeng tse 128 tsa li-block code.

Tšimoloho ea li-block le boholo ba tsona li lula li le li-multiples tsa 16 - sena se etsoa molemong oa boiketlo. Ntle le moo, li-blocks tse ngata li qala le ho fela ka boleng ba lipalo tse 128 kapa 256 - mohlala, alfabeta ea mantlha ea Cyrillic e nka li-byte tse 256 ho tloha. 0x0400 ho 0x04FF. Sena se bonolo haholo: haeba re boloka sehlongwapele hang 0x04, joale litlhaku tsohle tsa Cyrillic li ka ngoloa ka baiti e le 'ngoe. Ke 'nete, ka tsela ena re tla lahleheloa ke monyetla oa ho khutlela ho ASCII (le ho litlhaku tse ling ka kakaretso). Kahoo re etsa sena:

  1. Li-byte tse peli 10yyyyyy yxxxxxxx ha e bolele feela letšoao le nang le palo yyyyyy yxxxxxxx, empa hape fetola alfabeta ea hona joale mabapi le yyyyyy y0000000 (ke hore, re hopola lintlha tsohle ntle le tse bohlokoa haholo Li-bits tsa 7);
  2. Bete e le 'ngoe 0xxxxxxx sena ke sebopeho sa alfabeta ea hajoale. E hloka feela ho eketsoa ho offset eo re e hopolang mohato oa 1. Le hoja re sa ka ra fetola alfabeta, offset ke zero, kahoo re bolokile ho lumellana le ASCII.

Hoa tšoana le bakeng sa likhoutu tse hlokang li-byte tse 3:

  1. Li-byte tse tharo 110yyyyy yxxxxxxx xxxxxxxx bontsha letshwao le nang le nomoro yyyyyy yxxxxxxx xxxxxxxx, phetoho alfabeta ea hona joale mabapi le yyyyyy y0000000 00000000 (hopola tsohle ntle le ba banyane Li-bits tsa 15), ’me u hlahlobe lebokose leo re leng ho lona hona joale telele mokhoa (ha o fetola alfabeta ho khutlela ho habeli-byte, re tla tsosolosa folakha ena);
  2. Li-byte tse peli 0xxxxxxx xxxxxxxx ka mokhoa o molelele ke sebopeho sa alfabeta ea hajoale. Ka mokhoa o ts'oanang, re e eketsa ka ho fokotsa ho tloha mohato oa 1. Phapang e le 'ngoe feela ke hore hona joale re bala li-byte tse peli (hobane re fetotse mokhoa ona).

E utloahala e le ntle: joale ha re ntse re hloka ho kenyelletsa litlhaku ho tsoa mofuteng o tšoanang oa 7-bit Unicode, re sebelisa 1 byte e eketsehileng qalong le kakaretso ea "byte" e le 'ngoe.

Baesekele e 'ngoe: re boloka likhoele tsa Unicode 30-60% ho feta UTF-8
Ho sebetsa ho tsoa ho e 'ngoe ea liphetolelo tsa pejana. E se e ntse e otla UTF-8 hangata, empa ho ntse ho na le sebaka sa ntlafatso.

Ho hobe le ho feta ke eng? Taba ea pele, re na le boemo, e leng alfabeta ea hona joale le lebokose la ho hlahloba mokhoa o molelele. Sena se re fokotsa le ho feta: joale litlhaku tse tšoanang li ka kengoa ka mokhoa o fapaneng maemong a fapaneng. Ho batla li-substrings, mohlala, ho tla tlameha ho etsoa ho ela hloko sena, eseng feela ka ho bapisa li-byte. Taba ea bobeli, hang ha re fetola alfabeta, e ile ea mpefala ha ho ngoloa litlhaku tsa ASCII ('me sena ha se feela alfabeta ea Selatine, empa hape le matšoao a mantlha, ho kenyelletsa le libaka) - li hloka ho fetola alfabeta hape ho 0, ke hore, hape e 'ngoe e eketsehileng (ebe e' ngoe hape ho khutlela ntlheng ea rona ea sehlooho).

Alfabeta e le 'ngoe e ntle, tse peli li molemo

Ha re leke ho fetola li-prefixes tsa rona hanyane, re sutumelletsa ho tse tharo tse hlalositsoeng ka holimo:

0xxxxxxx - 1 byte ka mokhoa o tloaelehileng, 2 ka mokhoa o molelele
11xxxxxx - 1 Byte
100xxxxx xxxxxxxx - li-byte tse 2
101xxxxx xxxxxxxx xxxxxxxx - li-byte tse 3

Baesekele e 'ngoe: re boloka likhoele tsa Unicode 30-60% ho feta UTF-8

Hona joale rekotong ea li-byte tse peli ho na le karolo e le 'ngoe e sa fumaneheng - lintlha tsa khoutu ho fihlela 0x1FFF, eseng 0x3FFF. Leha ho le joalo, e ntse e le kholo ho feta ka li-code tsa UTF-8 tsa habeli-byte, lipuo tse tloaelehileng li ntse li lekana, tahlehelo e hlokomelehang e se e felile. hiragana и katakana, Majapane a hloname.

Khoutu ee e ncha ke efe? 11xxxxxx? Ena ke "stash" e nyane ea litlhaku tse 64 ka boholo, e tlatsana le alfabeta ea rona ea mantlha, ka hona ke e bitsitse e thusang (mothusi) alfabeta. Ha re fetola alfabeta ea hajoale, sekhechana sa alfabeta ea khale se thusa. Mohlala, re tlohile ho ASCII ho ea ho Cyrillic - stash joale e na le litlhaku tse 64 tse nang le Alfabeta ea Selatine, linomoro, sebaka le koma (ho kenngoa khafetsa litemaneng tse seng tsa ASCII). Khutlela ho ASCII - 'me karolo e kholo ea alfabeta ea Cyrillic e tla fetoha alfabeta e thusang.

Ka lebaka la ho fihlella lialfabeta tse peli, re khona ho sebetsana le litemana tse ngata tse nang le litšenyehelo tse fokolang tsa ho fetola litlhaku (lipuisano hangata li tla lebisa ho khutlela ho ASCII, empa ka mor'a moo re tla fumana litlhaku tse ngata tseo e seng tsa ASCII ho tsoa ho alfabeta e eketsehileng, ntle le ho fetoha hape).

Bonase: ho hlopha alfabeta e nyane 11xxxxxx le ho khetha offset ea eona ea pele ho ba 0xC0, re fumana tumellano e sa fellang le CP1252. Ka mantsoe a mang, lingoloa tse ngata (empa eseng kaofela) tsa Europe Bophirima tse kentsoeng ho CP1252 li tla shebahala joalo ka UTF-C.

Leha ho le joalo, mona ho hlaha bothata: mokhoa oa ho fumana thuso ho tsoa ho alfabeta e kholo? U ka tlohela offset e tšoanang, empa - oho - mona sebopeho sa Unicode se se se ntse se bapala khahlanong le rona. Hangata, karolo e kholo ea alfabeta ha e qalong ea block (mohlala, motse-moholo oa Russia "A" o na le khoutu. 0x0410, le hoja Cyrillic block e qala ka 0x0400). Kahoo, ha re nkile litlhaku tsa pele tse 64 ho stash, re ka lahleheloa ke monyetla oa ho fumana karolo ea mohatla oa alfabeta.

Ho lokisa bothata bona, ke ile ka feta ka har'a li-block tse tsamaellanang le lipuo tse fapaneng, 'me ka hlalosa ho fokotseha ha alfabeta ea tlatsetso ka har'a e kholo bakeng sa bona. Alfabeta ea Selatine, joalo ka mokhelo, e ne e hlophisoa bocha joalo ka base64.

Baesekele e 'ngoe: re boloka likhoele tsa Unicode 30-60% ho feta UTF-8

Lintlha tsa ho qetela

Ha re qetelle re nahana hore na ke hokae hape moo re ka ntlafatsang ho hong.

Hlokomela hore sebopeho 101xxxxx xxxxxxxx xxxxxxxx e o lumella ho kenyelletsa linomoro ho fihlela 0x1FFFFF, 'me Unicode e fella pejana, ho 0x10FFFF. Ka mantsoe a mang, ntlha ea ho qetela ea khoutu e tla emeloa e le 10110000 11111111 11111111. Ka hona, re ka re haeba byte ea pele e le ea sebopeho 1011xxxx (kae xxxx e kholo ho feta 0), ebe e bolela ntho e 'ngoe hape. Mohlala, o ka eketsa litlhaku tse ling tse 15 moo tse lulang li fumaneha bakeng sa khouto ka byte e le 'ngoe, empa ke nkile qeto ea ho e etsa ka tsela e fapaneng.

Ha re shebeng li-block tsa Unicode tse hlokang li-byte tse tharo hona joale. Ha e le hantle, joalokaha ho se ho boletsoe, tsena ke litlhaku tsa Sechaena - empa ho thata ho etsa letho ka tsona, ho na le tse likete tse 21 tsa tsona. Empa hiragana le katakana le tsona li ile tsa fofa moo - 'me ha li sa le ngata haholo, tse ka tlase ho makholo a mabeli. Mme, kaha re hopotse Majapane, ho boetse ho na le emojis (ha e le hantle, e hasane libakeng tse ngata ho Unicode, empa li-block tsa mantlha li maemong a fapaneng. 0x1F300 - 0x1FBFF). Haeba u nahana ka taba ea hore joale ho na le li-emojis tse bokelletsoeng ho tsoa lintlheng tse 'maloa tsa khoutu hang (mohlala, emojiBaesekele e 'ngoe: re boloka likhoele tsa Unicode 30-60% ho feta UTF-8 e na le likhoutu tse ka bang 7!), ebe e fetoha lihlong ho qeta li-byte tse tharo ho e 'ngoe le e' ngoe (7 × 3 = li-byte tse 21 molemong oa setšoantšo se le seng, toro e mpe).

Ka hona, re khetha mefuta e 'maloa e khethiloeng e tsamaellanang le emoji, hiragana le katakana, re e ngole lethathamong le le leng le tsoelang pele ebe re e kenyelletsa e le li-byte tse peli ho fapana le tse tharo:

1011xxxx xxxxxxxx

E kholo: emoji e boletsoeng ka holimoBaesekele e 'ngoe: re boloka likhoele tsa Unicode 30-60% ho feta UTF-8, e nang le lintlha tse 7 tsa khoutu, e nka li-byte tse 8 ho UTF-25, 'me re e lumellana le eona. 14 (hantle-ntle li-byte tse peli bakeng sa ntlha ka 'ngoe ea khoutu). Ka tsela, Habr o ile a hana ho e cheka (bobeli ba khale le ho mohlophisi e mocha), kahoo ke ile ka tlameha ho e kenya ka setšoantšo.

Ha re leke ho lokisa bothata bo bong hape. Joalo ka ha re hopola, alfabeta ea mantlha ke ea bohlokoa phahameng 6 likotoana, eo re e hopolang le ho khomarela khoutu ea letšoao le leng le le leng le latelang le khethiloeng. Tabeng ea litlhaku tsa Sechaena tse ka har'a boloko 0x4E00 - 0x9FFF, sena se batla se le 0 kapa 1. Sena ha se bonolo haholo: re tla hloka ho fetola alfabeta kamehla pakeng tsa litekanyetso tsena tse peli (e leng ho sebelisa li-byte tse tharo). Empa hlokomela hore ka nako e telele, ho tloha khoutu ka boeona re ka tlosa palo ea litlhaku tseo re li kenyelletsang ka mokhoa o khutšoanyane (ka mor'a maqheka ohle a hlalositsoeng ka holimo, sena ke 10240) - joale mefuta e mengata ea li-hieroglyphs e tla fetela ho. 0x2600 - 0x77FF, 'me tabeng ena, ho pholletsa le mefuta ena eohle, li-bits tse 6 tsa bohlokoa ka ho fetisisa (ho 21) li tla lekana le 0. Kahoo, tatelano ea li-hieroglyphs e tla sebelisa li-byte tse peli ka hieroglyph (e leng eona e nepahetseng bakeng sa mefuta e mengata joalo), ntle le ho baka diphetoho tsa alfabeta.

Litharollo tse ling: SCSU, BOCU-1

Litsebi tsa Unicode, ha li qeta ho bala sehlooho sa sengoloa, li tla potlaka ho u hopotsa hore ka kotloloho har'a litekanyetso tsa Unicode ho na le. Standard Compression Scheme bakeng sa Unicode (SCSU), e hlalosang mokhoa oa khouto o ts'oanang haholo le o hlalositsoeng sehloohong.

Ke lumela ka botšepehi: Ke ithutile ka boteng ba eona feela ka mor'a hore ke kenelle ka ho teba ha ke ngola qeto ea ka. Haeba ke tsebile ka eona ho tloha qalong, mohlomong nka be ke lekile ho ngola ts'ebetsong ho e-na le ho tla ka mokhoa oa ka.

Ho khahlisang ke hore SCSU e sebelisa mehopolo e ts'oanang haholo le eo ke iqapetseng eona ke le mong (ho fapana le mohopolo oa "alphabets" ba sebelisa "lifensetere", mme ho na le tse ngata ho feta tseo ke nang le tsona). Ka nako e ts'oanang, sebopeho sena se boetse se na le mefokolo: e haufi hanyane le li-algorithms tsa compression ho feta tse khouto. Haholo-holo, tekanyetso e fana ka mekhoa e mengata ea boemeli, empa ha e bolele mokhoa oa ho khetha e nepahetseng - bakeng sa sena, encoder e tlameha ho sebelisa mofuta o itseng oa heuristics. Kahoo, encoder ea SCSU e hlahisang liphutheloana tse ntle e tla ba thata le ho feta ho feta algorithm ea ka.

Ha ho bapisoa, ke fetisitse ts'ebetsong e batlang e le bonolo ea SCSU ho JavaScript - ho latela bophahamo ba khoutu ho ile ha fumaneha hore e ka bapisoa le UTF-C ea ka, empa maemong a mang sephetho se ne se le mpe haholo (ka linako tse ling se ka feta, empa eseng haholo). Ka mohlala, litemana tsa Seheberu le Segerike li ne li ngotsoe ka UTF-C 60% e betere ho feta SCSU (mohlomong ka lebaka la litlhaku tsa bona tse kopaneng).

Ka thoko, ke tla eketsa hore ntle le SCSU ho boetse ho na le mokhoa o mong oa ho emela Unicode ka kopanelo - BOCU-1, empa e ikemiselitse ho tsamaellana le MIME (eo ke neng ke sa e hloke) mme e nka mokhoa o fapaneng hanyane oa ho khouto. Ha ke so hlahlobe katleho ea eona, empa ho 'na ho bonahala eka ha ho na monyetla oa ho ba holimo ho feta SCSU.

Lintlafatso tse ka bang teng

Algorithm eo ke e hlahisitseng ha e tloaelehe ka moralo (mohlomong ke moo lipheo tsa ka li fapanang haholo le lipheo tsa Unicode Consortium). Ke se ke boletse hore e etselitsoe mosebetsi o le mong (ho boloka bukana ea lipuo tse ngata sefateng sa prefix), 'me likarolo tse ling tsa eona li ka' na tsa se ke tsa tšoanela mesebetsi e meng. Empa taba ea hore ha se maemo e ka ba tlatsetso - o ka e fetola habonolo hore e lumellane le litlhoko tsa hau.

Mohlala, ka tsela e hlakileng u ka tlosa boteng ba mmuso, etsa likhoutu tse se nang palo - feela u se ke oa ntlafatsa mefuta e fapaneng. offs, auxOffs и is21Bit ka har'a encoder le decoder. Tabeng ena, ho ke ke ha khoneha ho paka ka katleho tatellano ea litlhaku tsa alfabeta e le 'ngoe, empa ho tla ba le tiisetso ea hore sebopeho se tšoanang se lula se ngotsoe ka li-byte tse tšoanang, ho sa tsotellehe moelelo oa taba.

Ntle le moo, o ka etsa hore encoder e lumellane le puo e itseng ka ho fetola boemo ba kamehla - mohlala, ho tsepamisa maikutlo litemaneng tsa Serussia, beha encoder le decoder qalong. offs = 0x0400 и auxOffs = 0. Sena se utloahala haholo-holo tabeng ea mokhoa o se nang naha. Ka kakaretso, sena se tla tšoana le ho sebelisa khouto ea khale ea li-bits tse robeli, empa ntle le ho tlosa bokhoni ba ho kenya litlhaku ho tsoa ho Unicode eohle kamoo ho hlokahalang.

Tšabo e 'ngoe e boletsoeng pejana ke hore ka mongolo o moholo o kentsoeng ho UTF-C ha ho na mokhoa o potlakileng oa ho fumana moeli oa sebapali o haufi le li-byte tse sa lumellaneng. Haeba u khaola ea ho qetela, e re, li-byte tse 100 ho tsoa ho buffer e kentsoeng, u ipeha kotsing ea ho fumana lithōle tseo u ke keng ua etsa letho ka tsona. Encoding ha e etselitsoe ho boloka li-gigabyte tse ngata, empa ka kakaretso sena se ka lokisoa. Byte 0xBF ha ea lokela ho hlaha joalo ka li-byte tsa pele (empa e ka ba ea bobeli kapa ea boraro). Ka hona, ha o encoding, o ka kenya tatellano 0xBF 0xBF 0xBF E 'ngoe le e' ngoe, e re, 10 KB - joale, haeba u hloka ho fumana moeli, ho tla lekana ho hlahloba sengoathoana se khethiloeng ho fihlela letšoao le tšoanang le fumanoa. Ho latela ea ho qetela 0xBF e tiisetsoa ho ba qalo ya mophetwa. (Ha ho khethoa, tatellano ena ea li-byte tse tharo, ehlile, e tla hloka ho hlokomolohuoa.)

Ho akaretsa

Haeba u balile ho fihlela mona, rea u leboha! Ke ts'epa hore le uena, joalo ka nna, u ithutile ho hong ho hocha (kapa ho khatholla mohopolo oa hau) ka sebopeho sa Unicode.

Baesekele e 'ngoe: re boloka likhoele tsa Unicode 30-60% ho feta UTF-8
Leqephe la demo. Mohlala oa Seheberu o bontša melemo ho feta UTF-8 le SCSU.

Liphuputso tse boletsoeng ka holimo ha lia lokela ho nkoa e le ho kena-kenana le maemo. Leha ho le joalo, ka kakaretso ke khotsofetse ke liphello tsa mosebetsi oa ka, kahoo ke thabela tsona arolelana: mohlala, laeborari ea minified JS e boima ba li-byte tse 1710 feela ('me ha e na lintho tse itšetlehileng ka eona, ehlile). Joalokaha ke boletse ka holimo, mosebetsi oa hae o ka fumanoa ho leqephe la demo (ho boetse ho na le sete ea litemana tseo ho tsona li ka bapisoang le UTF-8 le SCSU).

Qetellong, ke tla boela ke hlokomelise linyeoe tseo UTF-C e sebelisoang ho tsona ha e na bohlokoa:

  • Haeba mela ea hau e le telele ka ho lekaneng (ho tloha ho litlhaku tse 100-200). Tabeng ena, o lokela ho nahana ka ho sebelisa li-algorithms tsa compression joalo ka deflate.
  • Haeba u hloka ASCII ponaletso, ke hore, ho bohlokoa ho uena hore tatellano e kentsoeng ha e na likhoutu tsa ASCII tse neng li le sieo khoeleng ea mantlha. Tlhokahalo ea sena e ka qojoa haeba, ha u sebelisana le li-API tsa motho oa boraro (mohlala, ho sebetsa le database), u fetisa sephetho sa encoding e le sete e sa bonahaleng ea li-byte, eseng joalo ka likhoele. Ho seng joalo, u ipeha kotsing ea ho fumana bofokoli bo sa lebelloang.
  • Haeba u batla ho khona ho fumana kapele meeli ea litlhaku ka mokhoa o sa reroang (mohlala, ha karolo ea mola e senyehile). Sena se ka etsoa, ​​​​empa feela ka ho hlahloba mohala ho tloha qalong (kapa ho sebelisa phetoho e hlalositsoeng karolong e fetileng).
  • Haeba o hloka ho etsa ts'ebetso ka potlako ho likahare tsa likhoele (li hlopha, batla li-substrings ho tsona, concatenate). Sena se hloka hore likhoele li khethoe pele, kahoo UTF-C e tla tsamaea butle ho feta UTF-8 maemong ana (empa e potlakile ho feta mekhoa ea compression). Kaha khoele e tšoanang e lula e kentsoe ka mokhoa o ts'oanang, papiso e nepahetseng ea decoding ha e hlokehe mme e ka etsoa ka mokhoa oa byte-by-byte.

update loi: mosebelisi Tyomitch litlhalosong tse ka tlase e kentse graph e totobatsang meeli ea tšebeliso ea UTF-C. E bontša hore UTF-C e sebetsa hantle ho feta algorithm ea morero oa kakaretso (e fapaneng ea LZW) ha feela khoele e pakiloeng e le khutšoanyane. ~ Litlhaku tse 140 (leha ho le joalo, kea hlokomela hore papiso e entsoe ka mongolo o le mong; lipuong tse ling sephetho se ka fapana).
Baesekele e 'ngoe: re boloka likhoele tsa Unicode 30-60% ho feta UTF-8

Source: www.habr.com

Eketsa ka tlhaloso