Baaskiil kale: waxaanu ku kaydinnaa xadhkaha Unicode 30-60% in ka badan UTF-8

Baaskiil kale: waxaanu ku kaydinnaa xadhkaha Unicode 30-60% in ka badan UTF-8

Haddii aad tahay horumariye oo aad la kulanto hawsha doorashada cod-bixinta, markaa Unicode waxay had iyo jeer ahaan doontaa xalka saxda ah. Habka matalaadda gaarka ah waxay ku xiran tahay macnaha guud, laakiin inta badan waxaa jira jawaab caalami ah halkan sidoo kale - UTF-8. Waxa ugu wanaagsan ee ku saabsan waa inay kuu ogolaato inaad isticmaasho dhammaan xuruufta Unicode adigoon kharash bixin aad u badan bytes badan inta badan kiisaska. Run, luqadaha isticmaala wax ka badan alifbeetada Laatiinka, "ma badna" ugu yaraan laba bytes halkii qof. Ma samayn karnaa si ka sii wanaagsan innagoo aan ku soo laabanin codaynta taariikhda hore ee nagu xaddiday 256 xaraf oo diyaar ah?

Hoos waxaan soo jeedinayaa inaad barato naftaada iskudaydayda ah inaan ka jawaabo su'aashan oo aan hirgeliyo algorithm fudud oo kuu oggolaanaya inaad ku kaydiso khadadka inta badan luqadaha adduunka adigoon ku darin dib-u-celinta ku jirta UTF-8.

Afeef. Isla markiiba waxaan samayn doonaa boos celin muhiim ah: Xalka lagu sharraxay looma soo bandhigin beddelka caalamiga ah ee UTF-8, waxay ku haboon tahay oo kaliya liiska kiisas cidhiidhi ah (wax badan oo iyaga ka hooseeya), iyo xaalad kasta waa in loo isticmaalo in lala falgalo API-yada dhinac saddexaad (kuwaas oo aan xitaa ogeyn). Inta badan, algorithms isku-buufinta guud-ujeeddada (tusaale, deflate) waxay ku habboon yihiin kaydinta cufan ee tiro badan oo xogta qoraalka ah. Intaa waxaa dheer, mar horeba habka abuurista xalkeyga, waxaan ka helay halbeeg jira Unicode laftiisa, kaas oo xalliya isla dhibaatada - waa xoogaa ka sii adag (iyo inta badan ka sii xun), laakiin weli waa heer la aqbali karo, oo aan kaliya la dhigin. wada jilibka. isagana waan kuu sheegi doonaa.

Ku saabsan Unicode iyo UTF-8

Si aan ku bilaabo, ereyo kooban oo ku saabsan waxa ay tahay Unicode и UTF-8.

Sidaad ogtahay, 8-bit codeings ayaa caan ahaa. Iyaga, wax walbaa way fududaayeen: 256 xaraf ayaa lagu tirin karaa nambarada laga bilaabo 0 ilaa 255, tirooyinka 0 ilaa 255 waxay si cad ugu muuqan karaan hal byte. Haddii aan ku laabano bilowgii hore, ASCII encoding-ka gabi ahaanba waa ku xaddidan yahay 7 bits, sidaa darteed qaybta ugu muhiimsan ee matalaaddeeda byte waa eber, badi 8-bit codes-yada ayaa la jaan qaadaya (waxay ku kala duwan yihiin oo keliya "sare" qayb, meesha ugu muhiimsan waa hal).

Sidee buu Unicode uga duwan yahay cod-bixinahaas iyo sababta wakiillo badan oo gaar ah loogu xidhay - UTF-8, UTF-16 (BE iyo LE), UTF-32? Aynu u kala horrayno.

Halbeegga Unicode ee aasaasiga ahi waxa uu qeexayaa oo keliya xidhiidhka u dhexeeya xarfaha (iyo xaaladaha qaarkood, qaybaha gaarka ah ee jilayaasha) iyo lambaradooda. Waxaana jira tiro badan oo suurtagal ah oo ku jira heerkan - laga bilaabo 0x00 si ay u 0x10FFFF (1 xabbo). Haddii aan rabno in aan tiro ku dhejino kala duwanaanshahan oo kale doorsoome, 114 ama 112 bytes midna naguma filna. Maaddaama ay soo-saareyaasheenna aan loogu talagelin inay ku shaqeeyaan lambarro saddex-byte ah, waxaa nalagu khasbi lahaa inaan isticmaalno illaa 1 byte qof kasta! Tani waa UTF-2, laakiin waa si sax ah sababtoo ah "qashin-qashin" in qaabkani aanu caan ahayn.

Nasiib wanaag, siday u kala horreeyaan jilayaasha Unicode ma aha rankh. Dhammaantood waxay u qaybsan yihiin 17 "diyaaradoMid kasta oo ka mid ah wuxuu ka kooban yahay 655360x10000) "dhibcood code" Fikradda "code point" halkan waa mid fudud nambarka jilaha, oo ay u xilsaartay Unicode. Laakiin, sida kor ku xusan, Unicode ma aha oo kaliya xarfo gaar ah oo la tiriyey, laakiin sidoo kale qaybahooda iyo calaamadaha adeegga (mararka qaarkoodna waxna kama dhigna lambarka - laga yaabee wakhtigan, laakiin annaga tani maaha mid muhiim ah) Way fiicantahay inaad had iyo jeer si gaar ah uga hadasho tirada tirooyinka laftooda, ee ha ka hadlin calaamadaha. Si kastaba ha ahaatee, kuwan soo socda, si kooban, waxaan inta badan isticmaali doonaa ereyga "calaamadaha", oo tilmaamaya ereyga "code point".

