Ko tetahi atu paihikara: ka penapenahia e matou nga aho Unicode 30-60% atu kiato atu i te UTF-8

Ko tetahi atu paihikara: ka penapenahia e matou nga aho Unicode 30-60% atu kiato atu i te UTF-8

Mena he kaiwhakawhanake koe ka raru koe ki te kowhiri i tetahi whakawaehere, katahi ka noho ko Unicode te otinga tika. Ko te tikanga whakakitenga motuhake ka whakawhirinaki ki te horopaki, engari ko te nuinga o te waa he whakautu mo te ao katoa - UTF-8. Ko te mea pai mo tera ka taea e koe te whakamahi i nga tohu Unicode katoa me te kore whakapau moni nui rawa he maha nga paita i te nuinga o te waa. He pono, mo nga reo e whakamahi nui atu ana i te piapa Latino, "kaore e nui" he iti rawa e rua nga paita mo ia ahua. Ka taea e tatou te mahi pai ake me te kore e hoki ki nga whakawaehere o mua ka whakawhāiti i a tatou ki te 256 noa nga tohu e waatea ana?

Kei raro nei ka whakaaro ahau kia mohio koe ki taku ngana ki te whakautu i tenei patai me te whakatinana i tetahi algorithm ngawari noa e taea ai e koe te penapena raina i roto i te nuinga o nga reo o te ao me te kore e taapiri i te taapiri kei roto i te UTF-8.

Whakakahoretanga. Ka mahia e au etahi rahui nui: ko te otinga kua whakaahuahia kaore i tukuna hei whakakapi mo te ao mo te UTF-8, he pai noa i roto i te rarangi whaiti o nga keehi (kei runga ake i a raatau i raro nei), a kaua rawa e whakamahia ki te taunekeneke me nga API tuatoru (kaore i te mohio ki a raatau). Ko te nuinga o nga wa, ko nga algorithms compression-whanui (hei tauira, deflate) e pai ana mo te rokiroki kiato o te rahi o nga raraunga kuputuhi. I tua atu, i te wa o te hanga i taku otinga, i kitea e ahau tetahi paerewa kei roto i te Unicode ake, e whakaoti ana i te raru ano - he ahua uaua ake (me te nuinga o te wa kino), engari he paerewa kua whakaaetia, kaua e waiho noa. tahi i runga i te turi. Ka korero ano ahau ki a koe mo ia.

Mō Unicode me UTF-8

Hei timata, he kupu torutoru mo te aha Unicode и UTF-8.

Kei te mohio koe, he rongonui nga whakawaehere moka-8. Ma ratou, he ngawari nga mea katoa: 256 nga tohu ka taea te tatau me nga nama mai i te 0 ki te 255, me nga nama mai i te 0 ki te 255 ka taea te tohu hei paita kotahi. Mena ka hoki ano tatou ki te timatanga, ko te whakawaehere ASCII he iti rawa ki te 7 moka, no reira ko te moka tino nui i roto i tana tohu paita he kore, a ko te nuinga o nga whakawaehere 8-bit e hototahi ana ki a ia (he rereke noa i te "runga" wahi, ko te moka tino nui he kotahi).

He aha te rerekee o te Waehereao mai i aua whakawaehere, he aha hoki te maha o nga whakaaturanga motuhake e hono ana - UTF-8, UTF-16 (BE me LE), UTF-32? Kia whakaraupapahia kia raupapa.

Ko te paerewa Waehereao taketake e whakaatu ana i nga reta i waenga i nga tohu (me etahi ahuatanga, nga waahanga takitahi o nga tohu) me o raatau nama. A he maha nga nama ka taea i tenei paerewa - mai 0x00 ki 0x10FFFF (1 wahi). Mena kei te pirangi matou ki te whakauru i tetahi tau ki roto i taua awhe ki te taurangi, karekau e ranea te 114, te 112 paita ranei mo tatou. A, i te mea karekau i tino hangaia a maatau kaitukatuka mo te mahi me nga nama e toru-paita, ka kaha taatau ki te whakamahi kia 1 paita mo ia ahua! Ko UTF-2 tenei, engari na tenei "moumomou" kaore i te rongonui tenei whakatakotoranga.

