Keke miiran: a tọju awọn okun Unicode 30-60% diẹ sii ju UTF-8 lọ

Keke miiran: a tọju awọn okun Unicode 30-60% diẹ sii ju UTF-8 lọ

Ti o ba jẹ olupilẹṣẹ ati pe o dojuko iṣẹ ṣiṣe ti yiyan fifi koodu kan, lẹhinna Unicode yoo fẹrẹ jẹ ojutu ti o tọ nigbagbogbo. Ọna aṣoju pato da lori ọrọ-ọrọ, ṣugbọn pupọ julọ nigbagbogbo idahun gbogbo agbaye wa nibi paapaa - UTF-8. Ohun ti o dara nipa rẹ ni pe o fun ọ laaye lati lo gbogbo awọn ohun kikọ Unicode laisi inawo pelu ọpọlọpọ awọn baiti ni ọpọlọpọ igba. Lootọ, fun awọn ede ti o lo diẹ sii ju awọn alfabeti Latin nikan, “kii ṣe pupọ” ni o kere ju meji baiti fun kikọ. Njẹ a le ṣe dara julọ laisi ipadabọ si awọn ifaminsi iṣaaju ti o fi opin si awọn ohun kikọ 256 ti o wa bi?

Ni isalẹ Mo daba lati mọ ararẹ pẹlu igbiyanju mi ​​lati dahun ibeere yii ki o ṣe algorithm kan ti o rọrun ti o fun ọ laaye lati ṣafipamọ awọn laini ni ọpọlọpọ awọn ede ti agbaye laisi ṣafikun apọju ti o wa ni UTF-8.

AlAIgBA. Emi yoo ṣe awọn ifiṣura pataki diẹ lẹsẹkẹsẹ: ojutu ti a ṣalaye ko funni bi aropo gbogbo agbaye fun UTF-8, o dara nikan ni atokọ dín ti awọn ọran (diẹ sii lori wọn ni isalẹ), ati pe ko si ọran o yẹ ki o lo lati ṣe ajọṣepọ pẹlu awọn API ẹni-kẹta (ti ko paapaa mọ nipa rẹ). Nigbagbogbo, awọn algoridimu funmorawon-gbogboogbo (fun apẹẹrẹ, deflate) jẹ o dara fun ibi ipamọ iwapọ ti awọn iwọn nla ti data ọrọ. Ni afikun, tẹlẹ ninu ilana ti ṣiṣẹda ojutu mi, Mo rii boṣewa ti o wa tẹlẹ ni Unicode funrararẹ, eyiti o yanju iṣoro kanna - o jẹ idiju diẹ sii (ati nigbagbogbo buru), ṣugbọn sibẹ o jẹ boṣewa ti o gba, kii ṣe fi sii nikan. papo lori orokun. Emi yoo sọ nipa rẹ paapaa.

Nipa Unicode ati UTF-8

Lati bẹrẹ pẹlu, awọn ọrọ diẹ nipa ohun ti o jẹ Unicode и UTF-8.

Bi o ṣe mọ, awọn koodu 8-bit lo lati jẹ olokiki. Pẹlu wọn, ohun gbogbo rọrun: awọn ohun kikọ 256 le jẹ nọmba pẹlu awọn nọmba lati 0 si 255, ati pe awọn nọmba lati 0 si 255 le han ni ipoduduro bi baiti kan. Ti a ba pada si ibẹrẹ akọkọ, fifi koodu ASCII jẹ opin patapata si awọn iwọn 7, nitorinaa diẹ pataki julọ ninu aṣoju baiti rẹ jẹ odo, ati pe ọpọlọpọ awọn koodu 8-bit ni ibamu pẹlu rẹ (wọn yatọ nikan ni “oke”). apakan, nibiti bit pataki julọ jẹ ọkan).

Bawo ni Unicode ṣe yato si awọn fifi koodu wọnyẹn ati kilode ti ọpọlọpọ awọn aṣoju pato ti o ni nkan ṣe pẹlu rẹ - UTF-8, UTF-16 (BE ati LE), UTF-32? Jẹ ká to awọn ti o jade ni ibere.

Boṣewa Unicode ipilẹ ṣe apejuwe ifọrọranṣẹ laarin awọn ohun kikọ nikan (ati ni awọn igba miiran, awọn ẹya ara ẹni kọọkan ti ohun kikọ) ati awọn nọmba wọn. Ati pe ọpọlọpọ awọn nọmba ti o ṣeeṣe wa ni boṣewa yii - lati 0x00 si 0x10FFFF (1 ege). Ti a ba fẹ lati fi nọmba kan si iru iwọn kan sinu oniyipada, bẹni 114 tabi 112 baiti yoo to fun wa. Ati pe niwọn igba ti awọn ilana wa ko ṣe apẹrẹ pupọ fun ṣiṣẹ pẹlu awọn nọmba baiti mẹta, a yoo fi agbara mu lati lo bii awọn baiti 1 fun ihuwasi kan! Eleyi jẹ UTF-2, sugbon o jẹ gbọgán nitori ti yi "wastefulness" ti yi kika ni ko gbajumo.