Baaskiil kale: waxaanu ku kaydinnaa xadhkaha Unicode 30-60% in ka badan UTF-8
Diyaaradaha Unicode. Sida aad arki karto, inteeda badan (diyaaradaha 4 ilaa 13) weli lama isticmaalin.

Waxa ugu cajiibsan waa in dhammaan "qasarka" ugu weyn ay ku jiraan diyaaradda eber, waxaa loo yaqaan 'Diyaarada Aasaaska ee Luuqadaha BadanHaddii xariiqdu ka kooban tahay qoraal ku qoran luqadaha casriga ah ee mid ka mid ah (oo ay ku jiraan Shiinaha), kama gudbi doontid diyaaraddan. Laakin ma jari kartid Unicode inteeda kale midkood - tusaale ahaan, emoji waxay inta badan ku yaalaan dhamaadka diyaaradda soo socota,"Diyaarada Luqadaha Badan ee Dheeraadka ah"(waxay ka socotaa 0x10000 si ay u 0x1FFFF). Markaa UTF-16 sidan ayay yeelaysaa: dhammaan jilayaasha ayaa ku dhex dhacaya Diyaarada Aasaaska ee Luuqadaha Badan, waxaa lagu dhejiyay "sida uu yahay" oo leh nambar laba-byte ah oo u dhigma. Si kastaba ha noqotee, qaar ka mid ah tirooyinka kala duwani ma tilmaamayaan xarfo gaar ah gabi ahaanba, laakiin waxay muujinayaan in labadan bytes ka dib aan u baahannahay inaan tixgelinno mid kale - iyadoo la isku darayo qiyamka afartan bytes, waxaan heleynaa tiro daboolaya. dhammaan noocyada Unicode ansax ah. Fikirkaan waxaa loo yaqaan "lammaanayaal ku-meel-gaar ah" -waxaa laga yaabaa inaad maqashay iyaga.

Markaa UTF-16 waxay u baahan tahay laba ama (xaalad aad dhif u ah) afar bytes halkii "code point". Tani way ka fiican tahay isticmaalka afar bytes mar kasta, laakiin Laatiinka (iyo xarfaha kale ee ASCII) marka habkan lagu dhejiyo waxay lumisaa booska kala badh eber. UTF-8 waxaa loogu talagalay in lagu saxo tan: ASCII waxay ku jirtaa, sidii hore, kaliya hal byte; codes ka 0x80 si ay u 0x7FF - laba bytes; ka 0x800 si ay u 0xFFFF - saddex, iyo ka 0x10000 si ay u 0x10FFFF - afar. Dhinaca kale, alifbeetada Laatiinka ayaa noqotay mid wanaagsan: waafaqsanaanta ASCII ayaa soo noqotay, qaybinta ayaa si siman u "fidisay" laga bilaabo 1 ilaa 4 bytes. Laakiin alifbeetada aan Laatiinka ahayn, hoogay, sinaba ugama faa'iidaystaan ​​marka loo eego UTF-16, qaar badanna hadda waxay u baahan yihiin saddex bytes halkii ay ka ahaan lahaayeen laba - tirada ay ku jiraan rikoodhka laba-byte ayaa hoos u dhacay 32 jeer, iyadoo 0xFFFF si ay u 0x7FF, iyo Shiine ama, tusaale ahaan, Joorjiyaanka kuma jiraan. Cyrillic iyo shan xaraf oo kale - hurray - nasiib badan, 2 bytes halkii qofba.

Maxay tani u dhacdaa? Aynu aragno sida UTF-8 u matalo summada xarfaha:
Baaskiil kale: waxaanu ku kaydinnaa xadhkaha Unicode 30-60% in ka badan UTF-8
Si toos ah si loo matalo tirooyinka, xoogaa yar oo calaamada ku calaamadsan ayaa halkan lagu isticmaalaa x. Waxaa la arki karaa in diiwaanka laba-byte-ka ah ay ku jiraan 11 oo kaliya (oo ka baxsan 16). Qaybaha hormoodka ah halkan waxay leeyihiin oo kaliya shaqo caawiye. Marka la eego diiwaanka afar-byte, 21 ka mid ah 32-bit ayaa loo qoondeeyay lambarka dhibcaha code - waxay u egtahay in saddex bytes (oo bixiya wadarta 24-bits) ay ku filan yihiin, laakiin calaamadaha adeegyadu waxay cunaan wax badan.

Tani ma xun tahay? Runtii maaha. Dhinaca kale, haddii aan aad u daryeelno meel bannaan, waxaan leenahay algorithms cadaadis ah oo si fudud u baabi'in kara dhammaan entropy dheeraadka ah iyo dib-u-celinta. Dhanka kale, hadafka Unicode wuxuu ahaa in la bixiyo koodka caalamiga ah ee suurtogalka ah. Tusaale ahaan, waxaan ku aamini karnaa xariiq ku qoran UTF-8 si loo codeeyo oo horey ula shaqeeyay ASCII oo keliya, oo ha ka baqin inay arki doonto jilaa ka soo jeeda ASCII oo dhab ahaantii aan halkaas joogin (ka dib oo dhan, UTF-8 dhammaan bytes ka bilaabma eber - tani waa dhab ahaan waxa ASCII yahay). Oo haddii aan si lama filaan ah u rabno inaan ka jarno dabo yar oo xarig weyn ah iyada oo aan la dejineynin bilowgii hore (ama dib u soo celin qayb ka mid ah macluumaadka ka dib qaybta dhaawacan), way noo fududahay in aan helno meesha uu ka bilaabmayo dabeecadda (waa ku filan tahay). si aad uga gudubto bytes leh xoogaa horgale ah 10).