Waimarie, ko te raupapa o nga tohu i roto i te Waehereao ehara i te mea ohorere. Kua wehea to raatau huinga katoa ki te 17 "rererangi", kei roto ia ia 65536 (0x10000) "tohu waehere" Ko te kaupapa o te "tohu tohu" i konei he ngawari tau pūāhua, i tautapahia e Unicode. Engari, pera i te korero i runga ake nei, i roto i te Unicode ehara i te mea ko nga tohu takitahi anake te tatau, engari ko o raatau waahanga me nga tohu ratonga (a i etahi wa kaore rawa e rite ki te nama - tera pea mo tenei wa, engari mo tatou ehara tenei i te mea nui), no reira he tika ake te korero i nga wa katoa mo te maha o nga tau, kaua nga tohu. Engari, i roto i nga korero e whai ake nei, mo te wa poto, ka whakamahia e au te kupu "tohu", e tohu ana i te kupu "tohu tohu".

Ko tetahi atu paihikara: ka penapenahia e matou nga aho Unicode 30-60% atu kiato atu i te UTF-8
Nga rererangi Waehereao. Kei te kite koe, ko te nuinga (nga rererangi 4 ki te 13) kaore ano kia whakamahia.

Ko te mea tino whakamiharo ko nga "purp" matua katoa kei roto i te rererangi kore, ka kiia ko "Rererangi Rere-Maori Taketake". Mena kei roto i tetahi raina he kupu i roto i tetahi o nga reo hou (tae atu ki te Hainamana), kaore koe e haere ki tua o tenei rererangi. Engari kaore e taea e koe te tapahi i te toenga o te Waehereao - hei tauira, kei te nuinga o te emoji kei te mutunga o te rererangi i muri mai,"Rererangi Rere-Mare Tāpiri"(ka toro atu 0x10000 ki 0x1FFFF). Na UTF-16 tenei mahi: ka taka nga tohu katoa ki roto Rererangi Rere-Maori Taketake, kua whakawaeheretia "penei" me te tau e rua-paita. Heoi, ko etahi o nga tau kei roto i tenei awhe kaore i te whakaatu i nga tohu motuhake, engari e tohu ana i muri i tenei takirua o nga paita me whai whakaaro tatou ki tetahi atu - ma te whakakotahi i nga uara o enei paita e wha, ka whiwhi tatou i tetahi tau e hipoki ana. te awhe Waehereao whaimana katoa. Ko tenei whakaaro ka kiia he "taurua whakakapi" - kua rongo pea koe ki a raatau.

No reira ka hiahia a UTF-16 kia rua, (i nga keehi tino onge) e wha paita mo ia "tohu tohu". He pai ake tenei i te whakamahi i nga paita e wha i nga wa katoa, engari ko te Latin (me etahi atu tohu ASCII) ka whakawaeheretia penei ka moumou te haurua o te mokowā ki te kore. Ko te UTF-8 i hangaia hei whakatika i tenei: Ko te ASCII kei roto, he rite ki mua, kotahi noa te paita; waehere mai 0x80 ki 0x7FF - e rua paita; mai 0x800 ki 0xFFFF - toru, a mai 0x10000 ki 0x10FFFF - wha. I tetahi taha, kua pai te reta Latin: kua hoki mai te hototahi ki te ASCII, a he pai ake te tohatoha "ka horahia" mai i te 1 ki te 4 paita. Engari ko nga reta i tua atu i te reo Latina, aue, kaore he painga ki te UTF-16, a he maha nga wa e hiahia ana kia toru nga paita hei utu mo te rua - ko te awhe e hipokina ana e te rekoata rua-paita kua iti ake e 32 nga wa, me 0xFFFF ki 0x7FF, a kaore he Hainamana, hei tauira, he Georgian kei roto. Cyrillic me etahi atu reta e rima - hurray - waimarie, 2 paita mo ia ahua.

He aha i penei ai? Kia kite tatou me pehea te tohu a UTF-8 i nga tohu tohu:
Ko tetahi atu paihikara: ka penapenahia e matou nga aho Unicode 30-60% atu kiato atu i te UTF-8
Hei tohu i nga tau, ka whakamahia nga moka kua tohua ki te tohu i konei x. Ka kitea i roto i te rekoata e rua-paita he 11 noa nga moka pera (i roto i te 16). Ko nga paraka matua kei konei he mahi awhina anake. Mo te rekoata e wha-paita, 21 i roto i te 32 nga moka ka tohatohahia mo te nama tohu tohu - te ahua nei ka nui nga paita e toru (e 24 nga moka katoa), engari he nui rawa te kai a nga tohu ratonga.