O da, ilana awọn ohun kikọ laarin Unicode kii ṣe laileto. Gbogbo eto wọn ti pin si 17 "ofurufu", ọkọọkan wọn ni 65536 (0x10000) "koodu ojuami" Awọn Erongba ti a "koodu ojuami" nibi ni nìkan nọmba kikọ, ti a yàn si rẹ nipasẹ Unicode. Ṣugbọn, gẹgẹbi a ti sọ loke, ni Unicode kii ṣe awọn ohun kikọ kọọkan nikan ni o ni nọmba, ṣugbọn tun awọn paati wọn ati awọn ami iṣẹ (ati nigbakan ko si nkankan ni ibamu pẹlu nọmba naa - boya fun akoko yii, ṣugbọn fun wa eyi kii ṣe pataki). o jẹ diẹ ti o tọ nigbagbogbo sọrọ pataki nipa awọn nọmba ti awọn nọmba ara wọn, ati ki o ko aami. Sibẹsibẹ, ni atẹle yii, nitori kukuru, Emi yoo lo ọrọ “aami” nigbagbogbo, ti o tumọ ọrọ naa “ojuami koodu”.

Keke miiran: a tọju awọn okun Unicode 30-60% diẹ sii ju UTF-8 lọ
Unicode ofurufu. Bi o ti le ri, pupọ julọ (awọn ọkọ ofurufu 4 si 13) jẹ ṣiṣakolo.

Ohun ti o ṣe pataki julọ ni pe gbogbo “pulp” akọkọ wa ninu ọkọ ofurufu odo, o pe ni “Ipilẹ Multilingual ofurufuTi ila kan ba ni ọrọ ninu ọkan ninu awọn ede ode oni (pẹlu Kannada), iwọ kii yoo kọja ọkọ ofurufu yii. Ṣugbọn iwọ ko le ge iyoku Unicode boya - fun apẹẹrẹ, emoji wa ni akọkọ ti o wa ni opin ọkọ ofurufu ti o tẹle,"Àfikún Ofurufu Multilingual"(o gbooro lati 0x10000 si 0x1FFFF). Nitorina UTF-16 ṣe eyi: gbogbo awọn ohun kikọ silẹ laarin Ipilẹ Multilingual ofurufu, ti wa ni koodu “gẹgẹbi” pẹlu nọmba baiti meji ti o baamu. Bibẹẹkọ, diẹ ninu awọn nọmba ni sakani yii ko tọka awọn ohun kikọ kan pato rara, ṣugbọn tọka pe lẹhin bata meji yii a nilo lati gbero ọkan miiran - nipa apapọ awọn iye ti awọn baiti mẹrin wọnyi papọ, a gba nọmba kan ti o bo. gbogbo iwọn Unicode wulo. Ọ̀rọ̀ yìí ni wọ́n ń pè ní “àwọn tọkọtaya alábòójútó”—ó lè ti gbọ́ nípa wọn.

Nitorinaa UTF-16 nilo meji tabi (ni awọn ọran toje pupọ) awọn baiti mẹrin fun “ojuami koodu”. Eyi dara julọ ju lilo awọn baiti mẹrin lọ ni gbogbo igba, ṣugbọn Latin (ati awọn ami ASCII miiran) nigbati koodu ni ọna yii padanu idaji aaye lori awọn odo. UTF-8 ti ṣe apẹrẹ lati ṣe atunṣe eyi: ASCII ninu rẹ wa, bi tẹlẹ, nikan baiti kan; awọn koodu lati 0x80 si 0x7FF - meji baiti; lati 0x800 si 0xFFFF - mẹta, ati lati 0x10000 si 0x10FFFF - mẹrin. Ni apa kan, alfabeti Latin ti dara: ibamu pẹlu ASCII ti pada, ati pinpin jẹ paapaa “tan jade” lati 1 si 4 awọn baiti. Ṣugbọn awọn alfabeti miiran yatọ si Latin, alas, ko ni anfani ni eyikeyi ọna akawe si UTF-16, ati ọpọlọpọ awọn bayi nilo awọn baiti mẹta dipo meji - ibiti o ti bo nipasẹ igbasilẹ baiti meji ti dinku nipasẹ awọn akoko 32, pẹlu 0xFFFF si 0x7FF, bẹni Kannada tabi, fun apẹẹrẹ, Georgian ko wa ninu rẹ. Cyrillic ati marun miiran alphabets - hurray - orire, 2 baiti fun kikọ.

Kini idi ti eyi fi ṣẹlẹ? Jẹ ki a wo bii UTF-8 ṣe duro fun awọn koodu kikọ:
Keke miiran: a tọju awọn okun Unicode 30-60% diẹ sii ju UTF-8 lọ
Taara lati ṣe aṣoju awọn nọmba, awọn ege ti a samisi pẹlu aami ni a lo nibi x. O le rii pe ninu igbasilẹ-baiti meji nikan ni iru awọn die-die 11 (lati inu 16). Awọn die-die asiwaju nibi ni iṣẹ iranlọwọ nikan. Ninu ọran ti igbasilẹ baiti mẹrin, 21 ninu 32 bits ni a pin fun nọmba aaye koodu - yoo dabi pe awọn baiti mẹta (eyiti o funni ni apapọ awọn iwọn 24) yoo to, ṣugbọn awọn asami iṣẹ jẹ pupọ.

