{"id":95911,"date":"2020-10-05T01:42:09","date_gmt":"2020-10-04T23:42:09","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/eshhyo-odin-velosiped-hranim-yunikodnye-stroki-na-30-60-kompaktnee-chem-utf-8"},"modified":"2020-10-05T01:42:09","modified_gmt":"2020-10-04T23:42:09","slug":"eshhyo-odin-velosiped-hranim-yunikodnye-stroki-na-30-60-kompaktnee-chem-utf-8","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/eshhyo-odin-velosiped-hranim-yunikodnye-stroki-na-30-60-kompaktnee-chem-utf-8","title":{"rendered":"Kas teadsite, et Linuxi k\u00e4surea saab k\u00e4ivitada iOS seadmes? V\u00f5ib-olla k\u00fcsite: \u201eMiks ma peaksin kasutama teksti rakendusi iPhone'is?\u201c \u00d5ige k\u00fcsimus. Kuid kui loete Opensource.com-i, siis t\u00f5en\u00e4oliselt teate sellele vastust: Linuxi kasutajad tahavad v\u00f5imalust sellega igas seadmes t\u00f6\u00f6tada ja kasutavad oma seadeid. Kuid k\u00f5ige rohkem nad","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Kas teadsite, et Linuxi k\u00e4surea saab k\u00e4ivitada iOS seadmes? V\u00f5ib-olla k\u00fcsite: \u201eMiks ma peaksin kasutama teksti rakendusi iPhone&#039;is?\u201c \u00d5ige k\u00fcsimus. Kuid kui loete Opensource.com-i, siis t\u00f5en\u00e4oliselt teate sellele vastust: Linuxi kasutajad tahavad v\u00f5imalust sellega igas seadmes t\u00f6\u00f6tada ja kasutavad oma seadeid. Kuid k\u00f5ige rohkem nad\" src=\"\/wp-content\/uploads\/2020\/10\/56c10bad377127b711bdb204ee300772.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKui olete arendaja ja seisate silmitsi kodeeringu valimise \u00fclesandega, on peaaegu alati \u00f5ige valik Unicode. Konkreetne esitusviis s\u00f5ltub kontekstist, kuid sagedamini on ka siin universaalne vastus \u2014 UTF-8. See on hea, kuna v\u00f5imaldab kasutada k\u00f5iki Unicode'i s\u00fcmboleid, raiskamata <em>liialt<\/em> paljusid baite enamikul juhtudel. T\u00f5si, keelte puhul, mis ei kasuta ainult ladina t\u00e4hestikku, t\u00e4hendab \u201eliialt v\u00e4he\u201d v\u00e4hemalt <strong>kahte baiti s\u00fcmboli kohta<\/strong>. Kas on v\u00f5imalik paremini, naasmata ajaloolistele kodeeringutele, mis piiravad meid vaid 256 saadaval s\u00fcmboliga?<\/p>\n<p>Allpool pakun v\u00e4lja oma katse sellele k\u00fcsimusele vastata ja suhet suhteliselt lihtsa algoritmiga, mis v\u00f5imaldab s\u00e4ilitada ridu enamustes maailma keeltes, lisamata seda \u00fcleliigsust, mis on UTF-8-s.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p><i>Distsipliin.<\/i> Teen kohe mitmeid olulisi t\u00e4iendusi: <strong>kirjeldatud lahendust ei pakuta kui universaalset asendust UTF-8-le.<\/strong>, see sobran\u010di, et sobran\u010di sobran\u010di mog\u0105 by\u0107 u\u017cywane do interakcji z pomocami API (o nim i niczym innym). Najcz\u0119\u015bciej do kompaktowego przechowywania du\u017cych obj\u0119to\u015bci danych tekstowych odpowiednie s\u0105 algorytmy kompresji og\u00f3lnego celu (np. deflate). Ponadto, ju\u017c przy tworzeniu rozwi\u0105zania odkry\u0142em istniej\u0105cy standard w samym Unicode, kt\u00f3ry rozwi\u0105zuj\u0119 t\u0119 sam\u0105 sytuacj\u0119 \u2014 jest on nieco bardziej skomplikowany (i czasami gorszy), ale nadal jest przyj\u0119tym standardem, a nie wykonanym na kolanie. O nim r\u00f3wnie\u017c opowiem.<\/p>\n<h2>Unicode i UTF-8<\/h2>\n<p>\nNajpierw \u2014 kilka s\u0142\u00f3w o tym, czym w og\u00f3le jest <strong>Unicode<\/strong> ja <strong>UTF-8<\/strong>.<\/p>\n<p>Nagu teame, olid enne populaarseid 8-bitised kodeeringud. Nendega oli k\u00f5ik lihtne: 256 s\u00fcmbolit saab nummerdada numbritega 0 kuni 255, ja numbrid 0 kuni 255 on ilmselgelt esitatavad \u00fche baitina. Kui tagasi minna algusesse, siis ASCII kodeering piirab end 7 bitiga, seega on tema baitide esitlemine k\u00f5ige vanemas bitis null ja enamus 8-bitiseid kodeeringud on temaga \u00fchilduvad (need erinevad ainult \"\u00fclemises\" osas, kus vanim bitt on \u00fcksteist).<\/p>\n<p>Kuidas erineb Unicode neist kodeeringutest ja miks sellega seondub korraga mitmeid konkreetseid esitusi \u2014 UTF-8, UTF-16 (BE ja LE), UTF-32? Uurime j\u00e4rjekorras.<\/p>\n<p>Unicode'i p\u00f5histandart kirjeldab ainult seoseid s\u00fcmbolite vahel (ja m\u00f5nel juhul \u2014 s\u00fcmbolite eraldi komponentide) ja nende numbrite vahel. Ja v\u00f5imalikke numbreid selles standardis on v\u00e4ga palju \u2014 alates <code><b>0x00<\/b><\/code> kuni <code><b>0x10FFFF<\/b><\/code> (1 114 112 t\u00fckki). Kui sooviksime panna sellises vahemikus oleva numbri muutujasse, ei piisaks meil 1 v\u00f5i 2 baitist. Ja kuna meie protsessorid ei ole h\u00e4sti kohandatud kolmbaitsete numbrite t\u00f6\u00f6tlemiseks, oleksime sunnitud kasutama \u00fche s\u00fcmboli jaoks koguni 4 baidi! See ongi UTF-32, kuid just selle \u201e\u00fclem\u00e4\u00e4rasuse\u201d t\u00f5ttu ei ole see formaat populaarne.<\/p>\n<p>\u00d5nneks on Unicode'i s\u00fcmbolid paigutatud mitte juhuslikult. Nende hulk on jagatud 17 \u201e<em>tasandit<\/em>\u201d, millest iga\u00fches on 65 536 (<code><b>0x10000<\/b><\/code>) \u00ab<em>koodipunkti<\/em>). M\u00f5iste \u201ekoodipunkt\u201d siin on lihtsalt <em>s\u00fcmboli numbri<\/em>, mille Unicode on talle m\u00e4\u00e4ranud. Kuid nagu eelnevalt \u00f6eldud, on Unicode'is nummerdatud mitte ainult \u00fcksikud s\u00fcmbolid, vaid ka nende komponentsed ja teenindavad m\u00e4rgid (ja m\u00f5nikord ei vasta number \u00fcldse millele \u2014 v\u00f5ib-olla ajutiselt, kuid meie jaoks ei ole see niiv\u00f5rd oluline), seega on korrektsem alati r\u00e4\u00e4kida just numbri summast, mitte s\u00fcmbolitest. Siiski, edaspidi kasutan tihti s\u00f5na \u201es\u00fcmbol\u201d, m\u00f5eldes selle all m\u00f5istet \u201ekoodipunkt\u201d.<\/p>\n<p><img decoding=\"async\" alt=\"Kas teadsite, et Linuxi k\u00e4surea saab k\u00e4ivitada iOS seadmes? V\u00f5ib-olla k\u00fcsite: \u201eMiks ma peaksin kasutama teksti rakendusi iPhone&#039;is?\u201c \u00d5ige k\u00fcsimus. Kuid kui loete Opensource.com-i, siis t\u00f5en\u00e4oliselt teate sellele vastust: Linuxi kasutajad tahavad v\u00f5imalust sellega igas seadmes t\u00f6\u00f6tada ja kasutavad oma seadeid. Kuid k\u00f5ige rohkem nad\" src=\"\/wp-content\/uploads\/2020\/10\/7ad84b571a8025582fdbc3db956cb3b0.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Unicode'i tasandid. Nagu n\u00e4ha, on suur osa (tasandid 4 kuni 13) endiselt kasutamata.<\/i><\/p>\n<p>\u0427\u0442\u043e \u0441\u0430\u043c\u043e\u0435 \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u2014 \u0432\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u00ab\u043c\u044f\u043a\u043e\u0442\u043a\u0430\u00bb \u043b\u0435\u0436\u0438\u0442 \u0432 \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438, \u043e\u043d\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f &quot;<em>P\u00f5hiline mitmekeelne tasand<\/em>&quot;. \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 (\u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0439), \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u044d\u0442\u043e\u0439 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438 \u0432\u044b \u043d\u0435 \u0432\u044b\u0439\u0434\u0435\u0442\u0435. \u041d\u043e \u043e\u0442\u0441\u0435\u043a\u0430\u0442\u044c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u042e\u043d\u0438\u043a\u043e\u0434\u0430 \u0442\u043e\u0436\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u2014 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u044d\u043c\u043e\u0434\u0437\u0438 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043f\u043e \u0441\u0447\u0451\u0442\u0443 \u043f\u043b\u043e\u0441\u043a\u043e\u0441\u0442\u0438, &quot;<em>T\u00e4iendav mitmekeelne tasand<\/em>&quot; (\u043e\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043e\u0442 <code><b>0x10000<\/b><\/code> kuni <code><b>0x1FFFF<\/b><\/code>). Seega k\u00e4itub UTF-16 j\u00e4rgmiselt: k\u00f5ik s\u00fcmbolid, mis j\u00e4\u00e4vad <em>P\u00f5hiline mitmekeelne tasand<\/em>, kodeeritakse \"nagu on\", vastavatesse kahebaidistesse numbritesse. Kuid osa numbrid sellest vahemikust ei t\u00e4hista \u00fcldse kindlaid s\u00fcmboleid, vaid n\u00e4itavad, et p\u00e4rast seda kahebaidist paari tuleb arvestada veel \u00fche - kombineerides nende nelja baidi v\u00e4\u00e4rtused, saame numbri, mis katab kogu lubatud Unicode'i vahemiku. Tegu on representatsiooniga, mida nimetatakse \"s\u00fcmpaatilisteks paarideks\" - v\u00f5ib-olla olete neist kuulnud.<\/p>\n<p>Nii et, UTF-16 vajab \u00fche \"koodipunkti\" jaoks kahte v\u00f5i (v\u00e4ga harvadel juhtudel) nelja bitti. See on parem kui pidevalt neli bitti kasutada, kuid ladina t\u00e4hed (ja teised ASCII-s\u00fcmbolid) sellise kodeerimise korral kulutavad pool ruumist nullidele. UTF-8 on seda parandama loodud: ASCII-s kasutatakse selles nagu varem ainult \u00fchte bitti; koodid on <code><b>0x80<\/b><\/code> kuni <code><b>0x7FF<\/b><\/code> \u2014 kaks bitti; <code><b>0x800<\/b><\/code> kuni <code><b>0xFFFF<\/b><\/code> \u2014 kolm, ja <code><b>0x10000<\/b><\/code> kuni <code><b>0x10FFFF<\/b><\/code> \u2014 neli. \u00dchelt poolt on ladina keele puhul k\u00f5ik h\u00e4sti: ASCII \u00fchilduvus on naasnud ning jaotus on n\u00fc\u00fcd \u00fchtlasemalt \"jaotatud\" \u00fchest neljale bitile. Kuid ladina keelest erinevad t\u00e4hed ei suuda v\u00f5rreldes UTF-16-ga paremini hakkama saada, ning paljud vajavad n\u00fc\u00fcd hoopis kolme bitti kahe asemel \u2014 kahebitise salvestuse katteala on kitsenenud 32 korda, alates <code><b>0xFFFF<\/b><\/code> kuni <code><b>0x7FF<\/b><\/code>, \u0438 \u0432 \u043d\u0435\u0433\u043e \u043d\u0435 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0443\u0436\u0435 \u043d\u0438 \u043a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0439, \u043d\u0438, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, \u0433\u0440\u0443\u0437\u0438\u043d\u0441\u043a\u0438\u0439. \u041a\u0438\u0440\u0438\u043b\u043b\u0438\u0446\u0435 \u0438 \u0435\u0449\u0451 \u043f\u044f\u0442\u0438 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0430\u043c \u2014&nbsp;\u0443\u0440\u0430 \u2014&nbsp;\u043f\u043e\u0432\u0435\u0437\u043b\u043e, 2 \u0431\u0430\u0439\u0442\u0430 \u043d\u0430 \u0441\u0438\u043c\u0432\u043e\u043b.<\/p>\n<p>Kuidas see nii on? Vaatame, kuidas UTF-8 esindab s\u00fcmbolite koode:<br \/>\n<img decoding=\"async\" alt=\"Kas teadsite, et Linuxi k\u00e4surea saab k\u00e4ivitada iOS seadmes? V\u00f5ib-olla k\u00fcsite: \u201eMiks ma peaksin kasutama teksti rakendusi iPhone&#039;is?\u201c \u00d5ige k\u00fcsimus. Kuid kui loete Opensource.com-i, siis t\u00f5en\u00e4oliselt teate sellele vastust: Linuxi kasutajad tahavad v\u00f5imalust sellega igas seadmes t\u00f6\u00f6tada ja kasutavad oma seadeid. Kuid k\u00f5ige rohkem nad\" src=\"\/wp-content\/uploads\/2020\/10\/4ef4fe9e949cd75295c45c053dbca6d3.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOtse numbrite esitlemiseks on siin kasutatud bitte, mis on t\u00e4histatud s\u00fcmboliga <code><b>x<\/b><\/code>. On n\u00e4htav, et kaheastmelises salvestuses on selliseid bite vaid 11 (16-st). Esimesed bitid t\u00e4idavad siin ainult teenusfunktsiooni. Neljavalugarenguga salvestamise puhul on koodipunktile m\u00e4\u00e4ratud tervelt 21 bitti 32-st \u2014 n\u00e4iliselt piisaks siinkohal kolmest baitist (mis annavad kokku 24 bitti), kuid teenindusm\u00e4rgid neelavad liiga palju.<\/p>\n<p>Kas see on halb? Tegelikult ei ole. \u00dchelt poolt \u2013 kui me t\u00f5eliselt hoolime ruumist, on meil olemas kokkusurutuse algoritmid, mis suudavad kergesti eemaldada kogu liigse entropia ja \u00fcleliigse teabe. Teiselt poolt oli Unicode'i eesm\u00e4rk pakkuda v\u00f5imalikult universaalset kodeerimist. N\u00e4iteks saame UTF-8 kodeeritud stringi usaldada koodi, mis enne t\u00f6\u00f6tas ainult ASCII-ga, ja ei pea kartma, et seal on ASCII vahemikust p\u00e4rit m\u00e4rk, mida seal tegelikult ei ole (sest UTF-8-s on k\u00f5ik baitid, mis algavad nullbitiga, just need ASCII baitid). Ja kui soovime \u00e4kki suurtest stringidest v\u00e4ikest osa \u00e4ra l\u00f5igata, ilma et peaksime seda algusest de\u0161ifreerima (v\u00f5i taastama osa teavet p\u00e4rast kahjustatud osa) \u2013 ei ole meil keeruline leida offset, kus m\u00f5ni m\u00e4rk algab (piisab, kui vahele j\u00e4tta baitidega, millel on bitiprefiks). <code><b>10<\/b><\/code>).<\/p>\n<h2>Miks siis midagi uut v\u00e4lja m\u00f5elda?<\/h2>\n<p>\nSamas on aeg-ajalt olukordi, kus peale kokkusurumise algoritmide nagu deflate ei ole head rakendust, kuid tahame stringe tihedalt salvestada. Isiklikult olen sellise probleemiga silmitsi seisnud, m\u00f5eldes <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Radix_tree\">kokkusurutud eelprefiksi puu<\/a><\/noindex> suure s\u00f5navara jaoks, mis sisaldab s\u00f5nu mitmesugustes keeltes. \u00dchest k\u00fcljest on iga s\u00f5na v\u00e4ga l\u00fchike, seega selle kokkusurumine ei ole efektiivne. Teisest k\u00fcljest, puu rakendamine, mida ma kaalusin, oli m\u00f5eldud selliseks, et iga salvestatud stringi bait genereeris eraldi puu tipu, nii et nende arvu minimeerimine oli v\u00e4ga kasulik. Minu raamatukogus <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/deNULL\/Az.js\">Az.js<\/a><\/noindex> (nagu ka <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kmike\/pymorphy2\">pymorphy2<\/a><\/noindex>, millel see p\u00f5hineb) lahendatakse sarnane probleem lihtsalt \u2013 stringid, mis on pakitud <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Deterministic_acyclic_finite_state_automaton\">DAWG<\/a><\/noindex>-s\u00f5naraamatuks, hoitakse seal <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/deNULL\/Az.js\/blob\/master\/src\/az.dawg.js\">vana hea CP1251<\/a><\/noindex>. Kuid, nagu ei ole raske m\u00f5ista, toimib see h\u00e4sti ainult piiratud t\u00e4hestiku puhul \u2013 sellesse s\u00f5naramatusse ei saa enam hiina keeli rida kokku panna.<\/p>\n<p>Erakordselt m\u00e4rgin veel \u00fchte ebameeldivat n\u00fcanssi, mis tekib UTF-8 kasutamisel sellises andmestruktuuris. \u00dclaloleval pildil on n\u00e4ha, et kui s\u00fcmboli kirjutamisel kasutatakse kahte bait, ei ole tema numbrile kuuluvad bitid j\u00e4rjestikused, vaid katkenud paarist biit <code><b>10<\/b><\/code> keskel: <code><b>110xxxxx 10xxxxxx<\/b><\/code>. Selle tulemusena, kui teise baiti madalamad 6 bitti s\u00fcmboli koodis \u00fcle voolavad (st toimub \u00fcleminek <code><b>10111111<\/b><\/code> \u2192 <code><b>10000000<\/b><\/code>), muutub ka esimene bait. Selgub, et t\u00e4ht '\u043f' t\u00e4histatakse baitidega <code><b>0xD0&nbsp;0xBF<\/b><\/code>, ja j\u00e4rgnev \u00abr\u00bb \u2014 on juba <code><b>0xD1&nbsp;0x80<\/b><\/code>. Eelmises puu struktuuris t\u00e4hendab see vanema s\u00f5lme jagunemist kaheks \u2014 \u00fcheks eelseisva jaoks <code><b>0xD0<\/b><\/code>, ja teiseks <code><b>0xD1<\/b><\/code> (kuigi kogu kirillitsa saaks kodeerida ainult teise baitiga).<\/p>\n<h2>Mis mul v\u00e4lja tuli<\/h2>\n<p>\nKuna silmitsi seisain selle \u00fclesandega, otsustasin veidi harjutada bitim\u00e4ngude abil ning tutvuda ka Unicode'i struktuuriga kui sellisega. Tulemuseks sai kodeerimisvorming UTF-C (\u00abC\u00bb tuleneb <em>kompaktne<\/em>), mis ei kuluta rohkem kui 3 baiti \u00fche koodipunkti kohta ja v\u00f5imaldab tihti kulutada vaid <strong>\u00fche lisabaiti kogu kodeeritud rida<\/strong>. See toob kaasa, et paljude mitte-ASCII t\u00e4hestike puhul osutub selline kodeerimine <strong>30-60% kompaktsemaks kui UTF-8<\/strong>.<\/p>\n<p>Olen v\u00e4ljendanud kodeerimise ja dekodeerimise algoritmide n\u00e4iteid <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/deNULL\/utf-c\">teekide kujul JavaScriptis ja Go's<\/a><\/noindex>, v\u00f5ite neid oma koodis vabalt kasutada. Kuid siiski r\u00f5hutaksin, et m\u00f5nes m\u00f5ttes j\u00e4\u00e4b see formaat \u00abrataste leiutamiseks\u00bb, ja ma ei soovita seda kasutada <strong>ilma teadmiseta, milleks see teile vajalik on<\/strong>. See, see, it's more of an experiment than a serious 'improvement of UTF-8'. Nevertheless, the code is written neatly, concisely, with a large number of comments and test coverage.<\/p>\n<p><img decoding=\"async\" alt=\"Kas teadsite, et Linuxi k\u00e4surea saab k\u00e4ivitada iOS seadmes? V\u00f5ib-olla k\u00fcsite: \u201eMiks ma peaksin kasutama teksti rakendusi iPhone&#039;is?\u201c \u00d5ige k\u00fcsimus. Kuid kui loete Opensource.com-i, siis t\u00f5en\u00e4oliselt teate sellele vastust: Linuxi kasutajad tahavad v\u00f5imalust sellega igas seadmes t\u00f6\u00f6tada ja kasutavad oma seadeid. Kuid k\u00f5ige rohkem nad\" src=\"\/wp-content\/uploads\/2020\/10\/e31978174449cd7de5d8371aaeb9ab2e.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Test results and comparison with UTF-8<\/i><\/p>\n<p>I also created <noindex><a rel=\"nofollow\" href=\"https:\/\/denull.github.io\/utf-c\/\">a demo page<\/a><\/noindex>, where you can evaluate the algorithm's performance, and then I will explain its principles and development process in more detail.<\/p>\n<h2>Eliminating redundant bits<\/h2>\n<p>\nI based it on UTF-8, of course. The first and most obvious thing we can change is to reduce the number of control bits in each byte. For example, the first byte in UTF-8 always starts either with <code><b>0<\/b><\/code>, or with <code><b>11<\/b><\/code> \u2014 and the prefix <code><b>10<\/b><\/code> is only present in the following bytes. Let's replace the prefix <code><b>11<\/b><\/code> j\u00e4rgnevaga <code><b>1<\/b><\/code>, and completely remove the prefixes from the subsequent bytes. What will we get?<\/p>\n<p><code><b>0xxxxxxx<\/b><\/code> \u2014 1 byte <br \/>\n<code><b>10xxxxxx xxxxxxxx<\/b><\/code> \u2014 2 bytes <br \/>\n<code><b>110xxxxx xxxxxxxx xxxxxxxx<\/b><\/code> \u2014 3 bytes<\/p>\n<p>Wait, but where is the four-byte representation? It's no longer needed \u2014 with a three-byte representation we now have access to 21 bits, which is more than enough for all numbers up to <code><b>0x10FFFF<\/b><\/code>.<\/p>\n<p>Mida me siin ohverdasime? Peamine on, et me ei suuda leida s\u00fcmbolite piire mingi juhusliku koha kaudu puhvrisse. Me ei saa lihtsalt juhuslikku baidi n\u00e4ppida ja leida sealt j\u00e4rgmise s\u00fcmboli algust. See on meie formaadi piirang, kuid praktikas ei ole selline vajadus sage. T\u00fc\u00fcpiliselt suudame puhvrisse alates algusest joosta (eriti kui tegemist on l\u00fchikeste ridadega).<\/p>\n<p>Kaks baitide keelekatte olukord on samuti paranenud: n\u00fc\u00fcd annab kahet\u00e4heline formaat 14-bitisest ulatusest, mis t\u00e4hendab koode kuni <code><b>0x3FFF<\/b><\/code>. Hiinlased ei ole \u00f5nnelikud (nende hierogl\u00fcfid j\u00e4\u00e4vad enamasti vahemikku <code><b>0x4E00<\/b><\/code> kuni <code><b>0x9FFF<\/b><\/code>), kuid kaupmeestele ja paljudele teistele rahvastele on see r\u00f5\u00f5mustav \u2014 nende keeled mahuvad samuti 2 baidi s\u00fcmbolisse.<\/p>\n<h2>Sissejuhatus kodeerija olekusse<\/h2>\n<p>\nN\u00fc\u00fcd m\u00f5tleme ridade omadustele. S\u00f5nastikus on enamasti s\u00f5nad, mis on kirjutatud \u00fche t\u00e4hestiku s\u00fcmbolitega, ja paljude teiste tekstide jaoks on see t\u00f5si. Oleks hea \u00fchel korral n\u00e4idata seda t\u00e4hestikku ja edaspidi n\u00e4idata ainult t\u00e4he numbrit selle sees. Vaadake, kas Unicode'i tabelisse paigutamine aitab meid.<\/p>\n<p>Nagu eespool mainitud, on Unicode jagatud <em>tasanditeks<\/em> iga 65536 koodi iga\u00fches. Kuid see ei ole eriti kasulik jagamine (nagu juba mainitud, oleme enamasti nulltasandil). Huvi pakub rohkem jagamine <em>plokkideks.<\/em> Need vahemikud ei oma enam kindlat pikkust ja kannavad rohkem t\u00e4hendust \u2014 reeglina \u00fchendavad need t\u00e4hem\u00e4rke \u00fchest t\u00e4hestikust.<\/p>\n<p><img decoding=\"async\" alt=\"Kas teadsite, et Linuxi k\u00e4surea saab k\u00e4ivitada iOS seadmes? V\u00f5ib-olla k\u00fcsite: \u201eMiks ma peaksin kasutama teksti rakendusi iPhone&#039;is?\u201c \u00d5ige k\u00fcsimus. Kuid kui loete Opensource.com-i, siis t\u00f5en\u00e4oliselt teate sellele vastust: Linuxi kasutajad tahavad v\u00f5imalust sellega igas seadmes t\u00f6\u00f6tada ja kasutavad oma seadeid. Kuid k\u00f5ige rohkem nad\" src=\"\/wp-content\/uploads\/2020\/10\/61ea5e859d7e6d9c75e977a3579ff28f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Plokk, mis sisaldab bengali t\u00e4hestiku m\u00e4rke. Kahjuks on ajaloolistel p\u00f5hjustel see n\u00e4ide mitte eriti tihedast pakendist \u2014 96 m\u00e4rk on juhuslikult laiali laotatud 128 koodipunkti plokis.<\/i><\/p>\n<p>Plokkide algused ja nende suurused on alati 16-ga jagatavad \u2014 see on tehtud mugavuse huvides. Lisaks algab ja l\u00f5ppeb paljusid plokke v\u00e4\u00e4rtustega, mis on jagatavad 128 v\u00f5i isegi 256 \u2014 n\u00e4iteks p\u00f5hikirillitsa h\u00f5lmab 256 baiti alates <code><b>0x0400<\/b><\/code> kuni <code><b>0x04FF<\/b><\/code>. See on \u00fcsna mugav: kui me \u00fchel korral salvestame prefiksi <code><b>0x04<\/b><\/code>, siis saab iga kirillitsakiri edasi kirjutada \u00fchebaitiliselt. Kahjuks kaotame sellega v\u00f5imaluse naasta ASCII juurde (ja mis tahes muude m\u00e4rkide juurde). Seet\u00f5ttu teeme nii:<\/p>\n<ol>\n<li>Kaksbait <code><b>10aastat yxxxxxxx<\/b><\/code> n\u00e4itavad mitte ainult t\u00e4hte numbriga <code><b>yyyyyy yxxxxxxx<\/b><\/code>, vaid muudavad <em>praegust t\u00e4hestikku<\/em> j\u00e4rgnevaga <code><b>yyyyyy y0000000<\/b><\/code> (st salvestame k\u00f5ik bitid, v\u00e4lja arvatud madalamad <strong>7 bitti<\/strong>);<\/li>\n<li>\u00dcks bait <code><b>0xxxxxxx<\/b><\/code> see on praeguse t\u00e4hestiku s\u00fcmbol. Seda tuleb lihtsalt liita selle nihkega, mille me m\u00e4letasime sammul 1. Praegu me t\u00e4hestikku ei muutnud, seega on nihe null, nii et me s\u00e4ilitame \u00fchilduvuse ASCII-ga.<\/li>\n<\/ol>\n<p>\nSarnaselt ka koodidele, mis vajavad 3 baiti:<\/p>\n<ol>\n<li>Kolm baiti <code><b>110yyyyy yxxxxxxx xxxxxxxx<\/b><\/code> t\u00e4histavad s\u00fcmbolit numbriga <code><b>yyyyyy yxxxxxxx xxxxxxxx<\/b><\/code>, muudab <em>praegust t\u00e4hestikku<\/em> j\u00e4rgnevaga <code><b>yyyyyy y0000000 00000000<\/b><\/code> (m\u00e4letasime k\u00f5ik, v\u00e4lja arvatud madalamad <strong>15 bitti<\/strong>), ja seab lipu, et me n\u00fc\u00fcd oleme <em>pikk<\/em> re\u017eiimil (alfaane tagasi kahebae \u00f5ltesse muutes, me kustutame selle lipu);<\/li>\n<li>Kaksbait <code><b>0xxxxxxx xxxxxxxx<\/b><\/code> pika re\u017eiimi korral on see praeguse t\u00e4hestiku s\u00fcmbol. Sarnaselt liidame selle samme 1 nihega. K\u00f5ik vahe on ainult selles, et n\u00fc\u00fcd loeme kahte baati (sest me oleme sellesse re\u017eiimi l\u00fclitumiseks).<\/li>\n<\/ol>\n<p>\nK\u00f5lab h\u00e4sti: n\u00fc\u00fcd, kuni me peame kodeerima s\u00fcmboleid \u00fchest samast 7-bitise Unicode vahemikku, kulutame me 1 \u00fclekande baati alguses ja ainult \u00fche baati iga s\u00fcmboli kohta.<\/p>\n<p><img decoding=\"async\" alt=\"Kas teadsite, et Linuxi k\u00e4surea saab k\u00e4ivitada iOS seadmes? V\u00f5ib-olla k\u00fcsite: \u201eMiks ma peaksin kasutama teksti rakendusi iPhone&#039;is?\u201c \u00d5ige k\u00fcsimus. Kuid kui loete Opensource.com-i, siis t\u00f5en\u00e4oliselt teate sellele vastust: Linuxi kasutajad tahavad v\u00f5imalust sellega igas seadmes t\u00f6\u00f6tada ja kasutavad oma seadeid. Kuid k\u00f5ige rohkem nad\" src=\"\/wp-content\/uploads\/2020\/10\/084d636a25dccdaa9f5a6eb5233c8e99.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>\u00dche varasema versiooni t\u00f6\u00f6. Juba sageli \u00fcletab UTF-8, kuid veel on millega parandada.<\/i><\/p>\n<p>Mis muutus halvemaks? Esiteks, meil on seisund, nimelt <em>praeguse t\u00e4hestiku nihke<\/em> ja lipp <em>pikk re\u017eiim<\/em>. See, see, see! N\u00fc\u00fcd on sama m\u00e4rk erinevates kontekstides erinevalt kodeeritud. Alams\u00f5nade otsimise k\u00e4igus peame arvestama sellega, mitte lihtsalt v\u00f5rreldes bite. Teiseks, niipea kui me t\u00e4hestiku muutume, on ASCII m\u00e4rkide kodeerimisega raskeid aegu (see ei ole ainult ladina t\u00e4hestik, vaid ka p\u00f5hipunktsioon, sealhulgas t\u00fchikud) - need n\u00f5uavad t\u00e4hestiku uuendamist 0-s, st j\u00e4lle \u00fchte liigset bitti (ja siis veel \u00fche, et naasta p\u00f5hijuhiste juurde).<\/p>\n<h2>\u00dcks t\u00e4hestik on hea, kaks - parem<\/h2>\n<p>\nProovime veidi muuta meie bittide eelfikseerimist, lisades kolm \u00fclalnimetatud:<\/p>\n<p><code><b>0xxxxxxx<\/b><\/code> - 1 bait tavare\u017eiimis, 2 pikemas re\u017eiimis <br \/>\n<code><b>11xxxxxx<\/b><\/code> \u2014 1 byte <br \/>\n<code><b>100xxxxx xxxxxxxx<\/b><\/code> \u2014 2 bytes <br \/>\n<code><b>101xxxxx xxxxxxxx xxxxxxxx<\/b><\/code> \u2014 3 bytes<\/p>\n<p><img decoding=\"async\" alt=\"Kas teadsite, et Linuxi k\u00e4surea saab k\u00e4ivitada iOS seadmes? V\u00f5ib-olla k\u00fcsite: \u201eMiks ma peaksin kasutama teksti rakendusi iPhone&#039;is?\u201c \u00d5ige k\u00fcsimus. Kuid kui loete Opensource.com-i, siis t\u00f5en\u00e4oliselt teate sellele vastust: Linuxi kasutajad tahavad v\u00f5imalust sellega igas seadmes t\u00f6\u00f6tada ja kasutavad oma seadeid. Kuid k\u00f5ige rohkem nad\" src=\"\/wp-content\/uploads\/2020\/10\/fa1eca1adb80b15a4cf4f60f57a09c6c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKaks baiti kirjutamise korral on n\u00fc\u00fcd \u00fcks bitti v\u00e4hem - koodipunktid mahtuvad kuni <code><b>0x1FFF<\/b><\/code>, mitte <code><b>0x3FFF<\/b><\/code>. Kuid siiski on see endiselt m\u00e4rgatavalt rohkem kui kahe baitide UTF-8 koodides, enamik levinud keeli mahub endiselt, k\u00f5ige silmatorkavam kaotus - kadunuks j\u00e4i <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A5%D0%B8%D1%80%D0%B0%D0%B3%D0%B0%D0%BD%D0%B0\">hiragana<\/a><\/noindex> ja <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9A%D0%B0%D1%82%D0%B0%D0%BA%D0%B0%D0%BD%D0%B0\">katakana<\/a><\/noindex>, ja jaapanlased on mures.<\/p>\n<p>Mis on see uus kood <code><b>11xxxxxx<\/b><\/code>? \u042d\u0442\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u00ab\u0437\u0430\u0433\u0430\u0448\u043d\u0438\u043a\u00bb \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0432 64 \u0441\u0438\u043c\u0432\u043e\u043b\u0430, \u043e\u043d \u0434\u043e\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0448 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0430\u043b\u0444\u0430\u0432\u0438\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043d\u0430\u0437\u0432\u0430\u043b \u0435\u0433\u043e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c (<em>auxiliary<\/em>) t\u00e4hestik. Kui me vahetame praegust t\u00e4hestikku, muutub osa vanast t\u00e4hestikust abiks. N\u00e4iteks, kui vahetame ASCII pealt kirillitsi peale - \u201esalvestusruumis\u201c on n\u00fc\u00fcd 64 s\u00fcmbolit, mis sisaldavad <strong>ladina t\u00e4hestikku, numbreid, t\u00fchikuid ja koma<\/strong> (k\u00f5ige sagedasemad lisandused mitte-ASCII tekstides). Vahetame tagasi ASCII peale - ja abiks t\u00e4hestikuks saab suurem osa kirillitsast.<\/p>\n<p>Kuna meil on juurdep\u00e4\u00e4s kahele t\u00e4hestikule, suudame hallata suuremat hulka tekste, mis n\u00f5uab minimaalset vahetust t\u00e4hestike vahel (punktuatsioon toob meid sagedasti tagasi ASCII peale, aga p\u00e4rast seda saame paljusid mitte-ASCII s\u00fcmboleid hankida juba abistavast t\u00e4hestikust, ilma et peaksime uuesti vahetama).<\/p>\n<p>Boonus: t\u00e4histades abistavat t\u00e4hestikku eesliitega <code><b>11xxxxxx<\/b><\/code> ja valides selle algse nihke <code><b>0xC0<\/b><\/code>, saame osalise \u00fchilduvuse CP1252-ga. Teisis\u00f5nu, paljud (aga mitte k\u00f5ik) l\u00e4\u00e4ne-Euroopa tekstid, mis on kodeeritud CP1252-s, n\u00e4evad v\u00e4lja samad ka UTF-C-s.<\/p>\n<p>Siin tekib t\u00f5epoolest probleem: kuidas saada p\u00f5hialfabeedist k\u00f5rvalalfabeet? Samuti on v\u00f5imalik j\u00e4tta sama nihke, kuid \u2014 kahjuks \u2014 siin m\u00e4ngib Unicode struktuur meie vastu. Sageli asub p\u00f5hialfabeedi suurem osa blokis mitte alguses (n\u00e4iteks on vene suurt\u00e4he \"\u0410\" kood <code>0x04<b>10<\/b><\/code>, kuigi kirillitsablokk algab <code>0x04<b>00<\/b><\/code>). Seega, kui v\u00f5tame \"varu\" esimesed 64 s\u00fcmbolit, v\u00f5ime kaotada juurdep\u00e4\u00e4su alfabeedi sabale.<\/p>\n<p>Selle probleemi k\u00f5rvaldamiseks k\u00e4isin k\u00e4sitsi l\u00e4bi m\u00f5ned erinevate keelte blokid ja m\u00e4\u00e4rasin neile p\u00f5hialfabeedi sees k\u00f5rvalalfabeedi nihke. Ladina t\u00e4hestik, erandina, on \u00fcldse \u00fcmber korraldatud nagu base64.<\/p>\n<p><img decoding=\"async\" alt=\"Kas teadsite, et Linuxi k\u00e4surea saab k\u00e4ivitada iOS seadmes? V\u00f5ib-olla k\u00fcsite: \u201eMiks ma peaksin kasutama teksti rakendusi iPhone&#039;is?\u201c \u00d5ige k\u00fcsimus. Kuid kui loete Opensource.com-i, siis t\u00f5en\u00e4oliselt teate sellele vastust: Linuxi kasutajad tahavad v\u00f5imalust sellega igas seadmes t\u00f6\u00f6tada ja kasutavad oma seadeid. Kuid k\u00f5ige rohkem nad\" src=\"\/wp-content\/uploads\/2020\/10\/d191a3bb17403e99d506dbd008b63159.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>Viimased n\u00e4pun\u00e4ited<\/h2>\n<p>\nM\u00f5tleme l\u00f5puks, kus me saaksime midagi veel t\u00e4iendada.<\/p>\n<p>T m\u00e4rkige, et formaat <code><b>101xxxxx xxxxxxxx xxxxxxxx<\/b><\/code> v\u00f5imaldab kodeerida numbreid kuni <code><b>0x1FFFFF<\/b><\/code>, kuid Unicode l\u00f5peb varem, numbril <code><b>0x10FFFF<\/b><\/code>. Teisis\u00f5nu, viimane koodipunkt esitatakse kui <code><b>10110000 11111111 11111111<\/b><\/code>. Niisiis, v\u00f5ime \u00f6elda, et kui esimene bait on kujul <code><b>1011xxxx<\/b><\/code> (kus <code><b>xxxx<\/b><\/code> rohkem kui 0), siis see t\u00e4histab midagi muud. N\u00e4iteks v\u00f5ib sinna lisada veel 15 s\u00fcmbolit, mis on pidevalt kooditav \u00fche baitiga, kuid ma otsustasin k\u00e4ituda teisiti.<\/p>\n<p>Vaadakem neid Unicode'i bloke, mis n\u00f5uavad praegu kolme bait. Peamiselt on need, nagu juba mainitud, hiina hierogl\u00fc\u00fcfid \u2014 kuid neid on raske midagi teha, neid on 21 tuhat. Kuid sinna on lennanud ka hiragana ja katakana \u2014 ning neid on juba v\u00e4hem, v\u00e4hem kui kakssada. Ja kuna me meenutasime jaapanlasi \u2014 seal on ka emotikonid (tegelikult on neid palju hajutatud Unicode'is, kuid peamised blokid on vahemikus <code><b>0x1F300<\/b><\/code> \u2013 <code><b>0x1FBFF<\/b><\/code>). Kui m\u00f5elda, et praegu eksisteerivad emotikonid, mis koosnevad kohe mitmest koodipunktist (n\u00e4iteks emotikon \u200d\u200d\u200d<noindex><a rel=\"nofollow\" href=\"https:\/\/emojipedia.org\/family-woman-woman-girl-boy\/\"><img decoding=\"async\" alt=\"Kas teadsite, et Linuxi k\u00e4surea saab k\u00e4ivitada iOS seadmes? V\u00f5ib-olla k\u00fcsite: \u201eMiks ma peaksin kasutama teksti rakendusi iPhone&#039;is?\u201c \u00d5ige k\u00fcsimus. Kuid kui loete Opensource.com-i, siis t\u00f5en\u00e4oliselt teate sellele vastust: Linuxi kasutajad tahavad v\u00f5imalust sellega igas seadmes t\u00f6\u00f6tada ja kasutavad oma seadeid. Kuid k\u00f5ige rohkem nad\" src=\"\/wp-content\/uploads\/2020\/10\/76cd12423b241cc316af80f03be4348f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex> koosneb lausa 7 koodist!), siis on kahju kulutada iga\u00fchele kolm baidi (7\u00d73 = 21 baidi \u00fche s\u00fcmboli jaoks, \u00f5udne, eks).<\/p>\n<p>Seega valime v\u00e4lja m\u00f5ned valitud vahemikud, mis vastavad emotikonidele, hiraganale ja katakanale, nummerdame need \u00fchte pidevasse loetellu ja kodeerime kahe baitina kolme asemel:<\/p>\n<p><code><b>1011xxxx xxxxxxxx<\/b><\/code> <\/p>\n<p>Suurep\u00e4rane: \u00fclalmainitud emotikon \u200d\u200d\u200d<noindex><a rel=\"nofollow\" href=\"https:\/\/emojipedia.org\/family-woman-woman-girl-boy\/\"><img decoding=\"async\" alt=\"Kas teadsite, et Linuxi k\u00e4surea saab k\u00e4ivitada iOS seadmes? V\u00f5ib-olla k\u00fcsite: \u201eMiks ma peaksin kasutama teksti rakendusi iPhone&#039;is?\u201c \u00d5ige k\u00fcsimus. Kuid kui loete Opensource.com-i, siis t\u00f5en\u00e4oliselt teate sellele vastust: Linuxi kasutajad tahavad v\u00f5imalust sellega igas seadmes t\u00f6\u00f6tada ja kasutavad oma seadeid. Kuid k\u00f5ige rohkem nad\" src=\"\/wp-content\/uploads\/2020\/10\/b9900c78dda5d8e596e3751021b4d35d.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex>, koosneb 7 koodipunktist, kasutab UTF-8s 25 baidi, kuid me mahutasime selle <strong>14<\/strong> (t\u00e4pselt kaks baiti iga koodipunkti kohta). \u00dctlen, et Habr loobus selle t\u00f6\u00f6tlemisest (nii vanas kui ka uues toimetajas), seega pidi selle piltidena sisse lisama.<\/p>\n<p>Proovime veel \u00fche probleemi lahendada. Nagu me m\u00e4letame, on p\u00f5hiline t\u00e4hestik tegelikult <strong>\u00fclemised 6 bitti<\/strong>, mida me meeles hoiame, ja liimime iga j\u00e4rgmise dekodeeritava s\u00fcmboli koodi k\u00fclge. Hiina m\u00e4rkide puhul, mis asuvad plokis <code><b>0x4E00<\/b><\/code> \u2013 <code><b>0x9FFF<\/b><\/code>, on see kas bit 0 v\u00f5i 1. See ei ole kuigi mugav: me peame pidevalt t\u00e4hestikku nende kahe v\u00e4\u00e4rtuse vahel vahetama (st kulutama kolm baiti). Kuid m\u00e4rkame, et pika re\u017eiimi korral v\u00f5ime ise koodist lahutada s\u00fcmbolite arvu, mida me l\u00fchikeses re\u017eiimis kodeerime (k\u00f5ikide \u00fclaltoodud trikkide j\u00e4rel on see 10240) \u2014 siis nihkub m\u00e4rkide vahemik <code><b>0x2600<\/b><\/code> \u2013 <code><b>0x77FF<\/b><\/code>, ja sellel vahemikul on \u00fclemised 6 bitti (21-st) v\u00f5rdsed 0-ga. Sel viisil kasutavad m\u00e4rkide j\u00e4rjestused iga m\u00e4rkide kohta kahte baidit (mis on optimaalsed nii suure vahemiku jaoks), p\u00f5hjustamata t\u00e4hestiku vahetusi. <\/p>\n<h2>Alternatiivsed lahendused: SCSU, BOCU-1<\/h2>\n<p>\nUnicode'i ekspertid, lugedes juba artikli pealkirja, t\u00f5en\u00e4oliselt kiirustavad meenutama, et Unicode'i standardite seas on olemas <noindex><a rel=\"nofollow\" href=\"https:\/\/www.unicode.org\/reports\/tr6\/tr6-4.html\">Standard Compression Scheme for Unicode<\/a><\/noindex> (SCSU), mis kirjeldab kodeerimise meetodit, mis sarnaneb artiklis toodud kirjeldatule.<\/p>\n<p>Pean ausalt \u00fctlema: ma sain selle olemasolust teada alles siis, kui olin s\u00fcgavale oma lahenduse kirjutamisse sukeldunud. Kui oleksin sellest algusest peale teadnud, oleksin t\u00f5en\u00e4oliselt proovinud kirjutada selle rakenduse, mitte v\u00e4lja m\u00f5elda oma l\u00e4henemisviisi.<\/p>\n<p>Huvitav on see, et SCSU kasutab ideid, mis on v\u00e4ga sarnased nendega, milleni ma iseseisvalt j\u00f5udsin (seal kasutatakse \u201eaken\u201d m\u00f5istet \u201ealfabeetide\u201d asemel ning neid on rohkem kui mul). Samas on sellel formaadil ka puudusi: see on kodeerimisele l\u00e4hemal kui\u538b\u7f29\u7b97\u6cd5. Eriti, et standard pakub palju esitusviise, kuid ei \u00fctle, kuidas neist optimaalset valida \u2014 selleks peab edastaja rakendama teatud heuristikat. Seega on SCSU kodner, mis annab hea pakkimise, keerulisem ja mahukam kui minu algoritm.<\/p>\n<p>V\u00f5rdluseks olen ma viinud lihtsa SCSU rakenduse JavaScriptis \u2014 koodimaht on sarnane minu UTF-C-ga, kuid erinevates olukordades n\u00e4itas see tulemusi isegi k\u00fcmneid protsente halvemini (m\u00f5nikord v\u00f5ib see seda ka \u00fcletada, kuid mitte palju). N\u00e4iteks heebrea ja kreeka tekstid kodeerib UTF-C koguni <strong>60% paremini kui SCSU<\/strong> (t\u00f5en\u00e4oliselt nende kompaktsete t\u00e4hestike t\u00f5ttu).<\/p>\n<p>Lisaks \u00fctlen, et peale SCSU on olemas ka teine viis Unicode'i kompaktseks esitlemiseks \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Binary_Ordered_Compression_for_Unicode\">BOCU-1<\/a><\/noindex>, kuid selle eesm\u00e4rk on tagada \u00fchilduvus MIME'iga (mida ma ei vajanud), ja see kasutab veidi erinevat kodeerimismeetodit. Selle t\u00f5husust ma ei hinnanud, aga mulle tundub, et see ei ole t\u00f5en\u00e4oliselt SCSU-st k\u00f5rgem.<\/p>\n<h2>V\u00f5imalikud t\u00e4iustused<\/h2>\n<p>\nAntud algoritm ei ole disaini poolest universaalne (selles osas, t\u00f5en\u00e4oliselt, eristuvad minu eesm\u00e4rgid k\u00f5ige rohkem Unicode'i konsortsiumi eesm\u00e4rkidest). Olen juba maininud, et see on peamiselt v\u00e4lja t\u00f6\u00f6tatud \u00fche \u00fclesande (mitmekeelse s\u00f5nastiku hoidmise ees prefix puu) jaoks, ja m\u00f5ned selle omadused v\u00f5ivad teiste \u00fclesannete jaoks halvasti sobida. Kuid see, et see ei ole standard, v\u00f5ib olla ka pluss \u2014 <strong>saate seda h\u00f5lpsasti oma vajadustele kohandada<\/strong>.<\/p>\n<p>N\u00e4iteks saab selgelt loobuda olekust, muuta kodeerimise stateless - lihtsalt mitte v\u00e4rskendada muutujaid <code><b>lahendused<\/b><\/code>, <code><b>auxOffs<\/b><\/code> ja <code><b>is21Bit<\/b><\/code> kodeerijas ja dekodeerijas. Sel juhul ei \u00f5nnestu t\u00f5husalt kokku suruda sama alfabeti s\u00fcmbolite j\u00e4rjestusi, kuid tagatakse, et sama s\u00fcmbol kodeeritakse alati samade baitidega, s\u00f5ltumata kontekstist.<\/p>\n<p>Lisaks saab kodeerijat t\u00e4psustada konkreetse keele jaoks, muutes vaikeolekut - n\u00e4iteks vene tekstide puhul seada alguses kodeerija ja dekodeerija <code><b>offs = 0x0400<\/b><\/code> ja <code><b>auxOffs = 0<\/b><\/code>. Eriti m\u00f5istlik on see just stateless re\u017eiimis. \u00dcldiselt sarnaneb see vana kaheksabitis\u00fcsteemi kasutamisega, kuid ei v\u00e4lista vajaduse korral s\u00fcmbolite lisamise v\u00f5imalust k\u00f5igist Unicode'ist.<\/p>\n<p>Veel \u00fcks eelnevalt mainitud puudus on see, et UTF-C-koodimist kasutavas mahukates tekstides pole kiiret viisi leida s\u00fcmboli piiri, mis asub suvalise baitide l\u00e4hedal. Kui l\u00f5ikad kodeeritud puhverest viimased, \u00fctleme, 100 baiti, riskid saada r\u00e4mpsu, millega ei saa midagi teha. Paljude gigabaitide logide hoidmiseks pole kodeering m\u00f5eldud, kuid igal juhul on v\u00f5imalik seda parandada. Bait <code><b>0xBF<\/b><\/code> ei tohi kunagi esimesena esineda (kuid v\u00f5ib olla teiseks v\u00f5i kolmandaks). Seet\u00f5ttu v\u00f5ib kodeerimise ajal sisestada j\u00e4rjestuse <code><b>0xBF 0xBF 0xBF<\/b><\/code> iga, \u00fctleme, 10 kB j\u00e4rel \u2014 siis piisab valitud osa skannimisest, et leida piir, kuni leiate sarnase m\u00e4rgise. Viimasele j\u00e4rgneb <code><b>0xBF<\/b><\/code> garanteeritult s\u00fcmboli algus. (Dekodeerimisel tuleb seda kolmest baitist koosnevat j\u00e4rjestust muidugi ignoreerida.)<\/p>\n<h2>Kokkuv\u00f5tteks<\/h2>\n<p>\nKui olete siiani j\u00f5udnud \u2014 palju \u00f5nne! Loodan, et te, nagu mina, \u00f5ppisite midagi uut (v\u00f5i v\u00e4rskendasite vanu teadmisi) Unicode'i toimimisest.<\/p>\n<p><img decoding=\"async\" alt=\"Kas teadsite, et Linuxi k\u00e4surea saab k\u00e4ivitada iOS seadmes? V\u00f5ib-olla k\u00fcsite: \u201eMiks ma peaksin kasutama teksti rakendusi iPhone&#039;is?\u201c \u00d5ige k\u00fcsimus. Kuid kui loete Opensource.com-i, siis t\u00f5en\u00e4oliselt teate sellele vastust: Linuxi kasutajad tahavad v\u00f5imalust sellega igas seadmes t\u00f6\u00f6tada ja kasutavad oma seadeid. Kuid k\u00f5ige rohkem nad\" src=\"\/wp-content\/uploads\/2020\/10\/f14b2d815b06a7fda7b77c0a32e7eb75.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Demonstreeriv leht. Iisraeli keele n\u00e4itel on n\u00e4htavad eelised nii UTF-8 kui ka SCSU ees.<\/i><\/p>\n<p>\u00c4rge pidage eespool mainitud uuringut eksitamiseks standardite suhtes. Siiski olen oma t\u00f6\u00f6de tulemustega enamasti rahul ja olen neist r\u00f5\u00f5mus. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/deNULL\/utf-c\">jagada<\/a><\/noindex>: n\u00e4iteks, JS-raamatukogu miniatuursed versioonid kaaluvad vaid 1710 bitti (ja loomulikult ei ole tal mingeid s\u00f5ltuvusi). Nagu ma varem mainisin, saab selle t\u00f6\u00f6ga tutvuda <noindex><a rel=\"nofollow\" href=\"https:\/\/denull.github.io\/utf-c\/\">demo-lehel<\/a><\/noindex> (seal on ka tekstide kogum, millega saate v\u00f5rrelda seda UTF-8 ja SCSU-ga).<\/p>\n<p>L\u00f5petuseks tahan veel kord t\u00e4helepanu juhtida juhtumitele, kus UTF-C kasutamine <b>ei tasu<\/b>:<\/p>\n<ul>\n<li>on soovitatav, kui teie stringid on piisavalt pikad (alates 100-200 m\u00e4rgist). Sel juhul tasub m\u00f5elda kompressioonialgoritmide kasutamisele nagu deflate.<\/li>\n<li>Kui teil on vaja <em>ASCII l\u00e4bipaistvust<\/em>, t\u00e4hendab see, et on oluline, et kodeeritud j\u00e4rjestustes ei esineks ASCII-koode, mida algses stringis ei olnud. Sellest vajadusest saab v\u00e4ltida, kui suhtlete kolmandate osapoolte API-dega (n\u00e4iteks andmebaasidega), edastades kodeerimise tulemuse abstraktse byte'ide kogumina, mitte stringidena. Vastasel juhul v\u00f5ite kokku puutuda ootamatute haavatavustega.<\/li>\n<li>Kui soovite kiiresti leida s\u00fcmbolite piire suvalise nihke j\u00e4rgi (n\u00e4iteks kui osa stringist on kahjustatud). Seda saab teha, kuid ainult skannides stringi algusest (v\u00f5i rakendades t\u00e4iendust, nagu eelnevas osas kirjeldatud).<\/li>\n<li>Kui peate kiirelt tegema operatsioone stringide sisu \u00fcle (sorteerima, otsima alamstringe, concatenating). Sel eesm\u00e4rgil tuleb stringid algselt dekodeerida, seega on UTF-C nende puhul aeglasem kui UTF-8 (aga kiiremad kui kokkusurumise algoritmid). Kuna sama string kodeeritakse alati \u00fchtemoodi, ei vaja t\u00e4pset dekodeerimise v\u00f5rdlust; seda v\u00f5ib teha baitide kaupa.<\/li>\n<\/ul>\n<p><b>Uuendus:<\/b> kasutaja <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/tyomitch\/\"><b>tyomitch<\/b><\/a><\/noindex> <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/521110\/#comment_22139258\">kommentaarides allpool<\/a><\/noindex> postitas grafiku, mis r\u00f5hutab UTF-C rakendatavuse piiri. Sellelt on n\u00e4ha, et UTF-C on efektiivsem kui \u00fcldotstarbeline kokkusurumisalgoritm (LZW variatsioonid), kuni pakendatav string on l\u00fchem <b>~140 s\u00fcmbolit<\/b> (t\u00f5si, mainin, et v\u00f5rdlus tehti \u00fchel tekstil; teiste keelte puhul v\u00f5ib tulemus erineda).<br \/>\n<img decoding=\"async\" alt=\"Kas teadsite, et Linuxi k\u00e4surea saab k\u00e4ivitada iOS seadmes? V\u00f5ib-olla k\u00fcsite: \u201eMiks ma peaksin kasutama teksti rakendusi iPhone&#039;is?\u201c \u00d5ige k\u00fcsimus. Kuid kui loete Opensource.com-i, siis t\u00f5en\u00e4oliselt teate sellele vastust: Linuxi kasutajad tahavad v\u00f5imalust sellega igas seadmes t\u00f6\u00f6tada ja kasutavad oma seadeid. Kuid k\u00f5ige rohkem nad\" src=\"\/wp-content\/uploads\/2020\/10\/0bc9f35ad2757d656801c6466dda09a8.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/521110\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438 \u043f\u0435\u0440\u0435\u0434 \u0432\u0430\u043c\u0438 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u0431\u043e\u0440\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438, \u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u042e\u043d\u0438\u043a\u043e\u0434. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u043d\u043e \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0442\u0443\u0442 \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u2014 UTF-8. \u041e\u043d \u0445\u043e\u0440\u043e\u0448 \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u042e\u043d\u0438\u043a\u043e\u0434\u0430, \u043d\u0435 \u0442\u0440\u0430\u0442\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0431\u0430\u0439\u0442 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432. \u041f\u0440\u0430\u0432\u0434\u0430, \u0434\u043b\u044f \u044f\u0437\u044b\u043a\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 \u043d\u0435 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":95912,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-95911","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0415\u0441\u043b\u0438 \u0432\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438 \u043f\u0435\u0440\u0435\u0434 \u0432\u0430\u043c\u0438 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u0431\u043e\u0440\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438, \u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u042e\u043d\u0438\u043a\u043e\u0434. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u043d\u043e \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0442\u0443\u0442 \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u2014 UTF-8. \u041e\u043d \u0445\u043e\u0440\u043e\u0448 \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u042e\u043d\u0438\u043a\u043e\u0434\u0430, \u043d\u0435 \u0442\u0440\u0430\u0442\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0431\u0430\u0439\u0442 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432. \u041f\u0440\u0430\u0432\u0434\u0430, \u0434\u043b\u044f \u044f\u0437\u044b\u043a\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 \u043d\u0435\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/eshhyo-odin-velosiped-hranim-yunikodnye-stroki-na-30-60-kompaktnee-chem-utf-8\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0415\u0449\u0451 \u043e\u0434\u0438\u043d \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434: \u0445\u0440\u0430\u043d\u0438\u043c \u044e\u043d\u0438\u043a\u043e\u0434\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0430 30-60% \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0435\u0435, \u0447\u0435\u043c UTF-8 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0415\u0441\u043b\u0438 \u0432\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438 \u043f\u0435\u0440\u0435\u0434 \u0432\u0430\u043c\u0438 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u0431\u043e\u0440\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438, \u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u042e\u043d\u0438\u043a\u043e\u0434. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u043d\u043e \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0442\u0443\u0442 \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u2014 UTF-8. \u041e\u043d \u0445\u043e\u0440\u043e\u0448 \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u042e\u043d\u0438\u043a\u043e\u0434\u0430, \u043d\u0435 \u0442\u0440\u0430\u0442\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0431\u0430\u0439\u0442 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432. \u041f\u0440\u0430\u0432\u0434\u0430, \u0434\u043b\u044f \u044f\u0437\u044b\u043a\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 \u043d\u0435\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/eshhyo-odin-velosiped-hranim-yunikodnye-stroki-na-30-60-kompaktnee-chem-utf-8\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-10-04T23:42:09+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-10-04T23:42:09+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Veel \u00fcks leiutis: salvestame unicode stringid 30-60% kompaktsemalt kui UTF-8 | ProHoster","description":"Kui olete arendaja ja peate valima kodeeringu, siis on peaaegu alati \u00f5ige valik Unicode. Konkreetne esitusviis s\u00f5ltub kontekstist, kuid k\u00f5ige sagedamini on siin samuti universaalne vastus \u2014 UTF-8. See on hea selle poolest, et v\u00f5imaldab kasutada k\u00f5iki Unicode'i m\u00e4rke, raiskamata enamasti liiga palju baite. T\u00f5si, keelte puhul, mis kasutavad","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/eshhyo-odin-velosiped-hranim-yunikodnye-stroki-na-30-60-kompaktnee-chem-utf-8","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0415\u0449\u0451 \u043e\u0434\u0438\u043d \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434: \u0445\u0440\u0430\u043d\u0438\u043c \u044e\u043d\u0438\u043a\u043e\u0434\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0430 30-60% \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u0435\u0435, \u0447\u0435\u043c UTF-8 | ProHoster","og:description":"\u0415\u0441\u043b\u0438 \u0432\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438 \u043f\u0435\u0440\u0435\u0434 \u0432\u0430\u043c\u0438 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u0431\u043e\u0440\u0430 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0438, \u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u042e\u043d\u0438\u043a\u043e\u0434. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u043d\u043e \u0447\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0442\u0443\u0442 \u0442\u043e\u0436\u0435 \u0435\u0441\u0442\u044c \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u2014 UTF-8. \u041e\u043d \u0445\u043e\u0440\u043e\u0448 \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u042e\u043d\u0438\u043a\u043e\u0434\u0430, \u043d\u0435 \u0442\u0440\u0430\u0442\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u0431\u0430\u0439\u0442 \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432. \u041f\u0440\u0430\u0432\u0434\u0430, \u0434\u043b\u044f \u044f\u0437\u044b\u043a\u043e\u0432, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 \u043d\u0435","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/eshhyo-odin-velosiped-hranim-yunikodnye-stroki-na-30-60-kompaktnee-chem-utf-8","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-10-04T23:42:09+00:00","article:modified_time":"2020-10-04T23:42:09+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"95911","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 10:55:40","updated":"2022-09-29 03:35:04"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/95911","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=95911"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/95911\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/95912"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=95911"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=95911"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=95911"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}