He kino tenei? Kaore rawa. I tetahi taha, ki te whakaaro nui tatou mo te waahi, kei a tatou nga algorithms compression ka taea te whakakore i nga entropy katoa me te taapiri. I tetahi atu taha, ko te whainga o te Unicode ko te whakarato i nga tohu mo te ao katoa. Hei tauira, ka taea e tatou te tuku i tetahi raina kua whakawaeheretia ki te UTF-8 ki te waehere i mahi i mua me te ASCII anake, kaua hoki e mataku kei kitea he ahua mai i te awhe ASCII karekau i reira (i muri i nga mea katoa, kei UTF-8 katoa. paita timata mai i te moka kore - koinei tonu te ASCII). A, ki te hiahia ohorere tatou ki te tapahi i tetahi hiku iti mai i te aho nui me te kore wetewete i te waa mai i te timatanga (ka whakahoki mai ranei i tetahi waahanga o nga korero i muri i te waahanga kua pakaru), he ngawari ki a tatou te kimi i te waahi ka timata te ahua (kua ranea. ki te peke i nga paita he paku mua 10).

He aha ra ka whakaaroa he mea hou?

I te wa ano, i etahi wa ka kore e tika te whakamahi i nga hātepe compression algorithms penei i te deflate, engari e hiahia ana koe ki te whakatutuki i te rokiroki kiato o nga aho. Ko ahau ake, i tutaki ahau ki tenei raru i te wa e whakaaro ana ahau mo te hanga whare rakau prefix kōpeke mo te papakupu nui me nga kupu i roto i nga reo kore. I tetahi taha, he poto rawa ia kupu, no reira ka kore e whai hua te kopiri. I tetahi atu taha, ko te whakatinanatanga rakau i whakaarohia e au i hangaia kia puta mai i ia paita o te aho kua penapena he tohu rakau motuhake, no reira he tino whai hua te whakaiti i to raatau nama. I taku whare pukapuka Az.js (Ka rite ki roto pymorphy2, kei runga i a ia) he raruraru rite ka taea te whakaoti ngawari - he aho ki roto DAWG-papakupu, rongoa ki roto pai CP1251 tawhito. Engari, he ngawari ki te mohio, he pai tenei mo te reta iti - kaore e taea te taapiri i tetahi rarangi reo Hainamana ki taua papakupu.

Ma te wehe, ka hiahia ahau ki te tuhi i tetahi atu ahua kino ka puta mai i te wa e whakamahi ana i te UTF-8 i roto i taua hanganga raraunga. Ko te pikitia i runga ake nei e whakaatu ana ka tuhia he kiripuaki hei rua paita, karekau nga moka e pa ana ki tona tau e haere mai i te rarangi, engari ka wehea e te rua moka. 10 i waenganui: 110xxxxx 10xxxxxx. Na tenei, ka puhake nga moka iti 6 o te paita tuarua i roto i te tohu tohu (ara, ka puta he whakawhitinga. 1011111110000000), ka huri ano te paita tuatahi. Ka puta ko te reta "p" e tohuhia ana e nga paita 0xD0 0xBF, a ko te "r" e whai ake nei kua oti 0xD1 0x80. I roto i te rakau prefix, ka wehe tenei i te pona matua kia rua - kotahi mo te prefix 0xD0, me tetahi atu mo 0xD1 (ahakoa ko te katoa o te reta Hirilika ka taea te whakawaehere ma te paita tuarua anake).

He aha i whiwhi ahau

I mua i tenei raru, i whakatau ahau ki te parakatihi ki te takaro keemu me nga paraka, me te wa ano kia mohio ake ahau ki te hanganga o te Unicode katoa. Ko te hua ko te whakatakotoranga whakawaehere UTF-C ("C" mo kiato), kaore e nui ake i te 3 paita mo ia tohu tohu, a he maha nga wa ka taea e koe te whakapau moni anake kotahi paita taapiri mo te raina whakawaehere katoa. Ka puta tenei ki te meka i runga i te maha o nga reta ASCII kore-ASCII ka huri te whakawaehere 30-60% atu kiato atu i te UTF-8.

Kua whakaatuhia e au etahi tauira o te whakatinanatanga o te whakawaehere me te wetewete algorithms i roto i te ahua JavaScript me nga whare pukapuka Haere, ka taea e koe te whakamahi noa i roto i to waehere. Engari ka kaha tonu ahau ki te kii he "pahikara" tenei whakatakotoranga, kaore au e kii ki te whakamahi. me te kore e mohio he aha koe e hiahia ana. He whakamatautau tonu tenei i te "whakapai ake o te UTF-8". Heoi, ko te waehere kei reira kua tuhia marie, poto, me te maha o nga korero me te kapinga whakamatautau.

Ko tetahi atu paihikara: ka penapenahia e matou nga aho Unicode 30-60% atu kiato atu i te UTF-8
Nga hua whakamatautau me te whakataurite ki te UTF-8

I mahia ano e ahau whārangi demo, ka taea e koe te arotake i te mahi o te algorithm, katahi ka korero atu ahau ki a koe mo ona kaupapa me te tukanga whanaketanga.