Ṣe eyi buburu? Be ko. Ni apa kan, ti a ba bikita pupọ nipa aaye, a ni awọn algoridimu funmorawon ti o le ni rọọrun yọ gbogbo awọn afikun entropy ati apọju. Ni apa keji, ibi-afẹde ti Unicode ni lati pese ifaminsi agbaye julọ ti o ṣeeṣe. Fun apẹẹrẹ, a le fi ila kan ti a fi koodu si UTF-8 si koodu ti o ṣiṣẹ tẹlẹ pẹlu ASCII nikan, ati pe ko bẹru pe yoo ri ohun kikọ kan lati ibiti ASCII ti ko si nibẹ (lẹhinna, ni UTF-8 gbogbo). Awọn baiti ti o bẹrẹ pẹlu lati odo bit - eyi ni pato ohun ti ASCII jẹ). Ati pe ti a ba fẹ lojiji lati ge iru kekere kan kuro ninu okun nla kan laisi iyipada rẹ lati ibẹrẹ (tabi mu pada apakan alaye naa lẹhin apakan ti o bajẹ), o rọrun fun wa lati wa aiṣedeede nibiti ohun kikọ kan ti bẹrẹ (o ti to. lati fo awọn baiti ti o ni a bit ìpele 10).

Kilode ti o ṣe ṣẹda nkan titun?

Ni akoko kanna, awọn ipo lẹẹkọọkan wa nigbati awọn algoridimu funmorawon bii deflate ko wulo, ṣugbọn o fẹ lati ṣaṣeyọri ibi ipamọ iwapọ ti awọn okun. Tikalararẹ, Mo pade iṣoro yii nigbati mo n ronu nipa kikọ fisinuirindigbindigbin ìpele igi fun iwe-itumọ nla pẹlu awọn ọrọ ni awọn ede lainidii. Ni apa kan, ọrọ kọọkan kuru pupọ, nitorinaa fisinuirindigbindigbin yoo jẹ ailagbara. Ni ida keji, imuse igi ti Mo ro pe a ṣe apẹrẹ ki baiti kọọkan ti okun ti o fipamọ ṣe ipilẹṣẹ fati igi ọtọtọ, nitorinaa idinku nọmba wọn wulo pupọ. Ninu ile ikawe mi Az.js (Bi ninu pymorphy2, lori eyi ti o ti wa ni orisun) a iru isoro le ti wa ni re nìkan - strings aba ti sinu DAWG-dictionary, ti o ti fipamọ nibẹ ni ti o dara atijọ CP1251. Ṣugbọn, gẹgẹ bi o ti rọrun lati ni oye, eyi ṣiṣẹ daradara fun ahbidi ti o lopin nikan - laini kan ni Kannada ko le ṣafikun si iru iwe-itumọ kan.

Lọtọ, Emi yoo fẹ lati ṣakiyesi ọkan diẹ ẹ sii alaidun nuance ti o dide nigba lilo UTF-8 ni iru eto data kan. Aworan ti o wa loke fihan pe nigbati kikọ kan ba kọ bi awọn baiti meji, awọn ege ti o ni ibatan si nọmba rẹ ko wa ni ọna kan, ṣugbọn o pin nipasẹ awọn bata meji. 10 ni aarin: 110xxxxx 10xxxxxx. Nitori eyi, nigbati awọn kekere 6 kekere ti baiti keji ti nṣan ni koodu kikọ (ie, iyipada kan waye. 1011111110000000), lẹhinna baiti akọkọ tun yipada. O wa ni pe lẹta “p” jẹ itọkasi nipasẹ awọn baiti 0xD0 0xBF, ati “r” atẹle ti wa tẹlẹ 0xD1 0x80. Ni igi ìpele, eyi nyorisi pipin ti ipade obi si meji - ọkan fun ìpele 0xD0, ati awọn miiran fun 0xD1 (botilẹjẹpe gbogbo alfabeti Cyrillic le jẹ koodu nipasẹ baiti keji nikan).

Kini mo gba

Idojukọ iṣoro yii, Mo pinnu lati ṣe adaṣe awọn ere pẹlu awọn bit, ati ni akoko kanna ni oye diẹ sii pẹlu eto Unicode lapapọ. Abajade jẹ ọna kika koodu UTF-C ("C" fun iwapọ), eyi ti ko si siwaju sii ju 3 baiti fun koodu ojuami, ati ki o gan igba faye gba o a na nikan baiti afikun kan fun gbogbo ila ti a fi koodu pa. Eyi yori si otitọ pe lori ọpọlọpọ awọn alfabeti ti kii ṣe ASCII iru fifi koodu wa jade lati jẹ 30-60% diẹ ẹ sii ju UTF-8.

Mo ti ṣafihan awọn apẹẹrẹ ti imuse ti fifi koodu ati awọn algoridimu iyipada ni fọọmu naa JavaScript ati Go ikawe, o le lo wọn larọwọto ninu koodu rẹ. Ṣugbọn Emi yoo tun tẹnumọ pe ni ọna kan ọna kika yii jẹ “keke”, ati pe Emi ko ṣeduro lilo rẹ lai mọ idi ti o nilo rẹ. Eyi tun jẹ diẹ sii ti idanwo ju “ilọsiwaju ti UTF-8” pataki kan. Sibẹsibẹ, koodu ti o wa nibẹ ti kọ daradara, ni ṣoki, pẹlu nọmba nla ti awọn asọye ati agbegbe idanwo.

Keke miiran: a tọju awọn okun Unicode 30-60% diẹ sii ju UTF-8 lọ
Awọn abajade idanwo ati lafiwe pẹlu UTF-8

Mo tun ṣe demo iwe, Nibi ti o ti le ṣe iṣiro iṣẹ ṣiṣe ti algorithm, ati lẹhinna Emi yoo sọ fun ọ diẹ sii nipa awọn ilana rẹ ati ilana idagbasoke.

Yiyokuro laiṣe die-die