Maxaa haddaba wax cusub u hindisay?

Isla mar ahaantaana, waxaa jira xaalado marmar ah marka algorithms-ka cadaadiska sida deflate ay si liidata loo dabaqi karo, laakiin waxaad dooneysaa inaad gaarto kaydinta xargaha. Shakhsi ahaan, waxaan la kulmay dhibaatadan markii aan ka fekerayay dhismaha geed horgale cufan qaamuus weyn oo ay ku jiraan erayo ku qoran luqado aan sabab lahayn. Dhinaca kale, erey kastaa aad buu u gaaban yahay, markaa isku-buufintu waxay noqon doontaa mid aan waxtar lahayn. Dhanka kale, hirgelinta geedka aan tixgaliyay waxaa loo qaabeeyey si byte kasta oo ka mid ah xadhkaha kaydsan uu soo saaro vertex geed gooni ah, sidaas darteed yaraynta tiradooda waxay ahayd mid faa'iido leh. Maktabadayda dhexdeeda Az.js (Sida in pymorphy2, taas oo ay ku saleysan tahay) dhibaato la mid ah ayaa lagu xallin karaa si fudud - xargaha la isku daray DAWG-qaamuus, ku kaydsan halkaas wanaagsan jir ah CP1251. Laakiin, sida ay fududahay in la fahmo, tani waxay si fiican u shaqeysaa oo keliya alifbeetada xaddidan - xariiq Shiinees ah laguma dari karo qaamuuska noocaas ah.

Si gooni ah, waxaan jeclaan lahaa inaan xuso hal nuance kale oo aan fiicneyn oo soo ifbaxa marka la isticmaalayo UTF-8 qaab dhismeedka xogtan ah. Sawirka kore wuxuu muujinayaa in jilaa marka loo qoro laba bytes, in tirada la xiriirta nambarkiisa aysan ku imaanin isku xigta, laakiin ay kala soocaan labo xabbo. 10 dhexe ee: 110xxxxx 10xxxxxx. Sababtan awgeed, marka 6-bit ee hoose ee byte-ka labaad ay ku soo qulqulaan koodka dabeecadda (ie, kala-guur ayaa dhacaya. 1011111110000000), ka dibna byte ugu horeysay sidoo kale isbedel. Waxaa soo baxday in xarafka "p" lagu tilmaamay bytes 0xD0 0xBF, iyo "r" xiga waa horeba 0xD1 0x80. Geedka horgalayaasha, tani waxay keenaysaa kala qaybinta noodhka waalidka oo laba u kala baxa - mid horgale ah 0xD0, iyo mid kale oo loogu talagalay 0xD1 (in kasta oo dhammaan alifbeetada Cyrillic lagu kaydin karo byte labaad oo keliya).

Maxaan helay

Aniga oo dhibaatadan la kulmay, waxaan go'aansaday inaan ku celceliyo ku ciyaarista ciyaaraha, isla markaasna aan si fiican u barto qaabka Unicode guud ahaan. Natiijadu waxay ahayd qaabka codaynta UTF-C ("C" ee isafgaradka), kaas oo ku baxa wax aan ka badnayn 3 bytes halkii dhibic code, oo inta badan kuu ogolaanaya inaad kaliya kharash garayso hal byte dheeraad ah oo loogu talagalay dhammaan khadka la calaamadeeyay. Tani waxay horseedaysaa xaqiiqda ah in xarfaha badan ee aan ASCII ahayn sida codaynta ay u noqoto 30-60% ka kooban UTF-8.

Waxaan soo bandhigay tusaalooyin ku saabsan hirgelinta codaynta iyo dejinta algorithms qaab ahaan JavaScript iyo Go maktabadaha, waxaad si xor ah ugu isticmaali kartaa koodhkaaga. Laakiin waxaan wali ku nuuxnuuxsan doonaa in dareen ahaan qaabkani uu ahaanayo "baaskiil", kuma talinayo in la isticmaalo adigoon garanayn sababta aad ugu baahan tahay. Tani wali waa tijaabo ka badan "hagaajinta UTF-8" halis ah. Si kastaba ha ahaatee, koodka halkaas ku yaal ayaa si habsami leh u qoran, si kooban, oo leh tiro badan oo faallooyin ah iyo caymiska tijaabada ah.

Baaskiil kale: waxaanu ku kaydinnaa xadhkaha Unicode 30-60% in ka badan UTF-8
Natiijooyinka tijaabada iyo isbarbardhigga UTF-8

sidoo kale waan sameeyay bogga demo, halkaas oo aad ku qiimeyn karto waxqabadka algorithm, ka dibna waxaan kuu sheegi doonaa wax badan oo ku saabsan mabaadi'da iyo habka horumarinta.

Ciribtirka qashinka aan badnayn