Te whakakore i nga moka kore

I tangohia e ahau te UTF-8 hei kaupapa, o te akoranga. Ko te mea tuatahi me te tino kitea ka taea te whakarereke i roto ko te whakaiti i te maha o nga moka ratonga i ia paita. Hei tauira, ko te paita tuatahi i roto i te UTF-8 ka tiimata i nga wa katoa 0, me te ranei 11 - he prefix 10 Ko nga paita e whai ake nei kei a ia. Me whakakapi te prefix 11 i runga i 1, a mo nga paita e whai ake nei ka tangohia katoatia e matou nga prefix. Ka ahatia?

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

Taihoa, kei hea te rekoata e wha-paita? Engari kua kore e hiahiatia - i te wa e tuhi ana i roto i nga paita e toru, kua 21 nga paraka e waatea ana inaianei, a he ranea tenei mo nga tau katoa tae atu ki te 0x10FFFF.

He aha ta matou patunga i konei? Ko te mea nui ko te kite i nga rohenga o te ahua mai i te waahi karekau i roto i te parepare. Kare e taea e tatou te tohu ki tetahi paita noa ka kitea te timatanga o te ahua o muri mai. He herenga tenei o ta maatau whakatakotoranga, engari i roto i nga mahi he uaua tenei. I te nuinga o te wa ka taea e matou te rere i roto i te parapara mai i te timatanga (ina koa ka tae mai ki nga raina poto).

Ko te ahuatanga o te uhi i nga reo me te 2 paita kua pai ake: inaianei ko te whakatakotoranga rua-paita ka hoatu he awhe 14 moka, a he tohu enei 0x3FFF. Ko nga Hainamana kaore i te waimarie (ko te nuinga o o raatau ahuatanga mai i 0x4E00 ki 0x9FFF), engari ko nga Georgians me etahi atu iwi he nui ake te ngahau - ka uru ano o raatau reo ki te 2 paita mo ia ahua.

Whakauruhia te ahua encoder

Me whakaaro tatou inaianei mo nga ahuatanga o nga raina ake. Kei te papakupu te nuinga o nga kupu kua tuhia ki roto i nga tohu o te piapa kotahi, a he pono ano tenei mo te maha atu o nga tuhinga. He mea pai kia kotahi te tohu i tenei piapa, katahi ka tohu ko te nama anake o te reta kei roto. Me titiro mena ka awhina te whakaritenga o nga tohu i te ripanga Waehereao.

Ka rite ki te korero i runga ake nei, kua wehea a Unicode ki rererangi 65536 waehere ia. Engari ehara tenei i te wehewehenga tino whai hua (i te mea kua kiia ake nei, ko te nuinga o nga wa kei roto tatou i te rererangi kore). Ko te mea whakamere ko te wehenga na poraka. Ko enei awhe kua kore he roa kua whakaritea, he mea whai kiko ake - hei tikanga, ka hono ia tangata i nga tohu mai i te reta kotahi.

Ko tetahi atu paihikara: ka penapenahia e matou nga aho Unicode 30-60% atu kiato atu i te UTF-8
He poraka kei roto nga tohu o te reta Bengali. Heoi ano, mo nga take o mua, he tauira tenei o te kete kare i tino kikokore - 96 nga tohu e marara noa ana puta noa i te 128 nga tohu poraka poraka.

Ko nga timatanga o nga poraka me o ratou rahi he maha tonu o te 16 - ka mahia tenei mo te ngawari. I tua atu, he maha nga poraka ka timata me te mutu i runga i nga uara he maha o te 128, tae atu ki te 256 - hei tauira, ko te reta Cyrillic taketake e 256 paita mai i 0x0400 ki 0x04FF. He tino watea tenei: mena ka tiakina e tatou te prefix kotahi 0x04, katahi ka taea te tuhi i tetahi ahua Hiririki ki te paita kotahi. Pono, ma tenei ka ngaro te whai waahi ki te hoki ki te ASCII (me etahi atu tohu i te nuinga). Na reira ka mahia e matou tenei:

  1. E rua paita 10yyyyyy yxxxxxxx ehara i te mea he tohu anake me te tau yyyyyy yxxxxxxx, engari ka huri ano reta o naianei i runga i yyyyyy y0000000 (arā, ka maumahara mātou ki ngā paraka katoa hāunga ngā mea iti rawa 7 bit);
  2. Kotahi paita 0xxxxxxx koinei te ahua o te reta o naianei. Me taapiri noa ki te taapiri i maumaharahia e matou i te taahiraa 1. Ahakoa kaore matou i whakarereke i te piapa, he kore te utu, no reira i mau tonu te hototahi ki te ASCII.