Mo mu UTF-8 gẹgẹbi ipilẹ, dajudaju. Ohun akọkọ ati ti o han gedegbe ti o le yipada ninu rẹ ni lati dinku nọmba awọn die-die iṣẹ ni baiti kọọkan. Fun apẹẹrẹ, baiti akọkọ ni UTF-8 nigbagbogbo bẹrẹ pẹlu boya 0, tabi pẹlu 11 - ìpele 10 Awọn baiti wọnyi nikan ni o ni. Jẹ ká ropo ìpele 11 on 1, ati fun awọn baiti atẹle a yoo yọ awọn ami-iṣaaju kuro patapata. Kini yoo ṣẹlẹ?

0xxxxxxx - 1 baiti
10xxxxxx xxxxxxxx - 2 baiti
110xxxxx xxxxxxxx xxxxxxxx - 3 baiti

Duro, nibo ni igbasilẹ baiti mẹrin wa? Ṣugbọn ko nilo mọ - nigba kikọ ni awọn baiti mẹta, a ni bayi ni awọn bit 21 wa ati pe eyi to fun gbogbo awọn nọmba to 0x10FFFF.

Kini a ti rubọ nibi? Ohun pataki julọ ni wiwa awọn aala ohun kikọ lati ipo lainidii ninu ifipamọ. A ko le tọka si baiti lainidii ki o wa ibẹrẹ ti ohun kikọ ti o tẹle lati ọdọ rẹ. Eyi jẹ aropin ti ọna kika wa, ṣugbọn ni iṣe eyi kii ṣe pataki. Nigbagbogbo a ni anfani lati ṣiṣe nipasẹ ifipamọ lati ibẹrẹ pupọ (paapaa nigbati o ba de awọn laini kukuru).

Ipo pẹlu awọn ede ibora pẹlu awọn baiti 2 tun ti dara julọ: ni bayi ọna kika baiti meji n funni ni iwọn 14 die-die, ati pe iwọnyi jẹ awọn koodu to 0x3FFF. Awọn Kannada ko ni orire (awọn ohun kikọ wọn wa pupọ julọ lati 0x4E00 si 0x9FFF), ṣugbọn awọn ara Georgia ati ọpọlọpọ awọn eniyan miiran ni igbadun diẹ sii - awọn ede wọn tun baamu si awọn baiti 2 fun iwa kan.

Tẹ ipo koodu koodu sii

Jẹ ki a bayi ro nipa awọn ini ti awọn ila ara wọn. Iwe-itumọ nigbagbogbo ni awọn ọrọ ti a kọ sinu awọn kikọ ti alfabeti kanna, ati pe eyi tun jẹ otitọ fun ọpọlọpọ awọn ọrọ miiran. Yoo dara lati tọka alfabeti yii lẹẹkan, ati lẹhinna tọka nikan nọmba lẹta ti o wa ninu rẹ. Jẹ ki a rii boya iṣeto awọn ohun kikọ ninu tabili Unicode yoo ran wa lọwọ.

Gẹgẹbi a ti sọ loke, Unicode ti pin si ofurufu 65536 awọn koodu kọọkan. Ṣugbọn eyi kii ṣe pipin ti o wulo pupọ (gẹgẹbi a ti sọ tẹlẹ, nigbagbogbo a wa ninu ọkọ ofurufu odo). Diẹ awon ni pipin nipa ohun amorindun. Awọn sakani wọnyi ko ni ipari ti o wa titi, ati pe o ni itumọ diẹ sii - gẹgẹbi ofin, ọkọọkan daapọ awọn ohun kikọ lati alfabeti kanna.

Keke miiran: a tọju awọn okun Unicode 30-60% diẹ sii ju UTF-8 lọ
Idina kan ti o ni awọn ohun kikọ ti Ede Bengali ninu. Laanu, fun awọn idi itan, eyi jẹ apẹẹrẹ ti iṣakojọpọ ti kii ṣe ipon pupọ - awọn kikọ 96 ti tuka kaakiri jakejado awọn aaye koodu idina 128.

Awọn ibẹrẹ ti awọn bulọọki ati awọn iwọn wọn nigbagbogbo jẹ ọpọlọpọ ti 16 - eyi ni a ṣe ni irọrun fun irọrun. Ni afikun, ọpọlọpọ awọn bulọọki bẹrẹ ati pari lori awọn iye ti o jẹ ọpọlọpọ ti 128 tabi paapaa 256 - fun apẹẹrẹ, alfabeti Cyrillic ipilẹ gba 256 awọn baiti lati 0x0400 si 0x04FF. Eyi jẹ irọrun pupọ: ti a ba ṣafipamọ asọtẹlẹ lẹẹkan 0x04, lẹhinna eyikeyi ihuwasi Cyrillic ni a le kọ sinu baiti kan. Otitọ, ni ọna yii a yoo padanu aye lati pada si ASCII (ati si eyikeyi awọn ohun kikọ miiran ni gbogbogbo). Nitorina a ṣe eyi:

  1. Meji baiti 10yyyyyy yxxxxxxx ko nikan tọka aami pẹlu nọmba kan yyyyyy yxxxxxxx, ṣugbọn tun yipada lọwọlọwọ alfabeti on yyyyyy y0000000 (ie a ranti gbogbo awọn die-die ayafi awọn ti o kere julọ pataki 7 bit);
  2. Ọkan baiti 0xxxxxxx eyi ni ohun kikọ ti awọn ti isiyi alfabeti. O kan nilo lati ṣafikun si aiṣedeede ti a ranti ni igbesẹ 1. Lakoko ti a ko yi alfabeti pada, aiṣedeede jẹ odo, nitorinaa a ṣetọju ibamu pẹlu ASCII.