Waxaan u qaatay UTF-8 saldhig ahaan, dabcan. Waxa ugu horreeya uguna cad ee lagu beddeli karo waa in la dhimo tirada adeegga ee byte kasta. Tusaale ahaan, byte ugu horreeya ee UTF-8 had iyo jeer waxay ku bilaabataa midkood 0, ama leh 11 - horgale 10 Kaliya bytes soo socda ayaa leh. Aan bedelno horgalayaasha 11 on 1, iyo bytes soo socda waxaan ka saari doonaa horgalayaasha gabi ahaanba. Maxaa dhici doona?

0xxxxxxx - 1 byte
10xxxxxx xxxxxxxx - 2 bytes
110xxxxx xxxxxxxx xxxxxxxx - 3 bytes

Sug, meeday diiwaanka afarta-byte? Laakiin hadda looma baahna - marka wax lagu qorayo saddex bytes, waxaan hadda haysanaa 21 bits taas oo ku filan dhammaan tirooyinka ilaa 0x10FFFF.

Maxaan halkan ku hurnay? Waxa ugu muhiimsan waa ogaanshaha xudduudaha dabeecadda laga soo bilaabo meel aan sabab lahayn oo ku taal kaydka. Ma tilmaami karno byte gardaran oo aan ka heli karno bilawga jilaha xiga. Tani waa xaddidaadda qaabkayaga, laakiin ficil ahaan tani waa dhif lagama maarmaan. Caadi ahaan waxaan awoodnaa inaan ka gudubno baqshadda bilowga hore (gaar ahaan marka ay timaado khadadka gaaban).

Xaaladda daboolida luqadaha 2 bytes ayaa sidoo kale noqotay mid ka sii wanaagsan: hadda qaabka laba-byte wuxuu bixiyaa tiro dhan 14 bits, kuwanuna waa codes ilaa 0x3FFF. Shiinuhu waa nasiib darro (jilaagoodu inta badan way ka kala duwan yihiin 0x4E00 si ay u 0x9FFF), laakiin Georgians iyo dadyow kale oo badan ayaa aad u xiiso badan - luqadahooda sidoo kale waxay ku habboon yihiin 2 bytes halkii qofba.

Geli gobolka codeeyaha

Aynu hadda ka fikirno sifooyinka xadadka laftooda. Qaamuusku wuxuu inta badan ka kooban yahay kelmado ku qoran xarfo isku mid ah, tani waxay sidoo kale run u tahay qoraallo kale oo badan. Way fiicnaan lahayd in la tilmaansado alifbeetada hal mar, ka dibna la tilmaano oo keliya tirada xarafka ku jira. Aynu eegno haddii habaynta jilayaasha miiska Unicode ay ina caawin doonto.

Sida kor ku xusan, Unicode waxay u qaybsantaa diyaarad 65536 code midkiiba. Laakiin tani maaha qayb aad u faa'iido badan (sida horeba loo sheegay, inta badan waxaan ku jirnaa diyaaradda eber). Xiiso badan ayaa ah kala qaybinta by blocks Qeybahani ma laha dherer go'an, oo macno badan leh - sida caadiga ah, mid kastaa wuxuu isku daraa jilayaal isku mid ah.

Baaskiil kale: waxaanu ku kaydinnaa xadhkaha Unicode 30-60% in ka badan UTF-8
Qayb ka kooban xarfaha alifbeetada Bengali. Nasiib darro, sababo taariikheed dartood, tani waa tusaale baakad aad u cufan - 96 xaraf ayaa si fowdo ah u kala firdhiyey 128 dhibcood oo kood ah.

Bilawga baloogyada iyo cabbirkoodu had iyo jeer waa dhufasho 16 - tan waxaa loo sameeyaa si fudud. Intaa waxaa dheer, baloogyo badan ayaa bilaaba oo ku dhameeya qiimaha kuwaas oo ah 128 ama xitaa 256 - tusaale ahaan, alifbeetada Cyrillic ee aasaasiga ah waxay ka qaadataa 256 bytes 0x0400 si ay u 0x04FF. Tani waa mid ku habboon: haddii aan kaydinno horgalayaasha hal mar 0x04, markaas qof kasta oo Cyrillic ah waxaa lagu qori karaa hal byte. Run, habkan waxaan lumin doonaa fursadda aan ugu laabano ASCII (iyo jilayaasha kale guud ahaan). Sidaa darteed waxaanu samaynaa sidan:

  1. Laba bytes 10yyyyyy yxxxxxxx kaliya ma tilmaamayso calaamad nambar leh yyyyyy yxxxxxxx, laakiin sidoo kale isbedel alifbeetada hadda jirta on yyyyyy y0000000 (yacni waxaan xasuusannaa dhammaan qaybaha marka laga reebo kuwa ugu muhiimsan 7 xoogaa);
  2. Hal byte 0xxxxxxx Tani waa dabeecadda alifbeetada hadda. Waxa kaliya oo ay u baahan tahay in lagu daro kabkii aan ku xasuusanay tilaabada 1. In kasta oo aynaan bedelin alifbeetada, dhimashadu waa eber, sidaa awgeed waxaanu ilaalinay la jaanqaadka ASCII.