Waihoki mo nga waehere me 3 paita:

  1. E toru paita 110yyyyy yxxxxxxx xxxxxxxx tohu tohu me te tau yyyyyy yxxxxxxx xxxxxxxx, huri reta o naianei i runga i yyyyyy y0000000 00000000 (i maumahara ki nga mea katoa engari ko nga teina 15 bit), ka taki i te pouaka kei roto tatou inaianei roa aratau (i te huri i te piapa ki te paita-rua, ka tautuhi ano i tenei haki);
  2. E rua paita 0xxxxxxx xxxxxxxx i roto i te aratau roa ko te ahua o te reta o naianei. Waihoki, ka taapirihia e matou me te taapiri mai i te taahiraa 1. Ko te rereketanga anake ko te korero inaianei e rua nga paita (na te mea kua huri matou ki tenei aratau).

He pai te oro: inaianei me whakauru tatou i nga tohu mai i te awhe Waehereao moka-7, ka moumou tatou i te 1 paita atu i te timatanga me te katoa o te paita mo ia ahua.

Ko tetahi atu paihikara: ka penapenahia e matou nga aho Unicode 30-60% atu kiato atu i te UTF-8
Mahi mai i tetahi o nga putanga o mua. He maha nga wa ka whiua te UTF-8, engari he waahi tonu hei whakapai ake.

He aha te mea kino? Tuatahi, he tikanga ta tatou, ara whitinga reta o naianei me te pouakataki aratau roa. Na tenei ka whakawhäiti i a mätou: inäianei ka taea te whakawaehere rereke nga momo tohu i roto i nga horopaki rereke. Ko te rapu mo nga aho-roto, hei tauira, me whai whakaaro ki tenei, kaua ma te whakataurite noa i nga paita. Tuarua, no te huringa o te reta, kua kino te whakawaehere o nga tohu ASCII (ehara tenei ko te reta Latin anake, engari ko nga tohu tohu, tae atu ki nga waahi) - me huri ano te reta ki te 0, ara, he paita atu ano (katahi ano ka hoki ano ki to maatau kaupapa matua).

He pai te reta kotahi, he pai ake te rua

Me ngana tatou ki te whakarereke i a maatau moka moka, ka kohia tetahi atu ki nga mea e toru kua whakaahuahia i runga ake nei:

0xxxxxxx — 1 paita i roto i te aratau noa, 2 i te aratau roa
11xxxxxx — 1 paita
100xxxxx xxxxxxxx - 2 paita
101xxxxx xxxxxxxx xxxxxxxx - 3 paita

Ko tetahi atu paihikara: ka penapenahia e matou nga aho Unicode 30-60% atu kiato atu i te UTF-8

Inaianei kei roto i te rekoata rua-paita he iti ake te moka e waatea ana - nga tohu tohu ki runga 0x1FFFa kaore 0x3FFF. Heoi ano, he nui ake i nga waehere UTF-8 paita-rua, ko te nuinga o nga reo ka uru tonu ki roto, ko te mate tino kitea kua hinga. korero korero и katakana, kei te pouri nga Hapanihi.

He aha tenei waehere hou? 11xxxxxx? He iti tenei "puu" o te 64 nga tohu te rahi, ka whakakiia ta maatau reta matua, no reira ka kiia e au he awhina (hūtūanga) piapa. Ina huri tatou i te reta o naianei, ka noho awhina tetahi waahanga o te reta tawhito. Hei tauira, i huri matou mai i te ASCII ki te Cyrillic - he 64 nga tohu kei roto Te reta Raina, nga nama, te mokowā me te piko (te nuinga o nga whakaurunga ki nga tuhinga kore-ASCII). Whakahokia ki te ASCII - a ko te waahanga matua o te reta a Cyrillic ka noho hei reta awhina.

He mihi ki te uru atu ki nga reta e rua, ka taea e matou te hapai i te maha o nga tuhinga me te iti o nga utu mo te huri i nga reta (ko te tohu tohu ka hoki mai ki te ASCII, engari i muri i tera ka whiwhi tatou i te maha o nga tohu ASCII-kore mai i te taapiri taapiri, kaore he ka huri ano).

Takoha: whakamuamua i te reta-iti 11xxxxxx me te kowhiri i tana whitinga tuatahi 0xC0, ka whiwhi tatou i te hototahi wahanga ki te CP1252. Arā, he maha (engari ehara i te katoa) nga tuhinga a te Pakeha o te Tai Hauauru kua whakawaeheretia ki te CP1252 ka rite te ahua ki UTF-C.