Bakanna fun awọn koodu to nilo 3 baiti:

  1. Awọn baiti mẹta 110yyyyy yxxxxxxx xxxxxxxx tọkasi aami kan pẹlu nọmba kan yyyyyy yxxxxxxx xxxxxxxx, iyipada lọwọlọwọ alfabeti on yyyyyy y0000000 00000000 (ranti ohun gbogbo ayafi awọn kékeré 15 bit), ki o si ṣayẹwo apoti ti a wa ni bayi gun mode (nigbati o ba yi alfabeti pada si kan ni ilopo-baiti, a yoo tun yi Flag);
  2. Meji baiti 0xxxxxxx xxxxxxxx ni ipo gigun o jẹ ihuwasi ti alfabeti lọwọlọwọ. Bakanna, a ṣafikun pẹlu aiṣedeede lati igbesẹ 1. Iyatọ kan ni pe ni bayi a ka awọn baiti meji (nitori a yipada si ipo yii).

Ohun ti o dara: ni bayi lakoko ti a nilo lati ṣafikun awọn ohun kikọ lati iwọn Unicode 7-bit kanna, a na 1 baiti afikun ni ibẹrẹ ati lapapọ baiti kan fun ihuwasi kan.

Keke miiran: a tọju awọn okun Unicode 30-60% diẹ sii ju UTF-8 lọ
Ṣiṣẹ lati ọkan ninu awọn ẹya iṣaaju. O nigbagbogbo lu UTF-8, ṣugbọn aye tun wa fun ilọsiwaju.

Kini o buru ju? Ni akọkọ, a ni ipo kan, eyun aiṣedeede alfabeti lọwọlọwọ ati apoti gun mode. Eyi fi opin si wa siwaju sii: ni bayi awọn ohun kikọ kanna le ṣe koodu ni oriṣiriṣi ni awọn ipo oriṣiriṣi. Wiwa fun awọn gbolohun ọrọ, fun apẹẹrẹ, yoo ni lati ṣee ṣe mu eyi sinu apamọ, kii ṣe nipa ifiwera awọn baiti nikan. Ni ẹẹkeji, ni kete ti a ba yipada ahbidi naa, o buru pẹlu fifi koodu ti awọn ohun kikọ ASCII (ati pe eyi kii ṣe alfabeti Latin nikan, ṣugbọn awọn aami ifamisi ipilẹ, pẹlu awọn alafo) - wọn nilo iyipada ahbidi lẹẹkansi si 0, iyẹn, lẹẹkansi baiti afikun (ati lẹhinna miiran lati pada si aaye akọkọ wa).

Alfabeti kan dara, meji dara julọ

Jẹ ki a gbiyanju lati yi awọn ami-iṣaaju diẹ wa pada, ni fifun ni ọkan diẹ sii si awọn mẹta ti a ṣalaye loke:

0xxxxxxx - 1 baiti ni ipo deede, 2 ni ipo gigun
11xxxxxx - 1 baiti
100xxxxx xxxxxxxx - 2 baiti
101xxxxx xxxxxxxx xxxxxxxx - 3 baiti

Keke miiran: a tọju awọn okun Unicode 30-60% diẹ sii ju UTF-8 lọ

Bayi ni a meji-baiti igbasilẹ nibẹ ni ọkan kere wa bit wa - koodu ojuami soke si 0x1FFFsugbon ko 0x3FFF. Bibẹẹkọ, o tun jẹ akiyesi tobi ju ni awọn koodu UTF-8-meji-baiti, awọn ede ti o wọpọ julọ tun baamu, pipadanu akiyesi julọ ti ṣubu hiragana и katakana, awọn Japanese ni ibanujẹ.

Kini koodu tuntun yii? 11xxxxxx? Eyi jẹ “stash” kekere ti awọn ohun kikọ 64 ni iwọn, o ṣe afikun alfabeti akọkọ wa, nitorinaa Mo pe ni iranlọwọ (oluranlọwọ) alfabeti. Nigba ti a ba yipada alfabeti lọwọlọwọ, nkan ti alfabeti atijọ di oluranlọwọ. Fun apẹẹrẹ, a yipada lati ASCII si Cyrillic - stash ni bayi ni awọn ohun kikọ 64 ti o ni ninu Latin alfabeti, awọn nọmba, aaye ati koma (awọn ifibọ loorekoore ninu awọn ọrọ ti kii ṣe ASCII). Yipada pada si ASCII - ati apakan akọkọ ti alfabeti Cyrillic yoo di alfabeti oluranlọwọ.

Ṣeun si iraye si awọn alfabeti meji, a le mu nọmba nla ti awọn ọrọ pẹlu awọn idiyele kekere fun yiyipada awọn alfabeti (awọn aami ifamisi yoo nigbagbogbo ja si ipadabọ si ASCII, ṣugbọn lẹhin iyẹn a yoo gba ọpọlọpọ awọn ohun kikọ ti kii ṣe ASCII lati inu alfabeti afikun, laisi yipada lẹẹkansi).

Bonus: prefixing sub-alphabet 11xxxxxx ati yiyan aiṣedeede akọkọ lati jẹ 0xC0, a gba ibamu apa kan pẹlu CP1252. Ni awọn ọrọ miiran, ọpọlọpọ (ṣugbọn kii ṣe gbogbo) awọn ọrọ Iwọ-oorun Yuroopu ti a fi koodu parọ ni CP1252 yoo dabi kanna ni UTF-C.