Sidoo kale codes u baahan 3 bytes:

  1. Saddex bytes 110yyyyy yxxxxxxx xxxxxxxx Tilmaan calaamad leh nambar yyyyyy yxxxxxxx xxxxxxxx, isbedel alifbeetada hadda jirta on yyyyyy y0000000 00000000 (wax walba xasuusteen marka laga reebo kuwa yaryar 15 xoogaa), oo calaamadee sanduuqa aan hadda ku jirno dheer qaabka (marka loo beddelo alifbeetada mid laba-byte ah, waxaan dib u dajin doonaa calankan);
  2. Laba bytes 0xxxxxxx xxxxxxxx qaabka dheer waa dabeecadda alifbeetada hadda jirta. Sidoo kale, waxaan ku darnaa ka-dhaafitaanka laga bilaabo tallaabada 1. Farqiga kaliya ayaa ah in hadda aan akhrino laba bytes (maxaa yeelay waxaan u beddelnay qaabkan).

Waxay u egtahay mid wanaagsan: hadda iyadoo aan u baahanahay inaan codeeyno xarfaha isla 7-bit Unicode, waxaan qarash gareeynaa 1 byte dheeraad ah bilowga iyo wadarta hal byte xarafkiiba.

Baaskiil kale: waxaanu ku kaydinnaa xadhkaha Unicode 30-60% in ka badan UTF-8
Ka shaqaynta mid ka mid ah noocyadii hore. Waxay horeyba u garaacday UTF-8, laakiin weli waxaa jira meel lagu hagaajin karo.

Maxaa ka daran? Marka hore, waxaan leenahay shuruud, oo ah alifbeetada hadda jirta iyo sanduuqa hubinta hab dheer. Tani waxay sii xaddidaysaa: hadda jilayaasha isku midka ah ayaa si kala duwan loogu dhejin karaa xaalado kala duwan. Raadinta xargaha-hoosaadka, tusaale ahaan, waa in la sameeyaa iyada oo tan xisaabta lagu daro, ee maaha in la is barbar dhigo bytes. Marka labaad, isla markii aan bedelnay alifbeetada, waxay noqotay mid xun marka la dejiyo xarfaha ASCII (oo tani maahan alifbeetada Laatiinka oo keliya, laakiin sidoo kale xarakaynta aasaasiga ah, oo ay ku jiraan meelaha bannaan) - waxay u baahan yihiin beddelka alifbeetada mar kale 0, taas oo ah, mar labaad byte dheeraad ah (kadibna mid kale si aan ugu soo laabano qodobkeena ugu muhiimsan).

Hal xaraf ayaa wanaagsan, laba ayaa ka wanaagsan

Aan isku dayno inaan wax yar ka bedelno horgalayaashayada, anagoo mid kale ku tuujinayna saddexdan kor lagu tilmaamay:

0xxxxxxx - 1 byte ee qaabka caadiga ah, 2 qaab dheer
11xxxxxx - 1 byte
100xxxxx xxxxxxxx - 2 bytes
101xxxxx xxxxxxxx xxxxxxxx - 3 bytes

Baaskiil kale: waxaanu ku kaydinnaa xadhkaha Unicode 30-60% in ka badan UTF-8

Hadda diiwaanka laba-byte waxaa jira hal ka yar oo la heli karo - dhibcood code ilaa 0x1FFFiyo ma 0x3FFF. Si kastaba ha noqotee, wali waxay si muuqata uga weyn tahay labada-byte UTF-8 codes, luqadaha caadiga ah ayaa wali ku habboon, khasaaraha ugu badan ee la dareemi karo ayaa dhacay. hiragana и katakana, Jabbaanku way murugaysan yihiin.

Waa maxay koodkan cusub? 11xxxxxx? Kani waa mid yar oo ka kooban 64 xaraf oo cabbirkeedu yahay, waxa ay dhammaystiraysaa alifbeetadayada ugu weyn, sidaas darteed waxaan ugu yeedhay caawiye (kaalmeyn) alifbeetada. Marka aan beddelno alifbeetada hadda, qayb ka mid ah alifbeetada hore waxay noqonaysaa caawiye. Tusaale ahaan, waxaan ka soo wareegnay ASCII oo aan u wareegnay Cyrillic - kaydka hadda wuxuu ka kooban yahay 64 xaraf oo ka kooban Alifbeetada Laatiinka, nambarada, meel bannaan iyo comma (gelisyada soo noqnoqda ee qoraallada aan ASCII ahayn). Dib ugu laabo ASCII - oo qaybta ugu weyn ee alifbeetada Cyrillic waxay noqon doontaa alifbeetada caawisa.

Waad ku mahadsan tahay helitaanka laba xarfo, waxaan xakameyn karnaa tiro badan oo qoraallo ah oo leh kharashyada ugu yar ee beddelidda alifbeetada (xakamaynta waxay inta badan horseedi doontaa soo noqoshada ASCII, laakiin markaa ka dib waxaan heli doonnaa xarfo badan oo aan ASCII ahayn oo ka mid ah alifbeetada dheeraadka ah, iyada oo aan mar kale beddelidda).

Gunnada: horgalayaasha xarfaha hoose 11xxxxxx oo ay doorteen ka-faa'iidooyinkeeda ugu horreeya inay noqdaan 0xC0, Waxaan helnaa waafaqsanaanta qayb ahaan CP1252. Si kale haddii loo dhigo, qaar badan (laakiin aan ahayn dhammaan) qoraallada Galbeedka Yurub ee ku qoran CP1252 waxay u eegi doonaan isku mid UTF-C.

