{"id":83055,"date":"2020-05-28T01:42:15","date_gmt":"2020-05-27T23:42:15","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/kak-linuxovskij-sort-sortiruet-stroki"},"modified":"2020-05-28T01:42:15","modified_gmt":"2020-05-27T23:42:15","slug":"kak-linuxovskij-sort-sortiruet-stroki","status":"publish","type":"post","link":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/kak-linuxovskij-sort-sortiruet-stroki","title":{"rendered":"Kako Linux&#8217;ov sort sortira retke","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1 id=\"vvedenie\">Uvod<\/h1>\n<p><\/p>\n<p>Sve je po\u010delo s kratkim skriptom koja je trebala spojiti informacije o adresama <em>e-mail<\/em> zaposlenika, dobivenih iz popisa korisnika mailing liste, s pozicijama zaposlenika, dobivenim iz baze podataka ljudskih resursa. Oba popisa su eksportirana u tekstualne datoteke u Unicode kodiranju <em>UTF-8<\/em> i pohranjena s unixovskim zavr\u0161ecima redaka.<\/p>\n<p><\/p>\n<p>Sadr\u017eaj <em>mail.txt<\/em><\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Ivanov Andrej;ia@example.com<\/code><\/pre>\n<p><\/p>\n<p>Sadr\u017eaj <em>buhg.txt<\/em><\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Ivanova Alla;maljar\nJolkina Ella;kranov\u010dica\nIvanov Andrej;slavolikar\nAbakanov Mihail;maljar<\/code><\/pre>\n<p><\/p>\n<p>Za spajanje, datoteke su sortirane unixovskom komandom <em>sort<\/em> i predane na ulaz unix programu <em>join<\/em>, koji je naglo zavr\u0161io s gre\u0161kom: <\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; sort buhg.txt &gt; buhg.srt\n$&gt; sort mail.txt &gt; mail.srt\n$&gt; join buhg.srt mail.srt &gt; result\njoin: buhg.srt:4: nije sortirano: Ivanov Andrej;slavolikar<\/code><\/pre>\n<p><\/p>\n<p>Pogled na rezultat sortiranja pokazao je da je u cjelini sortiranje ispravno, ali u slu\u010daju podudaranja mu\u0161kih i \u017eenskih prezimena, \u017eenska se prezimena pojavljuju ispred mu\u0161kih:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; sort buhg.txt\nAbakanov Mihail;maljar\nJolkina Ella;kranov\u010dica\nIvanova Alla;maljar\nIvanov Andrej;slavolikar<\/code><\/pre>\n<p><\/p>\n<p>Izgleda kao gre\u0161ka sortiranja u Unicodeu ili kao manifestacija feminizma u algoritmu sortiranja. Prvo je, naravno, vjerodostojnije.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Ostavimo to za sada <em>join<\/em> i usmjerimo se na <em>sort<\/em>. Poku\u0161ajmo rije\u0161iti zadatak metodom poku\u0161aja i pogre\u0161ke. Za po\u010detak, promijenimo lokalitet s <em>en_US<\/em> na <em>ru_RU<\/em>. Za sortiranje bilo bi dovoljno postaviti varijablu okru\u017eenja <em>LC_COLLATE<\/em>, ali ne\u0107emo ba\u0161 sitni\u010dariti:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; LANG=ru_RU.UTF-8 sort buhg.txt\nAbakanov Mihail;maljar\nJolkina Ella;kranov\u010dica\nIvanova Alla;maljar\nIvanov Andrej;slavolikar<\/code><\/pre>\n<p><\/p>\n<p>NI\u0161ta se nije promijenilo.<\/p>\n<p><\/p>\n<p>Poku\u0161ajmo prekodirati datoteke u jednogluk kodiranje: <\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; iconv -f UTF-8 -t KOI8-R buhg.txt \n | LANG=ru_RU.KOI8-R sort \n | iconv -f KOI8-R -t UTF8<\/code><\/pre>\n<p><\/p>\n<p>Opet nije bilo promjena.<\/p>\n<p><\/p>\n<p>Ne mo\u017eemo ni\u0161ta napamet, moramo tra\u017eiti rje\u0161enje na internetu. Iako o ruskim prezimenima nema ni\u010dega, postoje pitanja o drugim \u010dudnim pona\u0161anjima sortiranja. Na primjer, postoji takav problem: <noindex><a rel=\"nofollow\" href=\"https:\/\/serverfault.com\/questions\/95579\/unix-sort-treats-dash-characters-as-invisible\/95593\">unix sort tretira &#8216;-&#8216; (crticu) kao nevidljivu<\/a><\/noindex>. Ukratko, nizovi &quot;a-b&quot;, &quot;aa&quot;, &quot;ac&quot; se sortiraju kao &quot;aa&quot;, &quot;a-b&quot;, &quot;ac&quot;.<\/p>\n<p><\/p>\n<p>Odgovor je svugdje standardan: koristite programski lokalitet <em>&quot;C&quot;<\/em> i bit \u0107ete sretni. Poku\u0161ajmo:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; LANG=C sort buhg.txt\nJolkina Ella;kranov\u010dica\nAbakanov Mihail;maljar\nIvanov Andrej;slavolikar\nIvanova Alla;advokat<\/code><\/pre>\n<p><\/p>\n<p>Ne\u0161to se promijenilo. Ivanovi su se postavili u pravilan red, ali Jolkina je nekako ispala. Vra\u0107amo se na izvorni zadatak:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; LANG=C sort buhg.txt &gt; buhg.srt\n$&gt; LANG=C sort mail.txt &gt; mail.srt\n$&gt; LANG=C join buhg.srt mail.srt &gt; result<\/code><\/pre>\n<p><\/p>\n<p>Radilo je bez gre\u0161aka, kao \u0161to je internet obe\u0107ao. I to unato\u010d Jun\u010du u prvom redu.<\/p>\n<p><\/p>\n<p>Izgleda da je problem re\u0161en, ali za svaki slu\u010daj isproba\u0107emo jo\u0161 jedan ruski kod \u2014 Windowsov. <em>CP1251<\/em>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; iconv -f UTF-8 -t CP1251 buhg.txt \n | LANG=hr_HR.CP1251 sort \n | iconv -f CP1251 -t UTF8 <\/code><\/pre>\n<p><\/p>\n<p>Rezultat sortiranja, koliko god \u010dudno bilo, poklapa\u0107e se s lokalitetom <em>&quot;C&quot;<\/em>, i ceo primer, shodno tome, prolazi bez gre\u0161aka. Neka vrsta mistike.<\/p>\n<p><\/p>\n<p>Ne volim mistiku u programiranju, po\u0161to obi\u010dno maskira gre\u0161ke. Mora\u0107u ozbiljno da se pozabavim pitanjem kako to funkcioni\u0161e <em>sort<\/em> i na \u0161ta uti\u010de <em>LC_COLLATE<\/em> .<\/p>\n<p><\/p>\n<p>Na kraju \u0107u poku\u0161ati da odgovorim na pitanja:<\/p>\n<p><\/p>\n<ul>\n<li>za\u0161to nisu ispravno sortirana \u017eenska prezimena<\/li>\n<li>za\u0161to <em>LANG=hr_HR.CP1251<\/em> je ispalo ekvivalentno <em>LANG=C<\/em><\/li>\n<li>za\u0161to imaju <em>sort<\/em> i <em>join<\/em> razli\u010dite prikaze o redu sortiranih redova<\/li>\n<li>za\u0161to u svim mojim primerima ima gre\u0161aka<\/li>\n<li>na kraju, kako sortira redove prema svojoj \u017eelji<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"sortirovka-v-yunikode\">Sortiranje u Unicode-u<\/h1>\n<p><\/p>\n<p>Prva stanica je tehni\u010dki izve\u0161taj br. 10 pod nazivom <noindex><a rel=\"nofollow\" href=\"https:\/\/unicode.org\/reports\/tr10\/\">Unicode collation algorithm<\/a><\/noindex> na stranici <noindex><a rel=\"nofollow\" href=\"https:\/\/unicode.org\">unicode.org<\/a><\/noindex>. Izve\u0161taj sadr\u017ei mnogo tehni\u010dkih detalja, pa \u0107u si dozvoliti da navedem kratak pregled osnovnih ideja.<\/p>\n<p><\/p>\n<p><em>Collation<\/em> \u2014 &quot;usporedba&quot; nizova \u2014 temelj je svakog algoritma sortiranja. Algoritmi sami mogu varirati (&quot;bubbling&quot;, &quot;spajanje&quot;, &quot;brzi&quot;), ali svi koriste usporedbu parova nizova za odre\u0111ivanje redoslijeda.<\/p>\n<p><\/p>\n<p>Sortiranje redova na prirodnom jeziku je prili\u010dno slo\u017een problem. \u010cak i u najjednostavnijim jednoumjernim kodiranjima redosled slova u alfabetskoj listi, barem u ne\u010demu \u0161to se razlikuje od engleske latinice, ne\u0107e se poklapati s redosledom numeri\u010dkih vrednosti kojima se ti karakteri kodiraju. Tako u nema\u010dkom alfabetu slovo <em>\u00d6<\/em> se nalazi izme\u0111u <em>o<\/em> i <em>P<\/em>, a u kodiranju <em>CP850<\/em> to spada izme\u0111u <em>\u00ff<\/em> i <em>\u00dc<\/em>.<\/p>\n<p><\/p>\n<p>Mo\u017eete poku\u0161ati apstrahirati od konkretne kodiranja i razmotriti &quot;idealna&quot; slova koja su postavljena u nekom redoslijedu, kao \u0161to je to u\u010dinjeno u Unicodeu. Kodiranja <em>UTF8<\/em>, <em>UTF16<\/em> ili jednoumjerno <em>KOI8-R<\/em> (ako je potrebno ograni\u010deno podskup Unicode-a) \u0107e davati razli\u010dite numeri\u010dke represente slova, ali \u0107e se istovremeno pozivati na iste elemente osnovne tabele. <\/p>\n<p><\/p>\n<p>Ispostavlja se da \u010dak i kada izgradimo tablicu znakova od nule, ne mo\u017eemo dodijeliti univerzalni redoslijed znakova. U razli\u010ditim nacionalnim alfabetima koji koriste iste slova, redoslijed tih slova mo\u017ee se razlikovati. Na primjer, u francuskom jeziku <em>\u00c6<\/em> \u0107e se smatrati ligaturom i sortirati kao niz <em>AE<\/em>. U norve\u0161kom jeziku <em>\u00c6<\/em> bit \u0107e zasebno slovo koje se nalazi nakon <em>Z<\/em>. Usput, osim ligatura poput <em>\u00c6<\/em> postoje slova koja se zapisuju s vi\u0161e znakova. Tako u \u010de\u0161kom alfabetu postoji slovo <em>Ch<\/em>, koje se nalazi izme\u0111u <em>H<\/em> i <em>I<\/em>.<\/p>\n<p><\/p>\n<p>. Osim razlika u alfabetima, postoje i druge nacionalne tradicije koje utje\u010du na sortiranje. Konkretno, postavlja se pitanje: kojim redoslijedom trebaju slijediti u rje\u010dniku rije\u010di koje se sastoje od velikih i malih slova? Tako\u0111er, na sortiranje mogu utjecati posebnosti kori\u0161tenja interpunkcijskih znakova. U \u0161panjolskom jeziku na po\u010detku upitne re\u010denice stavlja se obrnuti upitni znak (<em>\u00bfTe gusta la m\u00fasica?<\/em>). U tom slu\u010daju je o\u010digledno da upitne re\u010denice ne bi trebale biti grupirane u zaseban klaster izvan alfabeta, a kako sortirati nizove s drugim interpunkcijskim znakovima?<\/p>\n<p><\/p>\n<p>Ne\u0107u se zadr\u017eavati na sortiranju nizova u jezicima koji se znatno razlikuju od europskih. Istaknut \u0107u da u jezicima s pravcem pisanja s desna na lijevo ili odozgo prema dolje, znakovi u nizovima vjerojatno se \u010duvaju u redu slijeda \u010ditanja, a \u010dak iu nealfabetskim pismenostima postoje na\u010dini za sortiranje nizova po znakovima. Na primjer, hijeroglifi se mogu sortirati prema obliku (<noindex><a rel=\"nofollow\" href=\"https:\/\/studychinese.ru\/kljuchi\/\">klju\u010devima kineskih hijeroglifa<\/a><\/noindex>) ili prema izgovoru. Kako bi se trebali sortirati emojiji, iskreno, nemam predstavu, ali se mo\u017ee smisliti ne\u0161to i za njih.<\/p>\n<p><\/p>\n<p>Na temelju gore navedenih zna\u010dajki formulirane su osnovne zahtjeve za usporedbu nizova, temeljenih na Unicode tablicama:<\/p>\n<p><\/p>\n<ul>\n<li>usporedba nizova ne ovisi o polo\u017eaju znakova u kodnoj tablici;<\/li>\n<li>sekvencije znakova koje \u010dine jedan znak dovode se u kanoni\u010dki oblik (<em>A<\/em> + gornji krug to\u010dno je ono \u0161to je <em>\u00c5<\/em>);<\/li>\n<li>prilikom usporedbe nizova znak se razmatra u kontekstu niza i, po potrebi, spaja s susjedima u jednu jedinicu usporedbe (<em>Ch<\/em> u \u010de\u0161kom) ili se razbija na vi\u0161e (<em>\u00c6<\/em> u francuskom);<\/li>\n<li>svi nacionalni specifi\u010dnosti (alfabet, velika\/mala slova, interpunkcija, redoslijed vrsta pisanja) trebaju se prilagoditi sve do ru\u010dnog dodjeljivanja redoslijeda (emoji);<\/li>\n<li>usporedba je va\u017ena ne samo za sortiranje, ve\u0107 i na mnogim drugim mjestima, primjerice za postavljanje raspona redaka (zamjena {A\u2026 z} u <em>bash<\/em>);<\/li>\n<li>usporedba se mora izvr\u0161avati dovoljno brzo.<\/li>\n<\/ul>\n<p><\/p>\n<p>Osim toga, autori izvje\u0161\u0107a su formulirali svojstva usporedbe na koja programeri algoritma ne smiju oslanjati:<\/p>\n<p><\/p>\n<ul>\n<li>algoritam usporedbe ne smije zahtijevati poseban skup znakova za svaki jezik (ruski i ukrajinski jezici zajedni\u010dki koriste ve\u0107inu znakova \u0107irilice);<\/li>\n<li>usporedba se ne smije oslanjati na redoslijed znakova u Unicode tablicama;<\/li>\n<li>te\u017eina niza ne smije biti atribut niza, jer isti niz u razli\u010ditim kulturnim kontekstima mo\u017ee imati razli\u010dite te\u017eine;<\/li>\n<li>te\u017eine nizova mogu se mijenjati prilikom spajanja ili razdvajanja (iz <em>x<\/em> &lt; <em>y<\/em> ne implicira da <em>xz<\/em> &lt; <em>yz<\/em>);<\/li>\n<li>razli\u010diti nizovi koji imaju iste te\u017eine smatraju se jednakima s gledi\u0161ta algoritma sortiranja. Uvo\u0111enje dodatnog redoslijeda za takve nizove je mogu\u0107e, ali mo\u017ee pogor\u0161ati performanse;<\/li>\n<li>pri ponovnim sortiranjem, nizovi koji imaju iste te\u017eine mogu mijenjati mjesta. Stabilnost je svojstvo odre\u0111enog algoritma sortiranja, a ne svojstvo algoritma usporedbe nizova (vidi prethodnu to\u010dku);<\/li>\n<li>pravila sortiranja mogu se mijenjati s vremenom kako se kulturne tradicije preciziraju\/mijene.<\/li>\n<\/ul>\n<p><\/p>\n<p>Tako\u0111er je navedeno da algoritam usporedbe ne zna ni\u0161ta o semantici obra\u0111enih nizova. Tako, nizovi koji se sastoje samo od brojeva ne smiju se uspore\u0111ivati kao brojevi, a u popisima engleskih naziva ne smije se uklanjati \u010dlanak (<em>Beatles, The<\/em>).<\/p>\n<p><\/p>\n<p>Kako bi se zadovoljili svi navedeni zahtjevi, predlo\u017een je vi\u0161erazinski (zapravo \u010detverorazinski) tabli\u010dni algoritam sortiranja.<\/p>\n<p><\/p>\n<p>Prethodno, znakovi u nizu se dovode u kanoni\u010dki oblik i grupiraju u jedinice usporedbe. Svakoj jedinici usporedbe dodjeljuju se nekoliko te\u017eina, koje odgovaraju nekoliko razina usporedbe. Te\u017eine jedinica usporedbe su elementi ure\u0111enih skupova (u ovom slu\u010daju cijeli brojevi), koji se mogu uspore\u0111ivati kao ve\u0107i-manji. Posebna vrijednost <em>IGNORED<\/em> (0x0) zna\u010di da se na odgovaraju\u0107oj razini usporedbe ta jedinica ne sudjeluje u usporedbi. Usporedba nizova mo\u017ee se ponavljati nekoliko puta, koriste\u0107i te\u017eine odgovaraju\u0107ih razina. Na svakoj od razina te\u017eine jedinica usporedbe dvaju nizova se postupno uspore\u0111uju me\u0111usobno.<\/p>\n<p><\/p>\n<p>U razli\u010ditim realizacijama algoritma za razli\u010dite nacionalne tradicije veli\u010dine koeficijenata mogu se razlikovati, ali u sastavnicu standarda Unicode uklju\u010dena je osnovna tablica te\u017eina \u2014 <em>&quot;Default Unicode Collation Element Table&quot;<\/em> (<em>DUCET<\/em>). \u017delim napomenuti da je postavljanje varijable <em>LC_COLLATE<\/em> u biti pokazatelj odabira tablice te\u017eina u funkciji usporedbe niza.<\/p>\n<p><\/p>\n<p>Te\u017einski koeficijenti <em>DUCET<\/em> organizirani su na sljede\u0107i na\u010din:<\/p>\n<p><\/p>\n<ul>\n<li>na prvoj razini sva slova se dovode u jedan oblik, dijakriti\u010dki znakovi se odbacuju, interpunkcijski znakovi (ne svi) se ignoriraju;<\/li>\n<li>na drugoj razini uzimaju se u obzir samo dijakriti\u010dki znakovi;<\/li>\n<li>na tre\u0107oj razini uzima se u obzir samo oblik slova;<\/li>\n<li>na \u010detvrtoj razini uzimaju se u obzir samo interpunkcijski znakovi.<\/li>\n<\/ul>\n<p><\/p>\n<p>Usporedba se odvija u nekoliko prolaza: prvo se uspore\u0111uju koeficijenti prve razine; ako su te\u017eine iste, prolazi se ponovna usporedba s te\u017einama druge razine; zatim, mogu\u0107e, tre\u0107e i \u010detvrte.<\/p>\n<p><\/p>\n<p>Usporedba zavr\u0161ava kada se u nizovima nalaze odgovaraju\u0107e jedinice usporedbe s razli\u010ditim te\u017einama. Nizovi koji imaju jednake te\u017eine na svim \u010detirima razinama smatraju se jednakima.<\/p>\n<p><\/p>\n<p>Ovaj algoritam (s mno\u0161tvom dodatnih tehni\u010dkih detalja) dao je naziv izvje\u0161taju br. 10 \u2014 <em>&quot;Unicode Collation Algorithm&quot;<\/em> (<em>UCA<\/em>).<\/p>\n<p><\/p>\n<p>Na ovom mjestu pona\u0161anje sortiranja iz na\u0161eg primjera postaje pomalo jasnije. Dobro bi bilo usporediti ga sa standardom Unicode.<\/p>\n<p><\/p>\n<p>Za testiranje realizacija <em>UCA<\/em> postoji posebni <noindex><a rel=\"nofollow\" href=\"https:\/\/www.unicode.org\/Public\/UCA\/latest\/CollationTest.html\">test<\/a><\/noindex>, koji koristi <noindex><a rel=\"nofollow\" href=\"http:\/\/www.unicode.org\/Public\/UCA\/latest\/allkeys.txt\">datoteku te\u017eina<\/a><\/noindex>, koji implementira <em>DUCET<\/em>. U datoteci te\u017eina mo\u017eete prona\u0107i razli\u010dite zanimljivosti. Na primjer, tamo je redoslijed kostiju mahjonga i europskog domina, kao i redoslijed boja u \u0161pilu karata (simbol <em>1F000<\/em> i dalje). Boje karata su poredane prema pravilima brid\u017ea \u2014 P\u010cB\u0422, a karte u boji \u2014 u redoslijedu T,2,3\u2026 K.<\/p>\n<p><\/p>\n<p>Ru\u010dno provjeravanje ispravnosti sortiranja nizova prema <em>DUCET<\/em> bi bila prili\u010dno zamorna, ali, sre\u0107om za nas, postoji uzorna implementacija biblioteke za rad s Unicodeom \u2014 &quot;<noindex><a rel=\"nofollow\" href=\"http:\/\/site.icu-project.org\/\">Me\u0111unarodne komponente za Unicode<\/a><\/noindex>&quot; (<em>ICU<\/em>).<\/p>\n<p><\/p>\n<p>Na web stranici ove biblioteke, razvijene u <em>IBM<\/em>, postoje demonstracijske stranice, uklju\u010duju\u0107i i <noindex><a rel=\"nofollow\" href=\"http:\/\/demo.icu-project.org\/icu-bin\/collation.html\">stranicu algoritma usporedbe nizova<\/a><\/noindex>. Unosimo na\u0161e testne nizove s zadanim postavkama i, oh \u010dudo, dobivamo savr\u0161eno hrvatsko sortiranje.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Abakanov Mihail;maler\nJolkina Ella;kranovka\nIvanov Andrej;bravar\nIvanova Alla;advokat<\/code><\/pre>\n<p><\/p>\n<p>Usput, na web stranici <em>ICU<\/em> mo\u017eete prona\u0107i poja\u0161njenje rada algoritma usporedbe pri obradi interpunkcijskih znakova. U primjerima <noindex><a rel=\"nofollow\" href=\"http:\/\/userguide.icu-project.org\/collation\/faq\">\u010cesta pitanja o sortiranju<\/a><\/noindex> ignoriraju se apostrof i crtica.<\/p>\n<p><\/p>\n<p>Unicode nam je pomogao, ali morat \u0107emo tra\u017eiti razloge \u010dudnog pona\u0161anja <em>sort<\/em> u <em>Linux<\/em> negdje drugdje.<\/p>\n<p><\/p>\n<h1 id=\"sortirovka-v-glibc\">Sortiranje u glibc<\/h1>\n<p><\/p>\n<p>Brzi pregled izvornog koda alata <em>sort<\/em> iz <em>GNU Core Utils<\/em> pokazuje da se u samom alatu lokalizacija svodi na ispis trenutne vrijednosti varijable <em>LC_COLLATE<\/em> prilikom pokretanja u na\u010dinu otklanjanja pogre\u0161aka:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ sort --debug buhg.txt &gt; buhg.srt\nsort: koristi \u2018en_US.UTF8\u2019 pravila sortiranja<\/code><\/pre>\n<p><\/p>\n<p>Usporedba nizova provodi se standardnom funkcijom <em>strcoll<\/em>, a to zna\u010di da se sve zanimljivo nalazi u biblioteci <em>glibc<\/em>.<\/p>\n<p><\/p>\n<p>Na <em>wiki<\/em> projekta <em>glibc<\/em> usporedbi nizova posve\u0107en <noindex><a rel=\"nofollow\" href=\"https:\/\/sourceware.org\/glibc\/wiki\/Locales#LC_COLLATE\">jedan odlomak<\/a><\/noindex>. Iz ovog odlomka mo\u017eemo shvatiti da u <em>glibc<\/em> sortiranje se temelji na ve\u0107 poznatom algoritmu <em>UCA<\/em> (<em>The Unicode collation algorithm<\/em>) i\/ili na sli\u010dnom standardu <em>ISO 14651<\/em> (<em>Me\u0111unarodno poredak i usporedba nizova<\/em>). \u0160to se ti\u010de posljednjeg standarda, treba napomenuti da je na web stranici <noindex><a rel=\"nofollow\" href=\"https:\/\/standards.iso.org\/ittf\/PubliclyAvailableStandards\">standards.iso.org<\/a><\/noindex> <em>ISO 14651<\/em> slu\u017ebeno objavljen javnosti, ali odgovaraju\u0107i link vodi na nepostoje\u0107u stranicu. Google prikazuje nekoliko stranica s vezama na slu\u017ebene stranice koje nude kupnju elektroni\u010dke kopije standarda za stotinu eura, ali na tre\u0107oj-\u010detvrtoj stranici rezultata pretra\u017eivanja mo\u017ee se prona\u0107i i izravne veze na <em>PDF<\/em>. U cjelini, standard se prakti\u010dki ne razlikuje od <em>UCA<\/em>, ali se \u010dita dosadnije, budu\u0107i da ne sadr\u017ei slikovite primjere nacionalnih osobitosti sortiranja nizova. <\/p>\n<p><\/p>\n<p>Najzanimljivija informacija na <em>wiki<\/em> bila je veza na <noindex><a rel=\"nofollow\" href=\"https:\/\/sourceware.org\/bugzilla\/show_bug.cgi?id=14095\">bug tracker<\/a><\/noindex> s raspravom o implementaciji usporedbe nizova u <em>glibc<\/em>. Iz rasprave mo\u017eete saznati da u <em>glibc<\/em> za usporedbu nizova koristi <em>ISO<\/em>tablicu tipa <noindex><a rel=\"nofollow\" href=\"http:\/\/www.iso.org\/ittf\/ISO14651_2006_TABLE1_en.txt\">The Common Template Table<\/a><\/noindex> (<em>CTT<\/em>), \u010dija se adresa mo\u017ee prona\u0107i u dodatku <em>A<\/em> standardu <em>ISO 14651<\/em>. Izme\u0111u 2000. i 2015. godine, ova tablica u <em>glibc<\/em> nije imala maintainer i zna\u010dajno se razlikovala (barem izvana) od trenutne verzije standarda. Od 2015. do 2018. godine odvijala se prilagodba novoj verziji tablice i trenutno imate priliku susresti u stvarnom \u017eivotu kako novi varijantu tablice (<em>CentOS 8<\/em>), tako i staru (<em>CentOS 7<\/em>). <\/p>\n<p><\/p>\n<p>Sada kada imamo sve informacije o algoritmu i pomo\u0107nim tablicama, mo\u017eemo se vratiti na izvorni problem i razumjeti kako ispravno sortirati redove u ruskoj lokalizaciji.<\/p>\n<p><\/p>\n<h1 id=\"iso-1465114652\">ISO 14651\/14652<\/h1>\n<p><\/p>\n<p>Izvorni kod tablice koja nas zanima <em>CTT<\/em> u ve\u0107ini distribucija <em>Linux<\/em> nalazi se u katalogu <em>\/usr\/share\/i18n\/locales\/<\/em>. Sama tablica se nalazi u datoteci <em>iso14651_t1_common<\/em>. Zatim, ta datoteka s direktivom <em>copy iso14651_t1_common<\/em> uklju\u010duje se u datoteku <em>iso14651_t1<\/em>, koja se zauzvrat uklju\u010duje u nacionalne datoteke, uklju\u010duju\u0107i i <em>en_US<\/em> i <em>ru_RU<\/em>. U ve\u0107ini distribucija <em>Linux<\/em> sve izvorne datoteke uklju\u010dene su u osnovnu instalaciju, ali ako ih nema, morat \u0107ete instalirati dodatni paket iz distribucije.<\/p>\n<p><\/p>\n<p>Struktura datoteke <em>iso14651_t1<\/em> mo\u017ee se \u010diniti u\u017easno op\u0161irnom, s nejasnim pravilima za izgradnju imena, ali ako se razumije, sve je prili\u010dno jednostavno. Struktura je opisana u standardu <em>ISO 14652<\/em>, kopiju mo\u017eete preuzeti s web stranice <noindex><a rel=\"nofollow\" href=\"http:\/\/www.open-std.org\/JTC1\/SC22\/WG20\/docs\/n972-14652ft.pdf\">open-std.org<\/a><\/noindex>. Jo\u0161 jedan opis formata datoteke mo\u017eete pro\u010ditati u <noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/9699919799\/basedefs\/V1_chap07.html\">specifikacijama<\/a><\/noindex> <em>POSIX<\/em> od <em>OpenGroup<\/em>. Kao alternativu \u010ditanju standarda, mo\u017eete prou\u010diti izvorne tekstove funkcije <em>collate_read<\/em> u <em>glibc\/locale\/programs\/ld-collate.c<\/em>.<\/p>\n<p><\/p>\n<p>Struktura datoteke izgleda ovako:<\/p>\n<p><\/p>\n<p>Po defaultu, simbol  se koristi kao simbol za escape, a kraj retka nakon simbola # je komentar. Oba simbola mogu\u0107e je redefinirati, \u0161to je u\u010dinjeno u novoj verziji tablice:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">escape_char \/\ncomment_char %<\/code><\/pre>\n<p><\/p>\n<p>U datoteci \u0107e se nalaziti tokeni u formatu <em>&lt;Uxxxx&gt;<\/em> ili <em>&lt;Uxxxxxxxx&gt;<\/em> (gdje <em>x<\/em> \u2014 hexadecimal digit). To je heksadecimalna reprezentacija kodnih to\u010daka Unicodea u kodiranju <em>UCS-4<\/em> (<em>UTF-32<\/em>). Svi ostali elementi u kutnim zagradama (uklju\u010duju\u0107i <em>&lt;Uxxxx_xxxx&gt;<\/em>, <em>&lt;2&gt;<\/em> i sli\u010dne), smatraju se obi\u010dnim string konstantama bez posebnog zna\u010denja izvan konteksta.<\/p>\n<p><\/p>\n<p>Retak <em>LC_COLLATE<\/em> nam govori da nakon toga po\u010dinju podaci koji opisuju usporedbu stringova.<\/p>\n<p><\/p>\n<p>Prvo se postavljaju imena za te\u017eine u tablici usporedbe i imena za kombinacije simbola. Op\u0107enito, dva tipa imena pripadaju dvjema razli\u010ditim entitetima, ali u stvarnoj datoteci su pomije\u0161ani. Imena te\u017eina postavljaju se klju\u010dnom rije\u010di <em>simbol za sortiranje<\/em> (simbol usporedbe), jer \u0107e kod usporedbe Unicode znakovi koji imaju jednake te\u017eine biti smatrani ekvivalentnim znakovima.<\/p>\n<p><\/p>\n<p>Ukupna duljina sekcije u trenutnoj reviziji datoteke je oko 900 redaka. Uzeo sam primjere iz nekoliko mjesta kako bih pokazao proizvoljnost imena i nekoliko vrsta sintakse.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">LC_COLLATE\n\ncollating-symbol &lt;RES-1&gt;\ncollating-symbol &lt;BLK&gt;\ncollating-symbol &lt;MIN&gt;\ncollating-symbol &lt;WIDE&gt;\n...\ncollating-symbol &lt;ARABIC&gt;\ncollating-symbol &lt;ETHPC&gt;\ncollating-symbol &lt;OSMANYA&gt;\n...\ncollating-symbol &lt;S1D000&gt;..&lt;S1D35F&gt;\ncollating-symbol &lt;SFFFF&gt; % Zagarantirana najve\u0107a vrijednost simbola. Odr\u017eavajte na kraju ove liste\n...\ncollating-element &lt;U0413_0301&gt; iz &quot;&lt;U0413&gt;&lt;U0301&gt;&quot;\ncollating-element &lt;U0413_0341&gt; iz &quot;&lt;U0413&gt;&lt;U0341&gt;&quot;<\/code><\/pre>\n<p><\/p>\n<ul>\n<li><em>simbol za sortiranje &lt;OSMANYA&gt;<\/em> registrira niz <em>OSMANYA<\/em> u tablici te\u017eina imena <\/li>\n<li><em>simbol za sortiranje &lt;S1D000&gt;..&lt;S1D35F&gt;<\/em> registrira niz imena koja se sastoje od prefiksa <em>S<\/em> i \u0161esnaestog digit njime od <em>1D000<\/em> do <em>1D35F<\/em>.<\/li>\n<li><em>FFFF<\/em> u <em>simbol za sortiranje &lt;SFFFF&gt;<\/em> izgleda kao veliko bezznakovno cijelo u \u0161esnaestom sustavu, ali <em>&lt;SFFFF&gt;<\/em> to je samo ime koje bi moglo izgledati kao <em>&lt;VERYBIGVAL&gt;<\/em> <\/li>\n<li>ime <em>&lt;U0413&gt;<\/em> ozna\u010dava kodnu to\u010dku u kodiranju <em>UCS-4<\/em><\/li>\n<li><em>collating-element &lt;U0413_0301&gt; iz &quot;&lt;U0413&gt;&lt;U0301&gt;&quot;<\/em> registrira novo ime za par Unicode to\u010daka. <\/li>\n<\/ul>\n<p><\/p>\n<p>Kada su imena te\u017eina definirana, postavljaju se same te\u017eine. Budu\u0107i da kod usporedbe imaju zna\u010denje samo odnosi ve\u0107i-manji, te\u017eine se definiraju jednostavnom sekvencijom nabrajanja imena. Prvo se nabrajaju &quot;lak\u0161e&quot; te\u017eine, zatim &quot;te\u017ee&quot;. Podsje\u0107am, svaki Unicode simbol ima \u010detiri razli\u010dite te\u017eine. Ovdje su svedene u jedinstvenu ure\u0111enu sekvencu. Teoretski, bilo koje simboli\u010dko ime mo\u017ee se koristiti na bilo kojoj od \u010detiri razine, ali komentari ukazuju na to da programeri mentalno razdvajaju imena po razinama.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">% Dodjela simboli\u010dnih te\u017eina\n\n% Dodjele te\u017eina tre\u0107e razine\n&lt;RES-1&gt;\n&lt;BLK&gt;\n&lt;MIN&gt;\n&lt;WIDE&gt;\n...\n% Dodjele te\u017eina druge razine\n&lt;BASE&gt;\n&lt;LOWLINE&gt; % SPROVEDENO NISKO\n&lt;PSILI&gt; % SPROVEDENA ZAREZ GORE\n&lt;DASIA&gt; % SPROVEDENA OBRNUTA ZAREZ GORE\n...\n% Dodjele te\u017eina prve razine\n&lt;S0009&gt; % HORIZONTALNA TABULACIJA\n&lt;S000A&gt; % REDNA POSLIJEDICA\n&lt;S000B&gt; % VERTIKALNA TABULACIJA\n...\n&lt;S0434&gt; % MALO SLU\u010cAJNO PISMO DE\n&lt;S0501&gt; % MALO SLU\u010cAJNO PISMO KOMI DE\n&lt;S0452&gt; % MALO SLU\u010cAJNO PISMO DJE\n&lt;S0503&gt; % MALO SLU\u010cAJNO PISMO KOMI DJE\n&lt;S0453&gt; % MALO SLU\u010cAJNO PISMO GJE\n&lt;S0499&gt; % MALO SLU\u010cAJNO PISMO ZE SA SPUSTENIM\n&lt;S0435&gt; % MALO SLU\u010cAJNO PISMO IE\n&lt;S04D7&gt; % MALO SLU\u010cAJNO PISMO IE S BREVE\n&lt;S0454&gt; % MALO SLU\u010cAJNO PISMO UKRAJINSKI IE\n&lt;S0436&gt; % MALO SLU\u010cAJNO PISMO ZHE<\/code><\/pre>\n<p><\/p>\n<p>Na kraju, vlastita tabela te\u017eina.<\/p>\n<p><\/p>\n<p>Sekcija te\u017eina zaklju\u010dena je u redovima s klju\u010dnim rije\u010dima <em>order_start<\/em> i <em>order_end<\/em>. Dodatni parametri <em>order_start<\/em> odre\u0111uju smjer u kojem se redovi pregledavaju na svakoj razini usporedbe. Zadani parametar je <em>forward<\/em>. Tijelo sekcije sastoji se od redova koji sadr\u017ee kod simbola i \u010detiri njegove te\u017eine. Kod simbola mo\u017ee biti predstavljen samim simbolom, kodnom to\u010dkom ili simboli\u010dnim imenom definiranim ranije. Te\u017eine se tako\u0111er mogu definirati simboli\u010dnim imenima, kodnim to\u010dkama ili samim simbolima. Ako se koriste kodne to\u010dke ili simboli, njihova te\u017eina odgovara numeri\u010dkoj vrijednosti kodne to\u010dke (pozicija u Unicode tablici). Simboli koji nisu izri\u010dito navedeni (kako ja razumijem) smatraju se dodanima u tablicu s primarnom te\u017einom koja odgovara poziciji u Unicode tablici. Specijalna vrijednost te\u017eine <em>IGNORE<\/em> zna\u010di da se na odgovaraju\u0107oj razini usporedbe taj simbol ignorira.<\/p>\n<p><\/p>\n<p>Za demonstraciju strukture te\u017eina odabrao sam tri dovoljno o\u010dita segmenta:<\/p>\n<p><\/p>\n<ul>\n<li>simboli koji se potpuno ignoriraju<\/li>\n<li>simboli ekvivalentni broju tri na prvih dvjema razinama<\/li>\n<li>po\u010detak \u0107irilice, koja ne sadr\u017ei dijakriti\u010dke znakove, a stoga se sortira, uglavnom, prema prvoj i tre\u0107oj razini.<\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"plaintext\">order_start forward;forward;forward;forward,position\n IGNORE;IGNORE;IGNORE;IGNORE % NULL (in 6429)\n IGNORE;IGNORE;IGNORE;IGNORE % START OF HEADING (in 6429)\n IGNORE;IGNORE;IGNORE;IGNORE % START OF TEXT (in 6429)\n...\n ;;; % DIGIT THREE\n ;;; % FULLWIDTH DIGIT THREE\n ;;; % PARENTHESIZED DIGIT THREE\n ;;; % DIGIT THREE FULL STOP\n ;;<FONT>; % MATHEMATICAL BOLD DIGIT THREE\n...\n ;;; % CYRILLIC SMALL LETTER A\n ;;; % CYRILLIC CAPITAL LETTER A\n ;;; % CYRILLIC SMALL LETTER A WITH BREVE\n ;;; % CYRILLIC SMALL LETTER A WITH BREVE\n...\n ;;; % CYRILLIC SMALL LETTER BE\n ;;; % CYRILLIC CAPITAL LETTER BE\n ;;; % CYRILLIC SMALL LETTER VE\n ;;; % CYRILLIC CAPITAL LETTER VE\n...\norder_end<\/code><\/pre>\n<p><\/p>\n<p>Sada se mo\u017eemo ponovno vratiti na sortiranje primjera s po\u010detka \u010dlanka. Zamka je u ovom dijelu tabele te\u017eina:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">IGNORE;IGNORE;IGNORE % SPACE\n IGNORE;IGNORE;IGNORE % EXCLAMATION MARK\n IGNORE;IGNORE;IGNORE % QUOTATION MARK\n...<\/code><\/pre>\n<p><\/p>\n<p>Vidljivo je da u ovoj tablici postoje interpunkcijske znakove iz tablice <em>ASCII<\/em> (uklju\u010duju\u0107i razmak) pri usporedbi nizova gotovo uvijek se ignorira. Izuzetak \u010dine samo nizovi koji se u potpunosti podudaraju osim po interpunkcijskim znakovima koji se nalaze na istim pozicijama. Nizovi iz mog primjera (nakon sortiranja) za algoritam usporedbe izgledaju ovako:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">AbakanovMihailMajstor\nJolkinaElakranov\u010dica\nIvanovaAllaMajstor\nIvanovAndrejZidar<\/code><\/pre>\n<p><\/p>\n<p>S obzirom na to da u tablici te\u017eina velika slova u ruskom jeziku dolaze nakon malih (na tre\u0107oj razini <em>&lt;CAP&gt;<\/em> te\u017ee od <em>&lt;MIN&gt;<\/em>), sortiranje izgleda potpuno ispravno.<\/p>\n<p><\/p>\n<p>Pri postavljanju varijable <em>LC_COLLATE=C<\/em> u\u010ditava se posebna tablica koja postavlja usporedbu bajt po bajt<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">static const uint32_t collseqwc[] =\n{\n  8, 1, 8, 0x0, 0xff,\n  \/* 1st-level table *\/\n  6 * sizeof (uint32_t),\n  \/* 2nd-level table *\/\n  7 * sizeof (uint32_t),\n  \/* 3rd-level table *\/\n  L'x00', L'x01', L'x02', L'x03', L'x04', L'x05', L'x06', L'x07',\n  L'x08', L'x09', L'x0a', L'x0b', L'x0c', L'x0d', L'x0e', L'x0f',\n\n...\n  L'xf8', L'xf9', L'xfa', L'xfb', L'xfc', L'xfd', L'fe', L'xff'\n};<\/code><\/pre>\n<p><\/p>\n<p>Budu\u0107i da u Unicodeu kodna to\u010dka \u0401 dolazi prije A, tako se i nizovi sortiraju u skladu s tim.<\/p>\n<p><\/p>\n<h1 id=\"tekstovye-i-dvoichnye-tablicy\">Tekstualne i binarne tablice<\/h1>\n<p><\/p>\n<p>O\u010digledno je da je usporedba nizova iznimno \u010desta operacija, a analiza tablice <em>CTT<\/em> prili\u010dno je skupa procedura. Za optimizaciju pristupa tablici, ona se kompajlira u binarni oblik pomo\u0107u naredbe <em>localedef<\/em>.<\/p>\n<p><\/p>\n<p>Komanda <em>localedef<\/em> prima kao parametre datoteku s tablicom nacionalnih zna\u010dajki (opcija <em>-i<\/em>), u kojoj su svi simboli predstavljeni Unicode to\u010dkama, i datoteku koja odgovara to\u010dkama Unicode simbolima odre\u0111ene kodirane (opcija <em>-f<\/em>). Kao rezultat rada stvaraju se binarne datoteke za lokalitet, s imenom navedenim u posljednjem parametru.<\/p>\n<p><\/p>\n<p><em>Glibc<\/em> podr\u017eava dva formata binarnih datoteka: &quot;tradicionalni&quot; i &quot;moderna&quot;.<\/p>\n<p><\/p>\n<p>Tradicionalni format podrazumijeva da je ime lokaliteta, ime poddirektorija u <em>\/usr\/lib\/locale\/<\/em>. U ovom poddirektoriju se pohranjuju binarne datoteke <em>LC_COLLATE<\/em>, <em>LC_CTYPE<\/em>, <em>LC_TIME<\/em> i sli\u010dno. Datoteka <em>LC_IDENTIFICATION<\/em> sadr\u017ei formalno ime lokaliteta (koje mo\u017ee biti razli\u010dito od imena direktorija) i komentare.<\/p>\n<p><\/p>\n<p>Moderni format podrazumijeva pohranu svih lokaliteta u jedinstvenom arhivu <em>\/usr\/lib\/locale\/locale-archive<\/em>, koji se prikazuje u virtualnu memoriju svih procesa koji koriste <em>glibc<\/em>Ime lokalizacije u suvremenom formatu podlije\u017ee odre\u0111enoj kanonizaciji \u2014 u nazivima kodiranja ostaju samo brojevi i slova, svedeni na mala slova. Tako <em>hr_HR.KOI8-R<\/em>, \u0107e biti sa\u010duvano kao <em>hr_HR.koi8r<\/em>.<\/p>\n<p><\/p>\n<p>Ulazne datoteke tra\u017ee se u trenutnom katalogu, kao i u katalogima <em>\/usr\/share\/i18n\/locales\/<\/em> i <em>\/usr\/share\/i18n\/charmaps\/<\/em> za datoteke <em>CTT<\/em> i datoteke kodiranja sukladno tome.<\/p>\n<p><\/p>\n<p>Na primjer, naredba<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">localedef -i hr_HR -f MAC-CYRILLIC hr_HR.MAC-CYRILLIC<\/code><\/pre>\n<p><\/p>\n<p>kompajlirat \u0107e datoteku <em>\/usr\/share\/i18n\/locales\/ru_RU<\/em> koriste\u0107i datoteku kodiranja <em>\/usr\/share\/i18n\/charmaps\/MAC-CYRILLIC.gz<\/em> i sa\u010duvat \u0107e rezultat u <em>\/usr\/lib\/locale\/locale-archive<\/em> pod imenom <em>hr_HR.maccyrillic<\/em><\/p>\n<p><\/p>\n<p>Ako postavite varijablu <em>LANG=en_US.UTF-8<\/em> onda <em>glibc<\/em> \u0107e tra\u017eiti binarne datoteke lokalizacije u sljede\u0107em redoslijedu datoteka i katalog\u00e2:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">\/usr\/lib\/locale\/locale-archive\n\/usr\/lib\/locale\/en_US.UTF-8\/\n\/usr\/lib\/locale\/en_US\/\n\/usr\/lib\/locale\/enUTF-8\/\n\/usr\/lib\/locale\/en\/<\/code><\/pre>\n<p><\/p>\n<p>Ako se lokalizacija pojavljuje i u tradicionalnom i u suvremenom formatu, prioritet se daje suvremenom.<\/p>\n<p><\/p>\n<p>Popis kompajliranih lokalizacija mo\u017eete pregledati naredbom <em>locale -a<\/em>.<\/p>\n<p><\/p>\n<h1 id=\"podgotovka-svoey-tablicy-sravneniya\">Priprema vlastite tablice usporedbe<\/h1>\n<p><\/p>\n<p>Sada, s znanjem na raspolaganju, mo\u017eete stvoriti vlastitu idealnu tablicu usporedbe nizova. Ova tablica mora ispravno uspore\u0111ivati ruska slova, uklju\u010duju\u0107i slovo \u0401, i pritom uzimati u obzir interpunkcijske znakove prema tablici <em>ASCII<\/em>.<\/p>\n<p><\/p>\n<p>Proces pripreme vlastite tablice sortiranja sastoji se od dva koraka: ure\u0111ivanja tablice te\u017eina i kompilacije u binarni oblik naredbom <em>localedef<\/em>.<\/p>\n<p><\/p>\n<p>Kako bi se tablica usporedbe mogla prilago\u0111avati s minimalnim tro\u0161kovima ure\u0111ivanja, u formatu <em>ISO 14652<\/em> predvi\u0111ene su sekcije korekcije te\u017eina ve\u0107 postoje\u0107e tablice. Sekcija po\u010dinje klju\u010dnom rije\u010di <em>reorder-after<\/em> i naznakom pozicije nakon koje se provodi zamjena. Sekciju zavr\u0161ava redak <em>reorder-end<\/em>. Ako je potrebno ispraviti nekoliko dijelova tablice, stvara se po sekciji za svaki takav dio.<\/p>\n<p><\/p>\n<p>Kopirao sam nove verzije datoteka <em>iso14651_t1_common<\/em> i <em>ru_RU<\/em> iz repozitorija <em>glibc<\/em> u svoj doma\u0107i katalog ~\/.local\/share\/i18n\/locales\/ i malo uredio odjeljak <em>LC_COLLATE<\/em> u <em>ru_RU<\/em>. Nove verzije datoteka u potpunosti su kompatibilne s mojom verzijom <em>glibc<\/em>. Ako \u017eelite koristiti stare verzije datoteka, morat \u0107ete promijeniti simboli\u010dke nazive i mjesto s kojeg po\u010dinje zamjena u tablici.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">LC_COLLATE\n% Kopirajte predlo\u017eak iz ISO\/IEC 14651\nkopirati &quot;iso14651_t1&quot;\nreorder-after &lt;U000D&gt;\n&lt;U0020&gt; &lt;S0020&gt;;&lt;BASE&gt;;&lt;MIN&gt;&lt;U0020&gt; % PROSTOR\n&lt;U0021&gt; &lt;S0021&gt;;&lt;BASE&gt;&lt;MIN&gt;&lt;U0021&gt; % UZVI\u010cNIK\n&lt;U0022&gt; &lt;S0022&gt;;&lt;BASE&gt;&lt;MIN&gt;&lt;U0022&gt; % NAVODNIK\n...\n&lt;U007D&gt; &lt;S007D&gt;;&lt;BASE&gt;&lt;MIN&gt;&lt;U007D&gt; % DESNI ZAVR\u0160ETAK\n&lt;U007E&gt; &lt;S007E&gt;;&lt;BASE&gt;&lt;MIN&gt;&lt;U007E&gt; % TILDA\nreorder-end\nEND LC_COLLATE<\/code><\/pre>\n<p><\/p>\n<p>U stvari, trebalo bi promijeniti polja u <em>LC_IDENTIFICATION<\/em> tako da upu\u0107uju na lokalizaciju <em>hr_MY<\/em>, ali u mom primjeru to nije bilo potrebno, jer sam iz pretra\u017eivanja lokalizacija isklju\u010dio arhivu <em>locale-archive<\/em>.<\/p>\n<p><\/p>\n<p>Da <em>localedef<\/em> radio s datotekama u svojoj mapi preko varijable <em>I18NPATH<\/em> mo\u017ee\u0161 dodati dodatni katalog za pretra\u017eivanje ulaznih datoteka, a katalog za spremanje binarnih datoteka mo\u017ee\u0161 odrediti kao putanju sa kosim crticama:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; I18NPATH=~\/.local\/share\/i18n localedef -i hr_HR -f UTF-8 ~\/.local\/lib\/locale\/hr_MY.UTF-8<\/code><\/pre>\n<p><\/p>\n<p><em>POSIX<\/em> podrazumijeva da u <em>LANG<\/em> mo\u017ee\u0161 pisati apsolutne putanje do katalog\u00e2 s datotekama lokalizacije, po\u010dinju\u0107i s kosom crticom, ali <em>glibc<\/em> u <em>Linux<\/em> svi putevi se ra\u010dunaju od osnovnog kataloga, koji se mo\u017ee predefinirati preko varijable <em>LOCPATH<\/em>. Nakon postavljanja <em>LOCPATH=~\/.local\/lib\/locale\/<\/em> sve datoteke povezane s lokalizacijom bit \u0107e tra\u017eene samo u mojoj mapi. Arhiva lokalizacija uz postavljenu varijablu <em>LOCPATH<\/em> se ignorira.<\/p>\n<p><\/p>\n<p>Evo odlu\u010duju\u0107eg testa:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; LANG=hr_MY.UTF-8 LOCPATH=~\/.local\/lib\/locale\/ sort buhg.txt\nAbakanov Mihail;slikar\nJolkina Ella;operater\nIvanov Andrij;bravar\nIvanova Alla;advokat<\/code><\/pre>\n<p><\/p>\n<p>Ura! Uspjeli smo!<\/p>\n<p><\/p>\n<h1 id=\"rabota-nad-oshibkami\">Rad na gre\u0161kama<\/h1>\n<p><\/p>\n<p>Ve\u0107 sam odgovorio na pitanja o sortiranju redaka postavljenim na po\u010detku, ali jo\u0161 su ostala neka pitanja o gre\u0161kama \u2014 vidljivim i nevidljivim.<\/p>\n<p><\/p>\n<p>Vratimo se izvornoj zada\u0107i.<\/p>\n<p><\/p>\n<p>I program <em>sort<\/em> i program <em>join<\/em> koriste iste funkcije za usporedbu redaka iz <em>glibc<\/em>. Kako se dogodilo da <em>join<\/em> je prijavljivao gre\u0161ku sortiranja na redovima, sortiranim komandom <em>sort<\/em> u lokalizaciji <em>en_US.UTF-8<\/em>? \u041e\u0442\u0432\u0435\u0442 \u043f\u0440\u043e\u0441\u0442: <em>sort<\/em> uspore\u0111uje cijeli redak, dok <em>join<\/em> uspore\u0111uje samo klju\u010d, koji je prema zadanim postavkama po\u010detak retka do prvog razmaknog simbola. U mom primjeru to je dovelo do poruke o gre\u0161ci jer sortiranje prvih rije\u010di u redovima nije odgovaralo sortiranju cijelih redova.<\/p>\n<p><\/p>\n<p>Lokalizacija <em>&quot;C&quot;<\/em> jam\u010di da \u0107e u sortiranim redovima po\u010detne podnizovi do prvog razmaka tako\u0111er biti sortirani, ali to samo prikriva gre\u0161ku. Mogu se odabrati podaci (ljudi sa istim prezimenima, ali razli\u010ditim imenima), koji bez poruke o gre\u0161ci mogu dati pogre\u0161an rezultat spajanja datoteka. Ako \u017eelimo da <em>join<\/em> spaja redove datoteka po imenu i prezimenu, ispravan na\u010din bi bio eksplicitno odrediti razdjelnik polja i sortirati po klju\u010dnom polju, a ne po cijelom redu. U tom slu\u010daju \u0107e i spajanje pro\u0107i ispravno i u nijednoj lokalizaciji ne\u0107e biti gre\u0161aka:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; sort -t ; -k 1 buhg.txt &gt; buhg.srt\n$&gt; sort -t ; -k 1 mail.txt &gt; mail.srt\n$&gt; join -t ; buhg.srt mail.srt &gt; result<\/code><\/pre>\n<p><\/p>\n<p>Primjer uspje\u0161no izvr\u0161en u kodiranju <em>CP1251<\/em> sadr\u017ei jo\u0161 jednu gre\u0161ku. Naime, u svim meni poznatim distribucijama <em>Linux<\/em> nedostaje iskompilirana lokalizacija u paketima <em>ru_RU.CP1251<\/em>. Ako iskompilirana lokalizacija nije prona\u0111ena, tada <em>sort<\/em> tiho koristi byte-by-byte usporedbu, \u0161to smo i primijetili.<\/p>\n<p><\/p>\n<p>Usput, postoji jo\u0161 jedan mali bug vezan za nedostupnost iskompiliranih lokalizacija. Komanda <em>LOCPATH=\/tmp locale -a<\/em> izdaje popis svih lokalizacija u <em>locale-archive<\/em>, ali uz postavljenu varijablu <em>LOCPATH<\/em> za sve programe (uklju\u010duju\u0107i i samu <em>locale<\/em>) ove lokalizacije \u0107e biti nedostupne.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; LOCPATH=\/tmp locale -a | grep en_US\nlocale: Cannot set LC_CTYPE to default locale: No such file or directory\nlocale: Cannot set LC_MESSAGES to default locale: No such file or directory\nlocale: Cannot set LC_COLLATE to default locale: No such file or directory\nen_US\nen_US.iso88591\nen_US.iso885915\nen_US.utf8\n\n$&gt; LC_COLLATE=en_US.UTF-8 sort --debug\nsort: using \u2018en_US.UTF-8\u2019 sorting rules\n\n$&gt; LOCPATH=\/tmp LC_COLLATE=en_US.UTF-8 sort --debug\nsort: using simple byte comparison<\/code><\/pre>\n<p><\/p>\n<h1 id=\"zaklyuchenie\">Zaklju\u010dak<\/h1>\n<p><\/p>\n<p>Ako ste programer koji smatra da su stringovi skupovi bajtova, tada je va\u0161 izbor <em>LC_COLLATE=C<\/em>.<\/p>\n<p><\/p>\n<p>Ako ste lingvist ili sastavlja\u010d rje\u010dnika, bolje bi bilo da iskompilirate svoju lokalizaciju.<\/p>\n<p><\/p>\n<p>Ako ste obi\u010dni korisnik, dovoljno je da se naviknete na to da komanda <em>ls -a<\/em> izdaje datoteke koje po\u010dinju to\u010dkom, zajedno s datotekama koje po\u010dinju slovom, a <em>Midnight Commander<\/em>, koji koristi svoje unutarnje funkcije za sortiranje imena, izdvaja datoteke koje po\u010dinju to\u010dkom na po\u010detak popisa.<\/p>\n<p><\/p>\n<h1 id=\"ssylki\">Linkovi<\/h1>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/unicode.org\/reports\/tr10\/\">Izvje\u0161taj br. 10 Unicode collation algorithm <\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/www.unicode.org\/Public\/UCA\/latest\/allkeys.txt\">Te\u017eine simbola na unicode.org <\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/userguide.icu-project.org\/intro\"><em>ICU<\/em> \u2014 implementacija knji\u017enice za rad s Unicode-om od IBM-a. <\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/demo.icu-project.org\/icu-bin\/collation.html\">Test sortiranja pomo\u0107u <em>ICU<\/em> <\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/www.iso.org\/ittf\/ISO14651_2006_TABLE1_en.txt\">Te\u017eine simbola u <em>ISO 14651<\/em> <\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/www.open-std.org\/JTC1\/SC22\/WG20\/docs\/n972-14652ft.pdf\">Opis formata datoteke s te\u017einama <em>ISO 14652<\/em> <\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/sourceware.org\/bugzilla\/show_bug.cgi?id=14095\">Rasprava o usporedbi stringova u <em>glibc<\/em><\/a><\/noindex><\/p>\n<p>Izvor: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/503960\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0412\u0441\u0451 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0441 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0430\u0434\u0440\u0435\u0441\u0430\u0445 e-mail \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u043e\u0447\u0442\u043e\u0432\u043e\u0439 \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438, \u0441 \u0434\u043e\u043b\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 \u0431\u0430\u0437\u044b \u043e\u0442\u0434\u0435\u043b\u0430 \u043a\u0430\u0434\u0440\u043e\u0432. \u041e\u0431\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 \u0431\u044b\u043b\u0438 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 \u042e\u043d\u0438\u043a\u043e\u0434 UTF-8 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b \u0441 \u044e\u043d\u0438\u043a\u0441\u043e\u0432\u0441\u043a\u0438\u043c\u0438 \u043a\u043e\u043d\u0446\u0430\u043c\u0438 \u0441\u0442\u0440\u043e\u043a. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 mail.txt \u0418\u0432\u0430\u043d\u043e\u0432 \u0410\u043d\u0434\u0440\u0435\u0439;ia@example.com \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 buhg.txt \u0418\u0432\u0430\u043d\u043e\u0432\u0430 \u0410\u043b\u043b\u0430;\u043c\u0430\u043b\u044f\u0440 \u0401\u043b\u043a\u0438\u043d\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-83055","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.4 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0412\u0441\u0451 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0441 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0430\u0434\u0440\u0435\u0441\u0430\u0445 e-mail \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u043e\u0447\u0442\u043e\u0432\u043e\u0439 \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438, \u0441.\" \/>\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\/hr\/blog\/administrirovanie\/kak-linuxovskij-sort-sortiruet-stroki\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"hr_HR\" \/>\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\u041a\u0430\u043a Linux\u2019\u043e\u0432\u0441\u043a\u0438\u0439 sort \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0412\u0441\u0451 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0441 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0430\u0434\u0440\u0435\u0441\u0430\u0445 e-mail \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u043e\u0447\u0442\u043e\u0432\u043e\u0439 \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438, \u0441.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/kak-linuxovskij-sort-sortiruet-stroki\" \/>\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-05-27T23:42:15+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-27T23:42:15+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\udd47Kako Linux-ov sort sortira stringove | ProHoster","description":"Uvod Sve je po\u010delo s kratkim skriptom koji je trebao spojiti informacije o e-mail adresama zaposlenika, dobivenim iz popisa korisnika mailing liste, s.","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/kak-linuxovskij-sort-sortiruet-stroki","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","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\u041a\u0430\u043a Linux\u2019\u043e\u0432\u0441\u043a\u0438\u0439 sort \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 | ProHoster","og:description":"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0412\u0441\u0451 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0441 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0430\u0434\u0440\u0435\u0441\u0430\u0445 e-mail \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u043e\u0447\u0442\u043e\u0432\u043e\u0439 \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438, \u0441.","og:url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/kak-linuxovskij-sort-sortiruet-stroki","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-05-27T23:42:15+00:00","article:modified_time":"2020-05-27T23:42:15+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"83055","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 15:26:22","updated":"2022-09-27 19:16:08","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/83055","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=83055"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/83055\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=83055"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=83055"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=83055"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}