Nibi, sibẹsibẹ, iṣoro kan dide: bawo ni a ṣe le gba ọkan iranlọwọ lati alfabeti akọkọ? O le fi aiṣedeede kanna silẹ, ṣugbọn - alas - nibi eto Unicode ti n ṣiṣẹ tẹlẹ si wa. Nigbagbogbo apakan akọkọ ti alfabeti kii ṣe ni ibẹrẹ bulọọki (fun apẹẹrẹ, olu-ilu Russia “A” ni koodu naa. 0x0410, biotilejepe awọn Cyrillic Àkọsílẹ bẹrẹ pẹlu 0x0400). Nitorinaa, ti a ti mu awọn ohun kikọ 64 akọkọ sinu stash, a le padanu iraye si apakan iru ti alfabeti.

Lati ṣatunṣe iṣoro yii, Mo lọ pẹlu ọwọ nipasẹ diẹ ninu awọn bulọọki ti o baamu si awọn ede oriṣiriṣi, ati ṣalaye aiṣedeede ti alfabeti arannilọwọ laarin akọkọ fun wọn. Awọn alfabeti Latin, gẹgẹbi iyasọtọ, ni gbogbo igba ti a tunto bi base64.

Keke miiran: a tọju awọn okun Unicode 30-60% diẹ sii ju UTF-8 lọ

Awọn ifọwọkan ipari

Jẹ ká nipari ro nipa ibi ti ohun miiran ti a le mu nkankan.

Ṣe akiyesi pe ọna kika naa 101xxxxx xxxxxxxx xxxxxxxx faye gba o lati encoded awọn nọmba soke si 0x1FFFFF, ati Unicode pari ni iṣaaju, ni 0x10FFFF. Ni awọn ọrọ miiran, aaye koodu to kẹhin yoo jẹ aṣoju bi 10110000 11111111 11111111. Nitorinaa, a le sọ pe ti baiti akọkọ jẹ ti fọọmu naa 1011xxxx (Nibo xxxx ti o tobi ju 0), lẹhinna o tumọ si nkan miiran. Fun apẹẹrẹ, o le ṣafikun awọn ohun kikọ 15 miiran nibẹ ti o wa nigbagbogbo fun fifi koodu sinu baiti kan, ṣugbọn Mo pinnu lati ṣe yatọ.

Jẹ ki a wo awọn bulọọki Unicode wọnyẹn ti o nilo awọn baiti mẹta ni bayi. Ni ipilẹ, bi a ti sọ tẹlẹ, iwọnyi jẹ awọn ohun kikọ Kannada - ṣugbọn o nira lati ṣe ohunkohun pẹlu wọn, 21 ẹgbẹrun wọn wa. Ṣugbọn hiragana ati katakana tun fo sibẹ - ati pe ko si pupọ ninu wọn mọ, o kere ju igba lọ. Ati pe, niwọn bi a ti ranti awọn ara ilu Japanese, emojis tun wa (ni otitọ, wọn tuka ni ọpọlọpọ awọn aaye ni Unicode, ṣugbọn awọn bulọọki akọkọ wa ni sakani. 0x1F300 - 0x1FBFF). Ti o ba ronu nipa otitọ pe ni bayi awọn emoji wa ti o pejọ lati awọn aaye koodu pupọ ni ẹẹkan (fun apẹẹrẹ, emoji.Keke miiran: a tọju awọn okun Unicode 30-60% diẹ sii ju UTF-8 lọ oriširiši bi ọpọlọpọ bi 7 koodu!), Lẹhinna o di itiju pipe lati lo awọn baiti mẹta lori ọkọọkan (7× 3 = 21 baiti fun aami kan, alaburuku).

Nitorinaa, a yan awọn sakani ti o yan diẹ ti o baamu emoji, hiragana ati katakana, tun sọ wọn sinu atokọ lilọsiwaju kan ki o fi koodu iwọle si bi awọn baiti meji dipo mẹta:

1011xxxx xxxxxxxx

Nla: emoji ti a mẹnukanKeke miiran: a tọju awọn okun Unicode 30-60% diẹ sii ju UTF-8 lọ, ti o wa ninu 7 koodu ojuami, gba 8 baiti ni UTF-25, ati awọn ti a fit sinu 14 (gangan meji baiti fun kọọkan koodu ojuami). Nipa ọna, Habr kọ lati ṣawari rẹ (mejeeji ni atijọ ati ni olootu titun), nitorina ni mo ni lati fi sii pẹlu aworan kan.

Jẹ ká gbiyanju lati fix ọkan diẹ isoro. Bi a ṣe ranti, alfabeti ipilẹ jẹ pataki ga 6 die-die, eyi ti a pa ni lokan ki o si lẹ pọ si awọn koodu ti kọọkan tókàn decoded aami. Ninu ọran ti awọn ohun kikọ Kannada ti o wa ninu bulọki naa 0x4E00 - 0x9FFF, Eyi jẹ boya bit 0 tabi 1. Eyi kii ṣe irọrun pupọ: a yoo nilo lati yipada nigbagbogbo alfabeti laarin awọn iye meji wọnyi (ie na awọn baiti mẹta). Ṣugbọn ṣe akiyesi pe ni ipo gigun, lati koodu funrararẹ a le yọkuro nọmba awọn ohun kikọ ti a fi koodu pamọ nipa lilo ipo kukuru (lẹhin gbogbo awọn ẹtan ti a ṣalaye loke, eyi jẹ 10240) - lẹhinna ibiti awọn hieroglyphs yoo yipada si 0x2600 - 0x77FF, ati ninu apere yi, jakejado yi gbogbo ibiti o, awọn julọ significant 6 die-die (jade ti 21) yoo jẹ dogba si 0. Bayi, lesese ti hieroglyphs yoo lo meji baiti fun hieroglyph (eyi ti o jẹ ti aipe fun iru kan ti o tobi ibiti), lai nfa alfabeti yipada.