Si kastaba ha ahaatee, halkan, si kastaba ha ahaatee, dhibaato ayaa soo baxaysa: sida loo helo mid ka mid ah alifbeetada ugu muhiimsan? Waad ka tagi kartaa isla dhimis la mid ah, laakiin - hoogtay - halkan qaab dhismeedka Unicode ayaa mar hore nagu ciyaaraya. Inta badan qaybta ugu weyn ee alifbeetada ma aha bilowga block (tusaale ahaan, caasimadda Ruushka "A" ayaa leh koodka. 0x0410, inkasta oo block-ka Cyrillic uu ku bilaabmayo 0x0400). Markaa, annagoo 64-kii xaraf ee hore galnay xarfaha, waxa laga yaabaa inaan lumino qaybta dabada ee alifbeetada.

Si aan u xaliyo dhibaatadan, waxaan gacanta ku dhex maray qaybo u dhigma luuqado kala duwan, waxaanan ku caddeeyey meesha ay ka baxayaan alifbeetada kaalmaynta ee iyaga ugu muhiimsan. Alifbeetada Laatiinka, marka laga reebo, waxaa guud ahaan dib loo habeeyey sida base64.

Baaskiil kale: waxaanu ku kaydinnaa xadhkaha Unicode 30-60% in ka badan UTF-8

Taabashooyinka ugu dambeeya

Aan ugu dambeyntii ka fekerno meel kale oo aan wax ku hagaajin karno.

Ogow qaabkaas 101xxxxx xxxxxxxx xxxxxxxx waxay kuu ogolaanaysaa in aad code nambarada ilaa 0x1FFFFF, iyo Unicode waxay dhammaanaysaa goor hore, at 0x10FFFF. Si kale haddii loo dhigo, barta koodka ugu dambeeya ayaa loo matali doonaa sida 10110000 11111111 11111111. Sidaa darteed, waxaan dhihi karnaa in haddii byte ugu horeysay uu yahay qaabka 1011xxxx ( Halkee xxxx ka weyn 0), markaas macnaheedu waa wax kale. Tusaale ahaan, waxaad ku dari kartaa 15 xaraf oo kale oo si joogto ah loogu heli karo hal byte, laakiin waxaan go'aansaday inaan sameeyo si ka duwan.

Aynu eegno blocks Unicode ee u baahan saddex bytes hadda. Asal ahaan, sidii horeba loo sheegay, kuwanu waa jilayaasha Shiinaha - laakiin way adag tahay in la sameeyo iyaga, waxaa jira 21 kun oo iyaga ka mid ah. Laakiin hiragana iyo katakana sidoo kale halkaas ayay u duuleen - oo ma jiraan kuwo aad u badan oo iyaga ka mid ah, in ka yar laba boqol. Iyo, tan iyo markii aan xasuusannay Japanese-ka, waxaa sidoo kale jira emojis (dhab ahaantii, waxay ku kala firirsan yihiin meelo badan oo Unicode ah, laakiin qaybaha ugu muhiimsan ayaa ku jira xadka. 0x1F300 - 0x1FBFF). Haddii aad ka fikirto xaqiiqda in hadda ay jiraan emojis hal mar laga soo ururiyay dhowr qodob (tusaale ahaan, emoji-gaBaaskiil kale: waxaanu ku kaydinnaa xadhkaha Unicode 30-60% in ka badan UTF-8 wuxuu ka kooban yahay ilaa 7 codes!), Kadib waxay noqoneysaa ceeb buuxda inaad ku bixiso saddex bytes mid kasta (7 × 3 = 21 bytes aawadood hal icon, qarow).

Sidaa darteed, waxaanu dooranaa dhawr nooc oo la doortay oo u dhigma emoji, hiragana iyo katakana, ku celi hal liis oo joogto ah oo u codee sidii laba bytes halkii ay ka ahaan lahaayeen saddex:

1011xxxx xxxxxxxx

weyn: emoji-ga aan soo sheegnayBaaskiil kale: waxaanu ku kaydinnaa xadhkaha Unicode 30-60% in ka badan UTF-8, oo ka kooban 7 dhibcood kood, waxay ku qaadataa 8 bytes gudaha UTF-25, waana ku habboonnahay 14 (sida saxda ah laba bytes ee dhibic code kasta). Dhanka kale, Habr wuu diiday inuu dheefshiido (kuwa hore iyo tifaftiraha cusubba), markaa waxay noqotay inaan sawir ku galo.

Aan isku dayno inaan xalino hal dhibaato oo kale. Sida aan xasuusannahay, alifbeetada aasaasiga ah waa asal ahaan sare 6 bits, kaas oo aan maskaxda ku hayno oo aan ku dhajino koodka calaamad kasta oo soo socota. Marka laga hadlayo jilayaasha Shiinaha ee ku jira xannibaadda 0x4E00 - 0x9FFF, Tani waa mid yar 0 ama 1. Tani maaha mid aad u habboon: waxaan u baahan doonaa inaan si joogto ah u bedelno alifbeetada u dhexeeya labadan qiyam (ie, ku bixi saddex bytes). Laakiin ogow in qaabka dheer, laga bilaabo koodhka laftiisa, waxaan ka gooyn karnaa tirada xarfaha aan ku dhejineyno habka gaaban (ka dib dhammaan tabaha kor lagu sharaxay, tani waa 10240) - ka dibna kala duwanaanshaha hieroglyphs ayaa u wareegi doona 0x2600 - 0x77FF, iyo kiiskan, dhammaan noocyadan oo dhan, 6-bit ee ugu muhiimsan (oo ka baxsan 21) waxay la mid noqon doonaan 0. Sidaa darteed, taxanaha hieroglyphs waxay isticmaali doonaan laba bytes halkii hieroglyph (taas oo ah sida ugu fiican ee baaxadda weyn), iyada oo aan lahayn. taasoo keenaysa furayaasha alifbeetada.