I konei, heoi, ka puta ake he uaua: me pehea te whiwhi awhina mai i te reta matua? Ka taea e koe te waiho i taua waahi, engari - aue - kei konei kei te takaro tonu te hanganga Unicode ki a tatou. I te nuinga o nga wa ko te waahanga matua o te reta kaore i te timatanga o te poraka (hei tauira, ko te whakapaipai o Ruhia "A" kei a ia te waehere 0x0410, ahakoa ka timata te poraka Cyrillic ki 0x0400). No reira, i te tango i nga tohu tuatahi e 64 ki roto i te putunga, ka ngaro pea te uru ki te waahanga hiku o te reta.

Hei whakatika i tenei raru, i haere ahau ki etahi poraka e pa ana ki nga reo rereke, ka tohua te taapiri o te reta awhina i roto i te mea matua mo ratou. Ko te reta Raina, he mea rereke, he mea whakarite ano kia rite ki te base64.

Ko tetahi atu paihikara: ka penapenahia e matou nga aho Unicode 30-60% atu kiato atu i te UTF-8

Nga pa whakamutunga

Ka mutu ka whakaaro tatou ki hea ka taea e tatou te whakapai ake i tetahi mea.

Kia mahara ko te whakatakotoranga 101xxxxx xxxxxxxx xxxxxxxx ka taea e koe te whakawaehere tau ki runga 0x1FFFFF, ka mutu te Waehereao i mua, i te 0x10FFFF. Arā, ka tohuhia te tohu waehere whakamutunga hei 10110000 11111111 11111111. No reira, ka taea te kii mena ko te paita tuatahi o te ahua 1011xxxx (Kei hea xxxx nui ake i te 0), katahi ano te tikanga. Hei tauira, ka taea e koe te taapiri i etahi atu tohu 15 kei reira e waatea ana mo te whakawaehere i te paita kotahi, engari i whakatau ahau ki te mahi rereke.

Me titiro ki era poraka Unicode e toru nga paita inaianei. Ko te tikanga, pera i te korero kua korerohia, he Hainamana enei - engari he uaua ki te mahi i tetahi mea ki a raatau, he 21 mano o ratou. Engari i rere ano te hiragana me te katakana ki reira - karekau i te maha rawa, iti iho i te rua rau. Na, i te mea i maumahara matou ki nga Hapanihi, he emojis ano (he marara ki nga waahi maha i te Unicode, engari ko nga poraka matua kei roto i te awhe. 0x1F300 - 0x1FBFF). Mena ka whakaarohia e koe inaianei kei reira nga emojis kua kohia mai i nga tohu maha i te wa kotahi (hei tauira, te emoji ‍‍‍Ko tetahi atu paihikara: ka penapenahia e matou nga aho Unicode 30-60% atu kiato atu i te UTF-8 Kei roto i te 7 nga waehere!), katahi ka tino whakama ki te whakapau i nga paita e toru mo ia (7×3 = 21 paita mo te whakaaro o te ata kotahi, he moemoea).

Na reira, ka tohua e matou etahi awhe kua kowhiria e rite ana ki te emoji, te hiragana me te katakana, ka tatau ano ki te rarangi kotahi tonu ka whakawaehere hei rua paita hei utu mo te toru:

1011xxxx xxxxxxxx

He pai: ko te emoji kua whakahuahia ake neiKo tetahi atu paihikara: ka penapenahia e matou nga aho Unicode 30-60% atu kiato atu i te UTF-8, e 7 nga tohu tohu, e 8 nga paita i roto i te UTF-25, ka uru ki roto 14 (e rua nga paita mo ia tohu tohu). Ma te ara, kaore a Habr i pai ki te keri i a ia (i roto i te tawhito me te kaituhi hou), na me whakauru e ahau ki te pikitia.

Kia tamata tatou ki te whakatika i tetahi atu raruraru. I a tatou e mahara ana, ko te reta matua te tikanga teitei 6 moka, ka mau tonu ki roto i te hinengaro ka whakapiri ki te waehere o ia tohu wetewete e whai ake nei. I roto i te take o nga tohu Hainamana kei roto i te poraka 0x4E00 - 0x9FFF, he moka 0, he 1 ranei. Ehara tenei i te mea tino watea: me huri tonu tatou i te reta i waenga i enei uara e rua (ara e toru nga paita). Engari kia mahara kei roto i te aratau roa, mai i te waehere ake ka taea e tatou te tango i te maha o nga tohu ka whakawaeheretia e tatou ma te whakamahi i te aratau poto (i muri i nga mahi tinihanga katoa i whakaahuahia i runga ake nei, ko te 10240 tenei) - katahi ka huri te awhe o nga hieroglyphs ki 0x2600 - 0x77FF, a, i roto i tenei keehi, puta noa i tenei awhe katoa, ko nga moka 6 tino nui (i roto i te 21) ka rite ki te 0. Na, ka whakamahia e nga raupapa o nga tohurangi e rua nga paita mo ia hieroglyph (he mea tino pai mo taua awhe nui), kaore he ka puta nga huringa reta.