Yiyan solusan: SCSU, BOCU-1

Awọn amoye Unicode, ni kete ti ka akọle nkan naa, yoo ṣee ṣe yara lati leti pe taara laarin awọn iṣedede Unicode wa Eto Imudara Boṣewa fun Unicode (SCSU), eyiti o ṣe apejuwe ọna fifi koodu kan ti o jọra si eyiti a ṣalaye ninu nkan naa.

Mo jẹ́wọ́ òtítọ́: Mo kẹ́kọ̀ọ́ nípa wíwà rẹ̀ kìkì lẹ́yìn tí mo ti rì bọmi jinlẹ̀ nínú kíkọ ìpinnu mi. Ti MO ba mọ nipa rẹ lati ibẹrẹ, Emi yoo ti gbiyanju lati kọ imuse kan dipo wiwa pẹlu ọna ti ara mi.

Ohun ti o jẹ iyanilenu ni pe SCSU nlo awọn imọran ti o jọra si awọn ti Mo wa pẹlu tirẹ (dipo imọran “awọn alfabeti” wọn lo “awọn window”, ati pe ọpọlọpọ wọn wa ju Mo ni lọ). Ni akoko kanna, ọna kika yii tun ni awọn alailanfani: o sunmọ diẹ si awọn algoridimu funmorawon ju awọn fifi koodu lọ. Ni pato, boṣewa fun ọpọlọpọ awọn ọna aṣoju, ṣugbọn ko sọ bi o ṣe le yan eyi ti o dara julọ - fun eyi, koodu koodu gbọdọ lo diẹ ninu iru awọn heuristics. Nitorinaa, koodu SCSU kan ti o ṣe agbejade iṣakojọpọ ti o dara yoo jẹ eka pupọ ati diẹ sii ni wahala ju algoridimu mi.

Fun lafiwe, Mo gbe imuse ti o rọrun ti SCSU si JavaScript - ni awọn ofin ti iwọn koodu o wa ni afiwera si UTF-C mi, ṣugbọn ni awọn igba miiran abajade jẹ mewa ti ogorun buru ju (nigbakugba o le kọja rẹ, ṣugbọn kii ṣe pupọ). Fún àpẹẹrẹ, àwọn ọ̀rọ̀ inú Hébérù àti Gíríìkì ni UTF-C ṣe ìbòmọ́lẹ̀ 60% dara ju SCSU (boya nitori awọn alfabeti iwapọ wọn).

Lọtọ, Emi yoo ṣafikun pe ni afikun si SCSU ọna miiran tun wa lati ṣe aṣoju Unicode ni iwapọ - BOCU-1, ṣugbọn o ṣe ifọkansi fun ibaramu MIME (eyiti Emi ko nilo) ati gba ọna ti o yatọ diẹ si fifi koodu. Emi ko ṣe ayẹwo imunadoko rẹ, ṣugbọn o dabi si mi pe ko ṣeeṣe lati ga ju SCSU lọ.

Awọn ilọsiwaju ti o ṣeeṣe

Algoridimu ti Mo gbekalẹ kii ṣe gbogbo agbaye nipasẹ apẹrẹ (eyi ṣee ṣe nibiti awọn ibi-afẹde mi ti yapa pupọ julọ lati awọn ibi-afẹde ti Consortium Unicode). Mo ti mẹnuba tẹlẹ pe o ti ni idagbasoke ni akọkọ fun iṣẹ-ṣiṣe kan (titoju iwe-itumọ ede pupọ sinu igi ìpele), ati pe diẹ ninu awọn ẹya ara ẹrọ le ma baamu daradara fun awọn iṣẹ ṣiṣe miiran. Ṣugbọn otitọ pe kii ṣe boṣewa le jẹ afikun - o le ni rọọrun yipada lati ba awọn iwulo rẹ baamu.

Fun apẹẹrẹ, ni ọna ti o han gedegbe o le yọkuro niwaju ipinlẹ, ṣe ifaminsi ti orilẹ-ede - o kan maṣe ṣe imudojuiwọn awọn oniyipada offs, auxOffs и is21Bit ninu awọn kooduopo ati decoder. Ni ọran yii, kii yoo ṣee ṣe lati ni imunadoko awọn ọna ṣiṣe ti awọn ohun kikọ ti alfabeti kanna, ṣugbọn iṣeduro yoo wa pe ohun kikọ kanna nigbagbogbo ni koodu pẹlu awọn baiti kanna, laibikita ọrọ-ọrọ.

Ni afikun, o le ṣe atunṣe koodu si ede kan pato nipa yiyipada ipo aiyipada - fun apẹẹrẹ, idojukọ lori awọn ọrọ Russian, ṣeto koodu koodu ati oluyipada ni ibẹrẹ. offs = 0x0400 и auxOffs = 0. Eyi jẹ pataki ni pataki ninu ọran ti ipo aini ipinlẹ. Ni gbogbogbo, eyi yoo jọra si lilo fifi koodu mẹjọ-bit atijọ, ṣugbọn laisi yiyọ agbara lati fi awọn kikọ sii lati gbogbo Unicode bi o ṣe nilo.