Xalalka kale: SCSU, BOCU-1

Khubarada Unicode, markay hadda akhriyeen ciwaanka maqaalka, waxay u badan tahay inay ku degdegi doonaan inay ku xasuusiyaan in si toos ah heerarka Unicode ay ku jiraan Nidaamka cadaadiska caadiga ah ee Unicode (SCSU), kaas oo qeexaya habka codaynta oo aad ula mid ah kan lagu sheegay maqaalka.

Si daacad ah ayaan u qirayaa: Waxaan ka bartay jiritaankeeda kaliya ka dib markii aan si qoto dheer ugu dhex milmay qoraalka go'aankayga. Haddaan bilowgii hore wax ka ogaan lahaa, waxay u badan tahay inaan isku dayi lahaa inaan qorto dhaqangelin intii aan la imaan lahaa hab aniga ii gaar ah.

Waxa xiisaha lihi waxa weeye in SCSU ay adeegsato fikrado la mid ah kuwa aan keligay la yimid (halkii fikradda “alifbeetada” ay adeegsadaan “daaqadaha”, waxaana jira in ka badan inta aan haysto). Isla mar ahaantaana, qaabkani sidoo kale wuxuu leeyahay faa'iido darrooyin: waxay u dhowdahay algorithms isku-buufinta marka loo eego kuwa cod-bixinta. Gaar ahaan, halbeeggu wuxuu bixiyaa habab badan oo matalaad ah, laakiin ma yiraahdo sida loo doorto midka ugu fiican - tan, encoder waa inuu isticmaalo nooc ka mid ah heuristics. Markaa, codeeyaha SCSU ee soo saara baakad wanaagsan ayaa noqon doonta mid ka adag kana dhib badan algorithm-kayga.

Isbarbardhigga, waxaan u wareejiyay hirgelinta fudud ee SCSU JavaScript - marka la eego mugga koodka waxay u muuqatay inay la mid tahay UTF-C-gayga, laakiin xaaladaha qaarkood natiijadu waxay ahayd tobanaan boqolkiiba ka sii xun (mararka qaarkood way dhaafi kartaa, laakiin ma aha wax badan). Tusaale ahaan, qoraallada Cibraaniga iyo Giriigga waxaa ku dhejiyay UTF-C 60% ayaa ka fiican SCSU (laga yaabo inay sabab u tahay alifbeetada is haysta).

Si gooni ah, waxaan ku dari doonaa marka laga reebo SCSU inay sidoo kale jirto hab kale oo si buuxda loogu matalo Unicode - BOCU-1, laakiin waxay ujeedadeedu tahay waafaqsanaanta MIME (oo aanan u baahnayn) oo waxay qaadataa hab wax yar ka duwan si loo codeeyo. Ma qiimayn waxtarkeeda, laakiin waxay iila muuqataa in aanay suurtogal ahayn in ay ka sarrayso SCSU.

Horumarin suurtagal ah

Algorithm-ka aan soo bandhigay maaha mid caalami ah naqshad ahaan (tani waxay u badan tahay inay tahay halka ay yoolalkaygu ka duwan yihiin yoolalka Consortium Unicode). Waxaan hore u soo sheegay in loo hormariyay hal hawl (ku kaydinta qaamuuska luqadaha badan ee geed horgale ah), iyo qaar ka mid ah sifooyinkiisa ayaa laga yaabaa inaanay ku habboonayn hawlo kale. Laakiin xaqiiqda ah in aysan ahayn halbeeg ayaa noqon kara mid lagu daray - si fudud ayaad wax uga beddeli kartaa si ay ugu habboonaato baahiyahaaga.

Tusaale ahaan, si cad oo aad uga takhalusi karto joogitaanka gobolka, samee kood bilaa dal ah - kaliya ha cusboonaysiin doorsoomayaasha. offs, auxOffs и is21Bit ku jira codeeyaha iyo furaha Xaaladdan oo kale, suurtogal ma noqon doonto in si wax ku ool ah loo xidho taxanaha jilayaasha alifbeetada isku midka ah, laakiin waxaa jiri doona dammaanad ah in isla jilaa had iyo jeer lagu dhejiyo bayt isku mid ah, iyadoon loo eegin macnaha guud.

Intaa waxaa dheer, waxaad ku dhejin kartaa cod-bixiyaha luqad gaar ah adiga oo beddelaya xaaladda caadiga ah - tusaale ahaan, diiradda saaraya qoraallada Ruushka, deji furaha iyo furaha bilowga bilowga. offs = 0x0400 и auxOffs = 0. Tani waxay si gaar ah macno u samaynaysaa xaaladda hab la'aanta. Guud ahaan, tani waxay la mid noqon doontaa adeegsiga cod-bixintii siddeed-bit ee hore, laakiin iyada oo aan meesha laga saarin awoodda lagu gelinayo dhammaan Unicode marka loo baahdo.