Nga otinga rereke: SCSU, BOCU-1

Ko nga tohunga Unicode, katahi ano ka panui i te taitara o te tuhinga, ka tere ki te whakamahara ki a koe kei roto tonu i nga paerewa Unicode. Kaupapa Kōpeketanga Paerewa mo te Waehereao (SCSU), e whakaahua ana i tetahi tikanga whakawaehere he rite tonu ki tera i whakaahuatia i roto i te tuhinga.

He pono taku whakaae: I ako ahau mo tona oranga i muri i taku ruku hohonu ki te tuhi i taku whakatau. Mena i mohio ahau mai i te timatanga, tera pea ka ngana ahau ki te tuhi i tetahi whakatinanatanga, kaua ki te whai ake i taku ake huarahi.

Ko te mea whakamere ko te whakamahi a SCSU i nga whakaaro tino rite ki era i puta mai i ahau ake (hei utu mo te kaupapa o te "alphabets" ka whakamahia e ratou "matapihi", a he maha ake o raatau e waatea ana i a au). I te wa ano, he ngoikoretanga ano tenei whakatakotoranga: he tata ake ki nga algorithms kōpeketanga atu i nga mea whakawaehere. Ina koa, he maha nga tikanga whakaatu a te paerewa, engari kaore e kii me pehea te whiriwhiri i te mea tino pai - mo tenei, me whakamahi te encoder etahi momo heuristics. No reira, ko te encoder SCSU e whakaputa ana i nga kohinga pai ka nui ake te uaua me te uaua atu i taku algorithm.

Hei whakatairite, i whakawhitia e ahau tetahi whakatinanatanga ngawari o te SCSU ki te JavaScript - i runga i te rahinga o te waehere ka puta he rite ki taku UTF-C, engari i etahi wa he tekau paiheneti te kino o te hua (i etahi wa ka nui ake, engari kaore i te nui). Hei tauira, ko nga tuhinga i te reo Hiperu me te Kariki i whakawaeheretia e UTF-C 60% pai ake i te SCSU (e tika ana pea na o ratou reta kiato).

Ka wehea, ka taapiri atu ahau i tua atu i te SCSU kei reira ano tetahi atu huarahi hei tohu i a Unicode - BOCU-1, engari ko te whainga mo te hototahi MIME (kaore i hiahiatia e au) me te tango i tetahi huarahi rereke ki te whakawaehere. Kaore au i te aromatawai i tona whai huatanga, engari ki taku whakaaro kaore pea he teitei ake i te SCSU.

Nga whakapainga pea

Ko te algorithm i whakaatuhia e au ehara i te mea mo te ao katoa na te hoahoa (koinei pea aku whainga ka rereke te nuinga mai i nga whaainga o te Unicode Consortium). Kua korero ake ahau i whakawhanakehia mo te mahi kotahi (te rongoa i te papakupu reo maha i roto i te rakau prefix), a ko etahi o ona ahuatanga kaore pea i te pai mo etahi atu mahi. Engari ko te mea ehara i te paerewa ka taea te taapiri - ka taea e koe te whakarereke kia rite ki o hiahia.

Hei tauira, ma te maarama ka taea e koe te whakakore i te noho mai o te kawanatanga, hanga tohu kore-kore - kaua e whakahou i nga taurangi. offs, auxOffs и is21Bit i roto i te encoder me te wetewaehere. I tenei keehi, kare e taea te whakahiato i nga raupapa o nga tohu o te piapa kotahi, engari ka puta he kupu taurangi ka whakawaeherehia taua ahua ki nga paita kotahi, ahakoa te horopaki.

I tua atu, ka taea e koe te whakarite i te encoder ki tetahi reo motuhake ma te huri i te ahua taunoa - hei tauira, te arotahi ki nga tuhinga a Ruhia, tautuhi i te encoder me te decoder i te timatanga offs = 0x0400 и auxOffs = 0. He tino whai tikanga tenei mo te ahua kore whenua. I te nuinga, ka rite tenei ki te whakamahi i te whakawaehere moka-waru tawhito, engari me te kore e tango i te kaha ki te whakauru i nga tohu mai i nga Waehereao katoa ina hiahiatia.