Idapada miiran ti a mẹnuba tẹlẹ ni pe ninu ọrọ nla ti a fi koodu si ni UTF-C ko si ọna iyara lati wa aala ohun kikọ ti o sunmọ si baiti lainidii. Ti o ba ge ti o kẹhin kuro, sọ, 100 awọn baiti lati inu ifipamọ koodu, o ni ewu lati gba idoti ti o ko le ṣe ohunkohun pẹlu. Awọn fifi koodu ko ṣe apẹrẹ fun titoju awọn akọọlẹ gigabyte pupọ, ṣugbọn ni gbogbogbo eyi le ṣe atunṣe. Baiti 0xBF kò gbọdọ han bi akọkọ baiti (ṣugbọn o le jẹ keji tabi kẹta). Nitorina, nigba fifi koodu sii, o le fi sii ọkọọkan 0xBF 0xBF 0xBF gbogbo, sọ, 10 KB - lẹhinna, ti o ba nilo lati wa aala, yoo to lati ọlọjẹ nkan ti o yan titi ti a fi rii aami iru kan. Lẹhin ti o kẹhin 0xBF ni idaniloju lati jẹ ibẹrẹ ti ohun kikọ. (Nigbati o ba n ṣe iyipada, ọna ti awọn baiti mẹta yoo, dajudaju, nilo lati kọbikita.)

Summing soke

Ti o ba ti ka eyi jina, oriire! Mo nireti pe iwọ, bii emi, kọ nkan tuntun (tabi sọtun iranti rẹ) nipa eto Unicode.

Keke miiran: a tọju awọn okun Unicode 30-60% diẹ sii ju UTF-8 lọ
Ririnkiri iwe. Apẹẹrẹ Heberu fihan awọn anfani lori mejeeji UTF-8 ati SCSU.

Iwadii ti o ṣe alaye loke ko yẹ ki o gba bi ilokulo lori awọn iṣedede. Sibẹsibẹ, Mo ni itẹlọrun gbogbogbo pẹlu awọn abajade iṣẹ mi, nitorinaa inu mi dun pẹlu wọn lati pin: fun apẹẹrẹ, a miniified JS ìkàwé wọn nikan 1710 baiti (ati ki o ni ko si gbára, dajudaju). Bi mo ti sọ loke, iṣẹ rẹ le ṣee ri ni demo iwe (awọn ọrọ tun wa lori eyiti o le ṣe afiwe pẹlu UTF-8 ati SCSU).

Ni ipari, Emi yoo tun fa ifojusi si awọn ọran ninu eyiti UTF-C ti lo ko tọ o:

  • Ti awọn ila rẹ ba gun to (lati awọn ohun kikọ 100-200). Ni idi eyi, o yẹ ki o ronu nipa lilo awọn algoridimu funmorawon bi deflate.
  • Ti o ba nilo ASCII akoyawo, iyẹn ni, o ṣe pataki fun ọ pe awọn ilana koodu ko ni awọn koodu ASCII ninu ti ko si ninu okun atilẹba. Iwulo fun eyi ni a le yago fun ti, nigbati o ba n ba awọn API ẹni-kẹta ṣiṣẹ (fun apẹẹrẹ, ṣiṣẹ pẹlu data data), o kọja abajade fifi ẹnọ kọ nkan bii akojọpọ awọn baiti, kii ṣe bi awọn okun. Bibẹẹkọ, o ṣe eewu nini awọn airotẹlẹ airotẹlẹ.
  • Ti o ba fẹ ni anfani lati yara wa awọn aala ohun kikọ ni aiṣedeede lainidii (fun apẹẹrẹ, nigbati apakan laini ba bajẹ). Eyi le ṣee ṣe, ṣugbọn nikan nipa ṣiṣayẹwo laini lati ibẹrẹ (tabi lilo iyipada ti a ṣalaye ninu apakan ti tẹlẹ).
  • Ti o ba nilo lati ṣe awọn iṣẹ ni kiakia lori awọn akoonu ti awọn okun (to wọn, wa awọn substrings ninu wọn, concatenate). Eyi nilo awọn okun lati yipada ni akọkọ, nitorina UTF-C yoo lọra ju UTF-8 ni awọn ọran wọnyi (ṣugbọn yiyara ju awọn algoridimu funmorawon). Niwọn igba ti okun kanna ti wa ni koodu nigbagbogbo ni ọna kanna, lafiwe gangan ti iyipada ko nilo ati pe o le ṣee ṣe lori ipilẹ baiti-nipasẹ-baiti.

imudojuiwọn: olumulo Tyomitch ninu awọn comments ni isalẹ Pipa aworan kan ti n ṣe afihan awọn opin iwulo ti UTF-C. O fihan pe UTF-C ṣiṣẹ daradara diẹ sii ju algoridimu funmorawon idi gbogbogbo (iyatọ ti LZW) niwọn igba ti okun ti a kojọpọ jẹ kukuru. ~ 140 kikọ (sibẹsibẹ, Mo ṣe akiyesi pe a ṣe afiwera lori ọrọ kan; fun awọn ede miiran abajade le yatọ).
Keke miiran: a tọju awọn okun Unicode 30-60% diẹ sii ju UTF-8 lọ

orisun: www.habr.com

Fi ọrọìwòye kun