Cilad kale oo hore loo soo sheegay ayaa ah in qoraalka weyn ee ku xardhan UTF-C aanay jirin hab degdeg ah oo lagu helo xudduudaha dabeecadda ee ugu dhow byte gardarrada. Haddii aad gooyso kan ugu dambeeya, dheh, 100 bytes ka ah kaydka cod-bixinta, waxaad halis u tahay inaad hesho qashin aadan waxba ku qaban karin. Codaynta looguma talagalin in lagu kaydiyo logu-gigabyte-ka badan, laakiin guud ahaan tan waa la sixi karaa. Byte 0xBF waa inaan waligiis u muuqan sidii byte-ka koowaad (laakin wuxuu noqon karaa kan labaad ama saddexaad). Sidaa darteed, markaad codaynayso, waxaad gelin kartaa taxanaha 0xBF 0xBF 0xBF mid kasta, dheh, 10 KB - markaa, haddii aad u baahan tahay inaad hesho xuduud, waxay ku filnaan doontaa inaad sawirto qaybta la doortay ilaa calaamad la mid ah laga helo. Ka dib markii ugu danbeysay 0xBF waxaa la dammaanad qaaday inuu yahay bilowga dabeecadda. (Marka la dejinayo koodka, taxanahan saddexda bytes, dabcan, waxay u baahan doonaan in la iska indho tiro.)

Si loo soo koobo

Haddii aad akhriday ilaa hadda, hambalyo! Waxaan rajeynayaa inaad, aniga oo kale, aad baratay wax cusub (ama dib u cusboonaysii xusuustaada) oo ku saabsan qaab dhismeedka Unicode.

Baaskiil kale: waxaanu ku kaydinnaa xadhkaha Unicode 30-60% in ka badan UTF-8
Demo bogga Tusaalaha Cibraaniga wuxuu muujinayaa faa'iidooyinka UTF-8 iyo SCSU labadaba.

Cilmi-baarista sare lagu sharraxay waa inaan loo tixgelin inay xad-gudub ku tahay heerarka. Si kastaba ha ahaatee, guud ahaan waan ku qanacsanahay natiijada shaqadayda, sidaas darteed waan ku faraxsanahay iyaga wadaag: tusaale ahaan, maktabadda JS ee la yareeyay ayaa miisaankeedu yahay 1710 bytes (oo aan lahayn wax ku tiirsan, dabcan). Sida aan kor ku soo sheegay, shaqadeeda waxaa laga heli karaa bogga demo (sidoo kale waxaa jira qoraallo qoraal ah oo lagu barbar dhigi karo UTF-8 iyo SCSU).

Ugu dambeyntii, waxaan mar kale soo jeedin doonaa dareenka kiisaska UTF-C loo isticmaalo Mana qiimo lahayn:

  • Haddii khadadkaagu ay dheer yihiin ku filan (laga bilaabo 100-200 xaraf). Xaaladdan oo kale, waa in aad ka fikirto isticmaalka algorithms cadaadis sida deflate.
  • Haddii aad u baahan tahay ASCII daahfurnaanta, taas oo ah, adiga ayay muhiim kuu tahay in taxanaha lagu dhejiyay ayan ku jirin koodka ASCII ee aan ku jirin xadhiggii asalka ahaa. Baahida tan waa laga fogaan karaa haddii, markaad la falgasho API-yada dhinac saddexaad (tusaale, la shaqaynta xogta), aad u gudbiso natiijada codaynta sidii qayb aan la taaban karin oo bytes ah, oo aan ahayn sida xargaha. Haddii kale, waxaad halis u tahay inaad hesho nuglaansho lama filaan ah.
  • Haddii aad rabto in aad si degdeg ah u heshid xudduudaha dabeecadda si aan loo meel dayin (tusaale ahaan, marka qayb ka mid ah khadka uu dhaawacmo). Tan waa la samayn karaa, laakiin kaliya iyada oo la sawirayo xariiqda bilowga (ama la adeegsanayo wax ka beddelka lagu sharraxay qaybta hore).
  • Haddii aad u baahan tahay inaad si dhakhso ah u sameyso hawlgallo ku saabsan waxa ku jira xargaha (kala-soocida, ka raadi xargaha-hoosaadka iyaga, isku-dhafka). Tani waxay u baahan tahay xargaha in marka hore la go'aamiyo, markaa UTF-C waxay ka gaabin doontaa UTF-8 xaaladahan (laakin ka dhaqso badan algorithms-ka cadaadiska). Maadaama xadhig isku mid ah uu had iyo jeer si isku mid ah u codeeyo, isbarbardhigga saxda ah ee dejinta looma baahna waxaana lagu samayn karaa qaab byte-byte ah.

update: isticmaalaha Tyomitch faallooyinka hoose dhajiyay garaaf muujinaya xadka lagu dabaqi karo UTF-C. Waxay muujinaysaa in UTF-C ay ka waxtar badan tahay algorithm isku-xidhka guud-ujeeddada (kala duwanaanshaha LZW) ilaa inta xadhigga la soo xidhay uu ka gaaban yahay ~140 xaraf (si kastaba ha ahaatee, waxaan ogaaday in isbarbardhigga lagu sameeyay hal qoraal; luqadaha kale natiijadu way ka duwanaan kartaa).
Baaskiil kale: waxaanu ku kaydinnaa xadhkaha Unicode 30-60% in ka badan UTF-8

Source: www.habr.com

Add a comment