Ko tetahi atu ngoikoretanga i whakahuahia i mua ake nei ko te mea i roto i nga tuhinga nui kua whakawaeheretia ki te UTF-C karekau he huarahi tere ki te kimi i te rohenga ahua e tata ana ki te paita noho noa. Mena ka tapahia e koe te mea whakamutunga, me kii, 100 paita mai i te kaitarai kua whakawaeheretia, ka tupono koe ki te whiwhi para karekau e taea e koe te mahi. Ko te whakawaehere kaore i hangaia mo te penapena i nga raarangi maha-kipaita, engari i te nuinga o te waa ka taea te whakatika. Paita 0xBF kaua rawa e puta hei paita tuatahi (engari ko te tuarua, tuatoru ranei). Na reira, ka whakawaeheretia, ka taea e koe te whakauru i te raupapa 0xBF 0xBF 0xBF ia, me kii, 10 KB - na, ki te hiahia koe ki te rapu rohe, ka nui ki te matawai i te waahanga kua tohua kia kitea ra ano he tohu rite. I muri i te whakamutunga 0xBF kua whakapumautia ko te timatanga o te ahua. (I te wa e wetewete ana, ko tenei raupapa o nga paita e toru, me waiho noa.)

Hei whakariterite

Mena kua panui koe i tenei tawhiti, tena koe! Ko taku tumanako i ako koe, penei i ahau, i tetahi mea hou (he whakamaumahara ranei i to mahara) mo te hanganga o Unicode.

Ko tetahi atu paihikara: ka penapenahia e matou nga aho Unicode 30-60% atu kiato atu i te UTF-8
Whārangi whakaaturanga. Ko te tauira o te Hiperu e whakaatu ana i nga painga mo te UTF-8 me te SCSU.

Ko nga rangahau kua whakaahuatia ake nei kaua e kiia he pokanoa ki nga paerewa. Heoi, i te nuinga o te wa ka makona ahau ki nga hua o aku mahi, no reira kei te harikoa ahau ki a raatau tohatoha: hei tauira, he 1710 paita noa te taumaha o te whare pukapuka JS iti (a karekau he herenga, o te akoranga). Ka rite ki taku korero i runga ake nei, ka kitea ana mahi i whārangi demo (kei kona ano he huinga tuhinga ka taea te whakataurite ki te UTF-8 me te SCSU).

Ka mutu, ka aro ano ahau ki nga keehi e whakamahia ana te UTF-C kaore e pai ana:

  • Mēnā he roa rawa ō rārangi (mai i te 100-200 pūāhua). I roto i tenei take, me whakaaro koe mo te whakamahi i nga algorithms kōpeketanga penei i te deflate.
  • Ki te hiahia koe Puataata ASCII, ara, he mea nui ki a koe ko nga raupapa kua whakawaeheretia kaore he waehere ASCII karekau i roto i te aho taketake. Ko te hiahia mo tenei ka taea te karo mena, i te wa e pahekoheko ana me nga API tuatoru (hei tauira, te mahi me te putunga raraunga), ka tukuna e koe te hua whakawaehere hei huinga paita waitara, kaua hei aho. Ki te kore, ka tupono koe ki te whiwhi whakaraeraetanga ohorere.
  • Mena kei te pirangi koe ki te rapu tere i nga rohenga o te ahua i runga i te waahi whakatiki (hei tauira, ka pakaru tetahi waahanga o te raina). Ka taea tenei, engari ma te matawai i te raina mai i te timatanga (ma te whakamahi ranei i te whakarereketanga i whakaahuatia i te waahanga o mua).
  • Mena ka hiahia koe ki te mahi tere i runga i nga ihirangi o nga aho (whakaritea, rapuhia nga aho iti ki roto, whakakotahi). Me wetewetehia nga aho i te tuatahi, no reira ka puhoi ake a UTF-C i te UTF-8 i roto i enei keehi (engari he tere ake i nga algorithms kōpeketanga). I te mea he rite tonu te whakawaehere i te aho kotahi, kaore e hiahiatia te whakataurite tika o te wetewaehere, ka taea te mahi i runga i te paita-a-paita.

whakahou: te kaiwhakamahi Tiomitch i roto i nga korero i raro nei i whakairihia he kauwhata e whakaatu ana i nga tepe o te UTF-C. E whakaatu ana he pai ake te UTF-C i te hātepe hātepe kōpeke-whānui (he rerekētanga o te LZW) mena he poto ake te aho kapi. ~140 pūāhua (Heoi, ka kite ahau i mahia te whakataurite i runga i tetahi tuhinga; mo etahi atu reo ka rereke nga hua).
Ko tetahi atu paihikara: ka penapenahia e matou nga aho Unicode 30-60% atu kiato atu i te UTF-8

Source: will.com

Tāpiri i te kōrero