{"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\/sk\/blog\/administrirovanie\/kak-linuxovskij-sort-sortiruet-stroki","title":{"rendered":"Ako Linux&#8217;ov\u00fd sort triedi re\u0165azce","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1 id=\"vvedenie\">\u00davod<\/h1>\n<p><\/p>\n<p>V\u0161etko sa za\u010dalo s kr\u00e1tkym skriptom, ktor\u00fd mal spoji\u0165 inform\u00e1cie o adres\u00e1ch <em>e-mail<\/em> zamestnancov, z\u00edskan\u00fdch zo zoznamu pou\u017e\u00edvate\u013eov e-mailov\u00e9ho rozosielania, s poz\u00edciami zamestnancov, z\u00edskan\u00fdmi z datab\u00e1zy oddelenia \u013eudsk\u00fdch zdrojov. Oba zoznamy boli exportovan\u00e9 do textov\u00fdch s\u00faborov v k\u00f3dovan\u00ed Unicode <em>UTF-8<\/em> a ulo\u017een\u00e9 s unixov\u00fdmi koncami riadkov.<\/p>\n<p><\/p>\n<p>Obsah <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>Obsah <em>buhg.txt<\/em><\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Ivanov\u00e1 Alla;mal\u00e1r\nJelkina Ella;\u017eeriavnik\nIvanov Andrej;spor\u00e1k\nAbakanov Michal;mal\u00e1r<\/code><\/pre>\n<p><\/p>\n<p>Pre zl\u00fa\u010denie boli s\u00fabory zoraden\u00e9 unixov\u00fdm pr\u00edkazom <em>sort<\/em> a zadan\u00e9 do vstupu unixov\u00e9ho programu <em>join<\/em>, ktor\u00fd n\u00e1hle skon\u010dil s chybou: <\/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: nie je zoraden\u00e9: Ivanov Andrej;spor\u00e1k<\/code><\/pre>\n<p><\/p>\n<p>N\u00e1h\u013ead v\u00fdsledku triedenia uk\u00e1zal, \u017ee celkov\u00e9 triedenie je spr\u00e1vne, ale v pr\u00edpade zhodn\u00fdch mu\u017esk\u00fdch a \u017eensk\u00fdch priezvisk, \u017eensk\u00e9 priezvisk\u00e1 s\u00fa pred mu\u017esk\u00fdmi:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; sort buhg.txt\nAbakanov Michal;mal\u00e1r\nJelkina Ella;\u017eeriavnik\nIvanov\u00e1 Alla;mal\u00e1r\nIvanov Andrej;spor\u00e1k<\/code><\/pre>\n<p><\/p>\n<p>Vyzer\u00e1 to ako chyba triedenia v Unicode alebo ako prejav feministick\u00e9ho pr\u00edstupu v algoritme triedenia. Prv\u00e9, samozrejme, znie pravdepodobnej\u0161ie.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Zatia\u013e to nechajme tak <em>join<\/em> a s\u00fastre\u010fme sa na <em>sort<\/em>. Sk\u00fasime vyrie\u0161i\u0165 \u00falohu met\u00f3dou pokus-omyl. Na za\u010diatok zmen\u00edme lokalitu na <em>en_US<\/em> na <em>ru_RU<\/em>. Na triedenie by sta\u010dilo nastavi\u0165 premenn\u00fa prostredia <em>LC_COLLATE<\/em>, ale nebudeme sa zaobera\u0165 mali\u010dkos\u0165ami:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; LANG=ru_RU.UTF-8 sort buhg.txt\nAbakanov Michal;mal\u00e1r\nJelkina Ella;\u017eeriavnik\nIvanov\u00e1 Alla;mal\u00e1r\nIvanov Andrej;spor\u00e1k<\/code><\/pre>\n<p><\/p>\n<p>Ni\u010d sa nezmenilo.<\/p>\n<p><\/p>\n<p>Sk\u00fasime prek\u00f3dova\u0165 s\u00fabory do jednoubytov\u00e9ho k\u00f3dovania: <\/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>Op\u00e4\u0165 sa ni\u010d nezmenilo.<\/p>\n<p><\/p>\n<p>Ni\u010d sa ned\u00e1 robi\u0165, budeme musie\u0165 n\u00e1js\u0165 rie\u0161enie na internete. Priame inform\u00e1cie o rusk\u00fdch priezvisk\u00e1ch nie s\u00fa, ale existuj\u00fa ot\u00e1zky o in\u00fdch zvl\u00e1\u0161tnostiach triedenia. Napr\u00edklad tak\u00fdto probl\u00e9m: <noindex><a rel=\"nofollow\" href=\"https:\/\/serverfault.com\/questions\/95579\/unix-sort-treats-dash-characters-as-invisible\/95593\">Unix sort pova\u017euje znaky &#8216;-&#8216; (poml\u010dka) za nevidite\u013en\u00e9<\/a><\/noindex>. Ak to zhrnieme, re\u0165azce &quot;a-b&quot;, &quot;aa&quot;, &quot;ac&quot; s\u00fa usporiadan\u00e9 ako &quot;aa&quot;, &quot;a-b&quot;, &quot;ac&quot;.<\/p>\n<p><\/p>\n<p>Odpove\u010f je v\u0161ade \u0161tandardn\u00e1: pou\u017eite program\u00e1torsk\u00fa lokalitu <em>&quot;C&quot;<\/em> a budete \u0161\u0165astn\u00ed. Sk\u00fa\u0161ame:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; LANG=C sort buhg.txt\nJelkina Ella;\u017eeriavnik\nAbakanov Michal;mal\u00e1r\nIvanov Andrej;spor\u00e1k\nIvanov\u00e1 Alla;advok\u00e1t<\/code><\/pre>\n<p><\/p>\n<p>Nie\u010do sa zmenilo. Ivanovci sa zoradili do spr\u00e1vneho poradia, pravda Jelkina niekam u\u0161la. Vraciame sa k p\u00f4vodnej \u00falohe:<\/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>Fungoval bez ch\u00fdb, ako s\u013e\u00fabil internet. A to aj napriek Jolkina v prvej rade.<\/p>\n<p><\/p>\n<p>Probl\u00e9m sa zd\u00e1 by\u0165 vyrie\u0161en\u00fd, ale pre ka\u017ed\u00fa n\u00e1hodu vysk\u00fa\u0161ame e\u0161te jedno rusk\u00e9 k\u00f3dovanie \u2014 windowsov\u00e9. <em>CP1251<\/em>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; iconv -f UTF-8 -t CP1251 buhg.txt \n | LANG=ru_RU.CP1251 sort \n | iconv -f CP1251 -t UTF8 <\/code><\/pre>\n<p><\/p>\n<p>V\u00fdsledok triedenia, ako je divn\u00e9, bude zhodn\u00fd s lokalitou. <em>&quot;C&quot;<\/em>, a cel\u00fd pr\u00edklad preto prech\u00e1dza bez ch\u00fdb. Nejak\u00e1 mystika.<\/p>\n<p><\/p>\n<p>Nem\u00e1m r\u00e1d mystiku v programovan\u00ed, preto\u017ee obvykle zakr\u00fdva chyby. Budem musie\u0165 v\u00e1\u017ene sa zaobera\u0165 ot\u00e1zkou, ako to funguje. <em>sort<\/em> a na \u010do to vpl\u00fdva. <em>LC_COLLATE<\/em> .<\/p>\n<p><\/p>\n<p>Na konci sa pok\u00fasim odpoveda\u0165 na ot\u00e1zky:<\/p>\n<p><\/p>\n<ul>\n<li>pre\u010do sa nespr\u00e1vne triedili \u017eensk\u00e9 priezvisk\u00e1.<\/li>\n<li>pre\u010do <em>LANG=ru_RU.CP1251<\/em> sa uk\u00e1zal ako ekvivalent. <em>LANG=C<\/em><\/li>\n<li>pre\u010do maj\u00fa <em>sort<\/em> a <em>join<\/em> r\u00f4zne predstavy o porad\u00ed trieden\u00fdch riadkov.<\/li>\n<li>pre\u010do vo v\u0161etk\u00fdch mojich pr\u00edkladoch s\u00fa chyby.<\/li>\n<li>a nakoniec, ako triedi\u0165 riadky pod\u013ea vlastn\u00e9ho vkusu.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"sortirovka-v-yunikode\">Triedenie v Unicode.<\/h1>\n<p><\/p>\n<p>Prvou zast\u00e1vkou bude technick\u00e1 spr\u00e1va \u010d. 10 s n\u00e1zvom. <noindex><a rel=\"nofollow\" href=\"https:\/\/unicode.org\/reports\/tr10\/\">Unicode collation algorithm.<\/a><\/noindex> na str\u00e1nke <noindex><a rel=\"nofollow\" href=\"https:\/\/unicode.org\">unicode.org.<\/a><\/noindex>. Spr\u00e1va obsahuje mno\u017estvo technick\u00fdch podrobnost\u00ed, tak\u017ee si dovo\u013eujem uvies\u0165 stru\u010dn\u00fd preh\u013ead hlavn\u00fdch my\u0161lienok.<\/p>\n<p><\/p>\n<p><em>Triedenie<\/em> \u2014 &quot;porovnanie&quot; re\u0165azcov \u2014 je z\u00e1kladom ka\u017ed\u00e9ho algoritmu triedenia. Algoritmy m\u00f4\u017eu by\u0165 r\u00f4zne (&quot;bublinov\u00e9&quot;, &quot;zl\u00fa\u010denie&quot;, &quot;r\u00fdchle&quot;), ale v\u0161etky pou\u017e\u00edvaj\u00fa porovnanie dvojice re\u0165azcov na ur\u010denie poradia ich nasledovania.<\/p>\n<p><\/p>\n<p>Triedenie riadkov v prirodzenom jazyku je dos\u0165 zlo\u017eit\u00fd probl\u00e9m. Aj v najjednoduch\u0161\u00edch jednobytn\u00fdch k\u00f3dovaniach poradie p\u00edsmen v abecede, aspo\u0148 v nie\u010dom odli\u0161nom od anglickej latinky, u\u017e nebude zodpoveda\u0165 poradiu \u010d\u00edseln\u00fdch hodn\u00f4t, ktor\u00fdmi s\u00fa tieto p\u00edsmen\u00e1 k\u00f3dovan\u00e9. Tak v nemeckej abecede p\u00edsmeno. <em>\u00d6<\/em> stoj\u00ed medzi <em>O<\/em> a <em>P<\/em>, a v k\u00f3dovan\u00ed. <em>CP850<\/em> sa dost\u00e1va medzi <em>\u00ff<\/em> a <em>\u00dc.<\/em>.<\/p>\n<p><\/p>\n<p>M\u00f4\u017eeme sa pok\u00fasi\u0165 abstrahova\u0165 od konkr\u00e9tnej k\u00f3dovania a posudzova\u0165 &quot;ide\u00e1lne&quot; p\u00edsmen\u00e1, ktor\u00e9 s\u00fa usporiadan\u00e9 v ur\u010ditom porad\u00ed, ako to rob\u00ed Unicode. K\u00f3dovania <em>UTF8<\/em>, <em>UTF16<\/em> alebo jednobyte. <em>KOI8-R<\/em> (ak potrebujete obmedzen\u00e9 podmno\u017estvo Unicode) bud\u00fa poskytova\u0165 r\u00f4zne \u010d\u00edseln\u00e9 reprezent\u00e1cie p\u00edsmen, ale odkazuj\u00fa z\u00e1rove\u0148 na tie ist\u00e9 prvky z\u00e1kladnej tabu\u013eky. <\/p>\n<p><\/p>\n<p>Zjavuje sa, \u017ee aj ke\u010f si vytvor\u00edme tabu\u013eku znakov odznova, nebudeme schopn\u00ed ur\u010di\u0165 univerz\u00e1lny poriadok znakov. V r\u00f4znych n\u00e1rodn\u00fdch abeced\u00e1ch, ktor\u00e9 pou\u017e\u00edvaj\u00fa rovnak\u00e9 p\u00edsmen\u00e1, sa poradie t\u00fdchto p\u00edsmen m\u00f4\u017ee l\u00ed\u0161i\u0165. Napr\u00edklad vo franc\u00fazskom jazyku <em>\u00c6<\/em> bude pova\u017eovan\u00e9 za ligat\u00faru a trieden\u00e9 ako re\u0165azec <em>AE<\/em>. V n\u00f3rskom jazyku <em>\u00c6<\/em> bude samostatn\u00fdm p\u00edsmenom, ktor\u00e9 sa nach\u00e1dza po <em>Z<\/em>. Mimochodom, okrem ligat\u00far ako <em>\u00c6<\/em> existuj\u00fa p\u00edsmen\u00e1, ktor\u00e9 s\u00fa zapisovan\u00e9 nieko\u013ek\u00fdmi znakmi. Tak v \u010deskej abecede existuje p\u00edsmeno <em>Ch<\/em>, ktor\u00e9 sa nach\u00e1dza medzi <em>H<\/em> a <em>I<\/em>.<\/p>\n<p><\/p>\n<p>. Okrem rozdielov v abeced\u00e1ch existuj\u00fa aj in\u00e9 n\u00e1rodn\u00e9 trad\u00edcie ovplyv\u0148uj\u00face triedenie. Vznik\u00e1 ot\u00e1zka: v akom porad\u00ed by mali nasledova\u0165 v slovn\u00edku slov\u00e1 pozost\u00e1vaj\u00face z ve\u013ek\u00fdch a mal\u00fdch p\u00edsmen? Na triedenie m\u00f4\u017eu tie\u017e vpl\u00fdva\u0165 \u0161peci\u00e1lne pravidl\u00e1 pou\u017e\u00edvania interpunk\u010dn\u00fdch znamienok. V \u0161panielskom jazyku sa na za\u010diatku ot\u00e1zkov\u00e9ho vety vklad\u00e1 obr\u00e1ten\u00e9 ot\u00e1znik (<em>\u00bfTe gusta la m\u00fasica?<\/em>). V tomto pr\u00edpade je zrejm\u00e9, \u017ee ot\u00e1zkov\u00e9 vety by nemali by\u0165 zaraden\u00e9 do samostatn\u00e9ho klastru mimo abecedy, a ako by sa mali triedi\u0165 re\u0165azce s in\u00fdmi interpunk\u010dn\u00fdmi znakmi?<\/p>\n<p><\/p>\n<p>Nebudem sa zastavova\u0165 na trieden\u00ed re\u0165azcov v jazykoch, ktor\u00e9 sa v\u00fdrazne l\u00ed\u0161ia od eur\u00f3pskych. Upozor\u0148ujem, \u017ee v jazykoch s pravoruk\u00fdm alebo zvisl\u00fdm smerom p\u00edsania sa znaky v re\u0165azcoch pravdepodobne uchov\u00e1vaj\u00fa v porad\u00ed \u010d\u00edtania, a dokonca aj v neabecedn\u00fdch p\u00edsomnostiach existuj\u00fa svoje sp\u00f4soby znakov\u00e9ho radenia re\u0165azcov. Napr\u00edklad, hieroglyfy m\u00f4\u017eu by\u0165 raden\u00e9 pod\u013ea vzh\u013eadu (<noindex><a rel=\"nofollow\" href=\"https:\/\/studychinese.ru\/kljuchi\/\">k\u013e\u00fa\u010de \u010d\u00ednskych hieroglyfov<\/a><\/noindex>) alebo pod\u013ea v\u00fdslovnosti. Ako by mali by\u0165 raden\u00e9 emoji, \u00faprimne povedan\u00e9, si neviem predstavi\u0165, ale aj pre ne by sa mohlo nie\u010do vymyslie\u0165.<\/p>\n<p><\/p>\n<p>Na z\u00e1klade uveden\u00fdch zvl\u00e1\u0161tnost\u00ed boli formulovan\u00e9 z\u00e1kladn\u00e9 po\u017eiadavky na porovn\u00e1vanie re\u0165azcov, zalo\u017een\u00e9 na tabu\u013ek\u00e1ch Unicode:<\/p>\n<p><\/p>\n<ul>\n<li>porovnanie re\u0165azcov nez\u00e1vis\u00ed od umiestnenia znakov v k\u00f3 movej tabu\u013eke;<\/li>\n<li>sekvencie znakov, ktor\u00e9 tvoria jeden znak, s\u00fa preveden\u00e9 do kanonick\u00e9ho tvaru (<em>A<\/em> + horn\u00fd kruh to ist\u00e9, \u010do a <em>\u00c5<\/em>);<\/li>\n<li>pri porovn\u00e1van\u00ed re\u0165azcov sa znak posudzuje v kontexte re\u0165azca a, ak je to potrebn\u00e9, sp\u00e1ja sa so susedmi do jednej porovn\u00e1vacej jednotky (<em>Ch<\/em> v \u010deskom) alebo sa rozdel\u00ed na nieko\u013eko (<em>\u00c6<\/em> vo franc\u00fazskom);<\/li>\n<li>V\u0161etky n\u00e1rodn\u00e9 \u0161pecifik\u00e1 (abeceda, ve\u013ek\u00e9\/mal\u00e9 p\u00edsmen\u00e1, interpunkcia, poradie druhov p\u00edsania) musia by\u0165 nastavite\u013en\u00e9 a\u017e na manu\u00e1lne ur\u010denie poradia (emod\u017ei);<\/li>\n<li>Porovnanie je d\u00f4le\u017eit\u00e9 nielen pre triedenie, ale aj na mnoh\u00fdch in\u00fdch miestach, napr\u00edklad na ur\u010denie rozsahov riadkov (z\u00e1stupca {A\u2026 \u044f} v <em>bash<\/em>);<\/li>\n<li>Porovnanie by sa malo vykon\u00e1va\u0165 dostato\u010dne r\u00fdchlo.<\/li>\n<\/ul>\n<p><\/p>\n<p>Okrem toho autori spr\u00e1vy formulovali vlastnosti porovnania, na ktor\u00e9 sa v\u00fdvoj\u00e1ri algoritmu nemaj\u00fa spolieha\u0165:<\/p>\n<p><\/p>\n<ul>\n<li>Algoritmus porovania by nemal vy\u017eadova\u0165 samostatn\u00fa sadu znakov pre ka\u017ed\u00fd jazyk (ru\u0161tina a ukrajin\u010dina spolo\u010dne pou\u017e\u00edvaj\u00fa v\u00e4\u010d\u0161inu znakov cyriliky);<\/li>\n<li>Porovnanie by nemalo by\u0165 zalo\u017een\u00e9 na porad\u00ed znakov v tabu\u013ek\u00e1ch Unicode;<\/li>\n<li>Hmotnos\u0165 re\u0165azca by nemala by\u0165 atrib\u00fatom re\u0165azca, preto\u017ee ten ist\u00fd re\u0165azec v r\u00f4znych kult\u00farnych kontextoch m\u00f4\u017ee ma\u0165 r\u00f4zne hmotnosti;<\/li>\n<li>Hmotnosti re\u0165azcov sa m\u00f4\u017eu meni\u0165 pri zl\u00fa\u010den\u00ed alebo rozdelen\u00ed (z <em>x<\/em> &lt; <em>y<\/em> to neznamen\u00e1, \u017ee <em>xz<\/em> &lt; <em>yz<\/em>);<\/li>\n<li>R\u00f4zne re\u0165azce, ktor\u00e9 maj\u00fa rovnak\u00e9 hmotnosti, s\u00fa pova\u017eovan\u00e9 za rovnak\u00e9 z h\u013eadiska algoritmu triedenia. Zavedenie dodato\u010dn\u00e9ho usporiadania tak\u00fdchto re\u0165azcov je mo\u017en\u00e9, ale m\u00f4\u017ee zhor\u0161i\u0165 v\u00fdkon;<\/li>\n<li>Pri opakovan\u00fdch triedeniach sa re\u0165azce s rovnak\u00fdmi hmotnos\u0165ami m\u00f4\u017eu meni\u0165. Stabilita je vlastnos\u0165 konkr\u00e9tneho algoritmu triedenia, nie vlastnos\u0165 algoritmu porovn\u00e1vania re\u0165azcov (pozri predch\u00e1dzaj\u00faci bod);<\/li>\n<li>Pravidl\u00e1 triedenia sa m\u00f4\u017eu v priebehu \u010dasu meni\u0165 v s\u00falade s upresnen\u00edm\/zm\u011bnou kult\u00farnych trad\u00edci\u00ed.<\/li>\n<\/ul>\n<p><\/p>\n<p>Tie\u017e je uveden\u00e9, \u017ee algoritmus porovn\u00e1vania nevie ni\u010d o s\u00e9mantike spracov\u00e1van\u00fdch re\u0165azcov. Re\u0165azce pozost\u00e1vaj\u00face iba z \u010d\u00edslic by sa nemali porovn\u00e1va\u0165 ako \u010d\u00edsla a v zoznamoch anglick\u00fdch n\u00e1zvov by sa nemal odstra\u0148ova\u0165 \u010dl\u00e1nok (<em>Beatles, The<\/em>).<\/p>\n<p><\/p>\n<p>Aby bolo mo\u017en\u00e9 splni\u0165 v\u0161etky uveden\u00e9 po\u017eiadavky, bol navrhnut\u00fd viac\u00farov\u0148ov\u00fd (v skuto\u010dnosti \u0161tyroch\u00farov\u0148ov\u00fd) tabu\u013ekov\u00fd algoritmus triedenia.<\/p>\n<p><\/p>\n<p>Predt\u00fdm sa znaky v re\u0165azci prev\u00e1dzaj\u00fa na kanonick\u00fd tvar a skupinuj\u00fa sa do jednotiek porovn\u00e1vania. Ka\u017edej jednotke porovn\u00e1vania s\u00fa priraden\u00e9 nieko\u013eko hmotnost\u00ed, ktor\u00e9 zodpovedaj\u00fa nieko\u013ek\u00fdm \u00farovniam porovn\u00e1vania. Hmotnosti jednotiek porovn\u00e1vania s\u00fa prvky usporiadan\u00fdch mno\u017e\u00edn (v tomto pr\u00edpade cel\u00e9 \u010d\u00edsla), ktor\u00e9 je mo\u017en\u00e9 porovn\u00e1va\u0165 na viac-menej. \u0160peci\u00e1lna hodnota <em>IGNORED<\/em> (0x0) znamen\u00e1, \u017ee na pr\u00edslu\u0161nej \u00farovni porovnania sa dan\u00e1 jednotka na porovnan\u00ed nez\u00fa\u010dast\u0148uje. Porovn\u00e1vanie re\u0165azcov m\u00f4\u017ee prebieha\u0165 viackr\u00e1t, pri\u010dom sa pou\u017e\u00edvaj\u00fa v\u00e1hy pr\u00edslu\u0161n\u00fdch \u00farovn\u00ed. Na ka\u017edej \u00farovni sa v\u00e1hy porovn\u00e1vac\u00edch jednotiek dvoch re\u0165azcov postupne porovn\u00e1vaj\u00fa medzi sebou.<\/p>\n<p><\/p>\n<p>V r\u00f4znych realiz\u00e1ci\u00e1ch algoritmu pre r\u00f4zne n\u00e1rodn\u00e9 trad\u00edcie sa hodnoty koeficientov m\u00f4\u017eu l\u00ed\u0161i\u0165, ale do zlo\u017eenia \u0161tandardu Unicode patr\u00ed z\u00e1kladn\u00e1 tabu\u013eka v\u00e1h \u2014 <em>&quot;Default Unicode Collation Element Table&quot;<\/em> (<em>DUCET<\/em>). Chcem poznamena\u0165, \u017ee nastavenie premennej <em>LC_COLLATE<\/em> fakticky predstavuje ur\u010denie v\u00fdberu tabu\u013eky v\u00e1h vo funkcii porovn\u00e1vania re\u0165azcov.<\/p>\n<p><\/p>\n<p>V\u00e1hov\u00e9 koeficienty <em>DUCET<\/em> s\u00fa usporiadan\u00e9 nasledovne:<\/p>\n<p><\/p>\n<ul>\n<li>na prvej \u00farovni sa v\u0161etky p\u00edsmen\u00e1 uv\u00e1dzaj\u00fa do jedn\u00e9ho p\u00edsmena, diakritick\u00e9 znamienka sa ignoruj\u00fa, interpunkcia (nie v\u0161etka) sa ignoruje;<\/li>\n<li>na druhej \u00farovni sa zoh\u013ead\u0148uj\u00fa iba diakritick\u00e9 znamienka;<\/li>\n<li>na tretej \u00farovni sa zoh\u013ead\u0148uje iba p\u00edsmeno;<\/li>\n<li>na \u0161tvrtej \u00farovni sa zoh\u013ead\u0148uj\u00fa iba interpunk\u010dn\u00e9 znamienka.<\/li>\n<\/ul>\n<p><\/p>\n<p>Porovn\u00e1vanie prebieha v nieko\u013ek\u00fdch prechodoch: najprv sa porovn\u00e1vaj\u00fa koeficienty prvej \u00farovne; ak sa v\u00e1hy zhoduj\u00fa, prebieha op\u00e4tovn\u00e9 porovnanie s v\u00e1hami druhej \u00farovne; potom mo\u017eno aj tretej a \u0161tvrtej.<\/p>\n<p><\/p>\n<p>Porovn\u00e1vanie sa kon\u010d\u00ed, ke\u010f sa v re\u0165azcoch nach\u00e1dzaj\u00fa zodpovedaj\u00face si jednotky porovnania s r\u00f4znymi v\u00e1hami. Re\u0165azce, ktor\u00e9 maj\u00fa rovnak\u00e9 v\u00e1hy na v\u0161etk\u00fdch \u0161tyroch \u00farovniach, sa pova\u017euj\u00fa za rovnak\u00e9.<\/p>\n<p><\/p>\n<p>Tento algoritmus (s mno\u017estvom dodato\u010dn\u00fdch technick\u00fdch podrobnost\u00ed) dal n\u00e1zov spr\u00e1ve \u010d. 10 \u2014 <em>&quot;Unicode Collation Algorithm&quot;<\/em> (<em>UCA<\/em>).<\/p>\n<p><\/p>\n<p>V tomto mieste sa spr\u00e1vanie triedenia z n\u00e1\u0161ho pr\u00edkladu st\u00e1va o nie\u010do zrozumite\u013enej\u0161\u00edm. Bolo by dobr\u00e9 porovna\u0165 ho so \u0161tandardom Unicode.<\/p>\n<p><\/p>\n<p>Na testovanie realiz\u00e1ci\u00ed <em>UCA<\/em> existuje \u0161peci\u00e1lny <noindex><a rel=\"nofollow\" href=\"https:\/\/www.unicode.org\/Public\/UCA\/latest\/CollationTest.html\">test<\/a><\/noindex>, ktor\u00fd pou\u017e\u00edva <noindex><a rel=\"nofollow\" href=\"http:\/\/www.unicode.org\/Public\/UCA\/latest\/allkeys.txt\">s\u00fabor v\u00e1h<\/a><\/noindex>, implementuj\u00faci <em>DUCET<\/em>. V s\u00fabore v\u00e1h m\u00f4\u017eete n\u00e1js\u0165 r\u00f4zne zauj\u00edmavosti. Napr\u00edklad tam je poradie domina a eur\u00f3pskeho dom\u00edna, ako aj poradie farieb v bal\u00ed\u010dku kariet (symbol <em>1F000<\/em> a \u010falej). Kartov\u00e9 farby s\u00fa usporiadan\u00e9 pod\u013ea pravidiel brid\u017eu \u2014 P\u010cBT, a karty v farbe \u2014 v porad\u00ed T,2,3\u2026 K.<\/p>\n<p><\/p>\n<p>Ru\u010dn\u00e1 kontrola spr\u00e1vnosti triedenia re\u0165azcov v s\u00falade s <em>DUCET<\/em> by bolo dos\u0165 \u00fanavn\u00e9, ale na\u0161\u0165astie pre n\u00e1s existuje vzorov\u00e1 implement\u00e1cia kni\u017enice pre pr\u00e1cu s Unicode \u2014 &quot;<noindex><a rel=\"nofollow\" href=\"http:\/\/site.icu-project.org\/\">International Components for Unicode<\/a><\/noindex>&quot; (<em>ICU<\/em>).<\/p>\n<p><\/p>\n<p>Na str\u00e1nke tejto kni\u017enice, vyvinutej v <em>IBM<\/em>, s\u00fa demon\u0161tra\u010dn\u00e9 str\u00e1nky, vr\u00e1tane <noindex><a rel=\"nofollow\" href=\"http:\/\/demo.icu-project.org\/icu-bin\/collation.html\">str\u00e1nky algoritmu porovn\u00e1vania re\u0165azcov<\/a><\/noindex>. Zad\u00e1me na\u0161e testovacie re\u0165azce s predvolen\u00fdmi nastaveniami a, \u00f3 z\u00e1zrak, dostaneme dokonal\u00fa slovensk\u00fa triedu.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Abakanov Michal;mal\u00ed\u0159\nJolkina Ella;kranovnica\nIvanov Andrej;zv\u00e1ra\u010d\nIvanova Alla;advok\u00e1t<\/code><\/pre>\n<p><\/p>\n<p>Mimochodom, na str\u00e1nke <em>ICU<\/em> m\u00f4\u017eete n\u00e1js\u0165 objasnenie fungovania algoritmu porovn\u00e1vania pri spracovan\u00ed interpunk\u010dn\u00fdch znamienok. V pr\u00edkladoch <noindex><a rel=\"nofollow\" href=\"http:\/\/userguide.icu-project.org\/collation\/faq\">Collation FAQ<\/a><\/noindex> sa ignoruj\u00fa apostrof a poml\u010dka.<\/p>\n<p><\/p>\n<p>Unicode n\u00e1m pomohol, ale h\u013eada\u0165 pr\u00ed\u010diny zvl\u00e1\u0161tneho spr\u00e1vania <em>sort<\/em> v <em>Linux<\/em> budeme musie\u0165 niekde inde.<\/p>\n<p><\/p>\n<h1 id=\"sortirovka-v-glibc\">Triedenie v glibc<\/h1>\n<p><\/p>\n<p>R\u00fdchly preh\u013ead zdrojov\u00fdch k\u00f3dov n\u00e1stroja <em>sort<\/em> z <em>GNU Core Utils<\/em> uk\u00e1zal, \u017ee v samotnom n\u00e1stroji sa lokaliz\u00e1cia zjednodu\u0161uje na tla\u010d aktu\u00e1lnej hodnoty premennej <em>LC_COLLATE<\/em> pri spusten\u00ed v ladicoms re\u017eime:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ sort --debug buhg.txt &gt; buhg.srt\nsort: using 'sk_SK.UTF8' sorting rules<\/code><\/pre>\n<p><\/p>\n<p>Porovn\u00e1vanie re\u0165azcov sa vykon\u00e1va \u0161tandardnou funkciou <em>strcoll<\/em>, tak\u017ee v\u0161etko zauj\u00edmav\u00e9 sa nach\u00e1dza v kni\u017enici <em>glibc<\/em>.<\/p>\n<p><\/p>\n<p>Na <em>wiki<\/em> projektu <em>glibc<\/em> porovn\u00e1vaniu re\u0165azcov je zasv\u00e4ten\u00fd <noindex><a rel=\"nofollow\" href=\"https:\/\/sourceware.org\/glibc\/wiki\/Locales#LC_COLLATE\">jeden odsek<\/a><\/noindex>. Z tohto odseku sa d\u00e1 pochopi\u0165, \u017ee v <em>glibc<\/em> triedenie je zalo\u017een\u00e9 na u\u017e zn\u00e1mom algoritme <em>UCA<\/em> (<em>The Unicode collation algorithm<\/em>) a\/alebo na bl\u00edzkom \u0161tandarde <em>ISO 14651<\/em> (<em>Medzin\u00e1rodn\u00e9 usporiadanie a porovn\u00e1vanie re\u0165azcov<\/em>). O poslednom \u0161tandarde treba poznamena\u0165, \u017ee na str\u00e1nke <noindex><a rel=\"nofollow\" href=\"https:\/\/standards.iso.org\/ittf\/PubliclyAvailableStandards\">standards.iso.org<\/a><\/noindex> <em>ISO 14651<\/em> je ofici\u00e1lne vyhl\u00e1sen\u00fd za verejn\u00fd, ale pr\u00edslu\u0161n\u00fd odkaz vedie na neexistuj\u00facu str\u00e1nku. Google vracia nieko\u013eko str\u00e1nok s odkazmi na ofici\u00e1lne str\u00e1nky, ktor\u00e9 pon\u00fakaj\u00fa zak\u00fapi\u0165 elektronick\u00fa k\u00f3piu \u0161tandardu za sto eur, ale na tretej-\u0161tvrtej str\u00e1nke v\u00fdsledkov vyh\u013ead\u00e1vania n\u00e1jdete aj priame odkazy na <em>PDF<\/em>. Celkovo sa \u0161tandard prakticky nel\u00ed\u0161i od <em>UCA<\/em>, ale \u010d\u00edta sa nudnej\u0161ie, preto\u017ee neobsahuje \u017eiv\u00e9 pr\u00edklady n\u00e1rodn\u00fdch zvl\u00e1\u0161tnost\u00ed triedenia re\u0165azcov. <\/p>\n<p><\/p>\n<p>Najzauj\u00edmavej\u0161ou inform\u00e1ciou na <em>wiki<\/em> bola linka na <noindex><a rel=\"nofollow\" href=\"https:\/\/sourceware.org\/bugzilla\/show_bug.cgi?id=14095\">bugtracker<\/a><\/noindex> s diskusiou o implement\u00e1cii porovn\u00e1vania re\u0165azcov v <em>glibc<\/em>. Z diskusie sa dozvieme, \u017ee v <em>glibc<\/em> na porovn\u00e1vanie re\u0165azcov sa pou\u017e\u00edva <em>ISO<\/em>spolo\u010dn\u00e1 tabu\u013eka <noindex><a rel=\"nofollow\" href=\"http:\/\/www.iso.org\/ittf\/ISO14651_2006_TABLE1_en.txt\">The Common Template Table<\/a><\/noindex> (<em>CTT<\/em>), ktorej adresu n\u00e1jdete v pr\u00edlohe <em>A<\/em> \u0161tandardu <em>ISO 14651<\/em>. Medzi rokmi 2000 a 2015 sa t\u00e1to tabu\u013eka v <em>glibc<\/em> nemala \u00fadr\u017eb\u00e1ra a dos\u0165 sa l\u00ed\u0161ila (aspo\u0148 na poh\u013ead) od s\u00fa\u010dasnej verzie \u0161tandardu. Od roku 2015 do 2018 prebiehala adapt\u00e1cia na nov\u00fa verziu tabu\u013eky a v s\u00fa\u010dasnosti m\u00e1te \u0161ancu stretn\u00fa\u0165 v re\u00e1lnom \u017eivote ako nov\u00fd variant tabu\u013eky (<em>CentOS 8<\/em>), tak aj star\u00fd (<em>CentOS 7<\/em>). <\/p>\n<p><\/p>\n<p>Teraz, ke\u010f m\u00e1me v\u0161etky inform\u00e1cie o algoritme a pomocn\u00fdch tabu\u013ek\u00e1ch, m\u00f4\u017eeme sa vr\u00e1ti\u0165 k p\u00f4vodn\u00e9mu probl\u00e9mu a pochopi\u0165, ako spr\u00e1vne triedi\u0165 riadky v ruskej lokalite.<\/p>\n<p><\/p>\n<h1 id=\"iso-1465114652\">ISO 14651\/14652<\/h1>\n<p><\/p>\n<p>Zdrojov\u00fd k\u00f3d zauj\u00edmavej tabu\u013eky <em>CTT<\/em> vo v\u00e4\u010d\u0161ine distrib\u00faci\u00ed <em>Linux<\/em> sa nach\u00e1dza v adres\u00e1ri <em>\/usr\/share\/i18n\/locales\/<\/em>. Samotn\u00e1 tabu\u013eka sa nach\u00e1dza v s\u00fabore <em>iso14651_t1_common<\/em>. Potom sa tento s\u00fabor pomocou pr\u00edkazu <em>copy iso14651_t1_common<\/em> zahrnie do s\u00faboru <em>iso14651_t1<\/em>, ktor\u00fd sa zase zahrnie do n\u00e1rodn\u00fdch s\u00faborov, vr\u00e1tane <em>en_US<\/em> a <em>ru_RU<\/em>. Vo v\u00e4\u010d\u0161ine distrib\u00faci\u00ed <em>Linux<\/em> s\u00fa v\u0161etky zdrojov\u00e9 s\u00fabory zahrnut\u00e9 v z\u00e1kladnej in\u0161tal\u00e1cii, ale ak tam nie s\u00fa, budete musie\u0165 nain\u0161talova\u0165 dodato\u010dn\u00fd bal\u00edk z distrib\u00facie.<\/p>\n<p><\/p>\n<p>\u0160trukt\u00fara s\u00faboru <em>iso14651_t1<\/em> sa m\u00f4\u017ee zda\u0165 hrozne zlo\u017eit\u00e1, s nejasn\u00fdmi pravidlami pre vytv\u00e1ranie n\u00e1zvov, ale ak sa do toho pohrabete, v\u0161etko je dos\u0165 jednoduch\u00e9. \u0160trukt\u00fara je op\u00edsan\u00e1 v \u0161tandarde <em>ISO 14652<\/em>, k\u00f3piu ktor\u00e9ho si m\u00f4\u017eete stiahnu\u0165 z webu <noindex><a rel=\"nofollow\" href=\"http:\/\/www.open-std.org\/JTC1\/SC22\/WG20\/docs\/n972-14652ft.pdf\">open-std.org<\/a><\/noindex>. \u010eal\u0161\u00ed opis form\u00e1tu s\u00faboru si m\u00f4\u017eete pre\u010d\u00edta\u0165 v <noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/9699919799\/basedefs\/V1_chap07.html\">\u0161pecifik\u00e1ci\u00e1ch<\/a><\/noindex> <em>POSIX<\/em> od <em>OpenGroup<\/em>. Alternat\u00edvou k \u010d\u00edtaniu \u0161tandardu je presk\u00famanie zdrojov\u00fdch textov funkcie <em>collate_read<\/em> v <em>glibc\/locale\/programs\/ld-collate.c<\/em>.<\/p>\n<p><\/p>\n<p>\u0160trukt\u00fara s\u00faboru vyzer\u00e1 nasledovne:<\/p>\n<p><\/p>\n<p>Symbol sa predvolen\u011b pou\u017e\u00edva ako \u00fanikov\u00fd symbol a koniec riadku po symbole # je koment\u00e1rom. Obe symboly je mo\u017en\u00e9 predefinova\u0165, \u010do sa aj stalo v novej verzii tabu\u013eky:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">escape_char \/\ncomment_char %<\/code><\/pre>\n<p><\/p>\n<p>V s\u00fabore sa vyskytuj\u00fa tokeny vo form\u00e1te <em>&lt;Uxxxx&gt;<\/em> alebo <em>&lt;Uxxxxxxxx&gt;<\/em> (kde <em>x<\/em> \u2014 hexadecim\u00e1lna \u010d\u00edslica). Toto je hexadecim\u00e1lne zobrazenie k\u00f3dov\u00fdch bodov Unicode vo k\u00f3dovan\u00ed <em>UCS-4<\/em> (<em>UTF-32<\/em>). V\u0161etky ostatn\u00e9 prvky v uh\u013eov\u00fdch z\u00e1tvork\u00e1ch (vr\u00e1tane <em>&lt;Uxxxx_xxxx&gt;<\/em>, <em>&lt;2&gt;<\/em> a jemu podobn\u00e9), sa pova\u017euj\u00fa za jednoduch\u00e9 re\u0165azcov\u00e9 kon\u0161tanty, ktor\u00e9 nemaj\u00fa \u017eiadny \u0161peci\u00e1lny v\u00fdznam mimo kontextu.<\/p>\n<p><\/p>\n<p>Riadok <em>LC_COLLATE<\/em> n\u00e1m hovor\u00ed, \u017ee \u010falej nasleduj\u00fa \u00fadaje popisuj\u00face porovn\u00e1vanie re\u0165azcov.<\/p>\n<p><\/p>\n<p>Najsk\u00f4r sa ur\u010duj\u00fa n\u00e1zvy pre v\u00e1hy v tabu\u013eke porovn\u00e1vania a n\u00e1zvy pre kombin\u00e1cie symbolov. V podstate patr\u00ed dva typy n\u00e1zvov dvom r\u00f4znym entit\u00e1m, ale v re\u00e1lnom s\u00fabore s\u00fa pomie\u0161an\u00e9. N\u00e1zvy v\u00e1h s\u00fa ur\u010den\u00e9 k\u013e\u00fa\u010dov\u00fdm slovom <em>collating-symbol<\/em> (porovn\u00e1vac\u00ed symbol), preto\u017ee pri porovn\u00e1van\u00ed Unicode znaky s rovnakou v\u00e1hou bud\u00fa pova\u017eovan\u00e9 za ekvivalentn\u00e9 znaky.<\/p>\n<p><\/p>\n<p>Celkov\u00e1 d\u013a\u017eka sekcie v aktu\u00e1lnej rev\u00edzii s\u00faboru je pribli\u017ene 900 riadkov. Vybral som pr\u00edklady z viacer\u00fdch miest, aby som demon\u0161troval variabilitu n\u00e1zvov a nieko\u013eko typov syntaxe.<\/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; % Zaru\u010den\u00e1 najv\u00e4\u010d\u0161ia hodnota symbolu. Udr\u017eujte na konci tohto zoznamu\n...\ncollating-element &lt;U0413_0301&gt; from &quot;&lt;U0413&gt;&lt;U0301&gt;&quot;\ncollating-element &lt;U0413_0341&gt; from &quot;&lt;U0413&gt;&lt;U0341&gt;&quot;<\/code><\/pre>\n<p><\/p>\n<ul>\n<li><em>collating-symbol<\/em> registruje re\u0165azec <em>OSMANYA<\/em> v tabu\u013eke mien v\u00e1h <\/li>\n<li><em>collating-symbol ..<\/em> registruje sekvenciu mien pozost\u00e1vaj\u00facich z predponu <em>S<\/em> a hexadecim\u00e1lneho \u010d\u00edseln\u00e9ho suffixu z <em>1D000<\/em> do <em>1D35F<\/em>.<\/li>\n<li><em>FFFF<\/em> v <em>collating-symbol<\/em> vyzer\u00e1 ako ve\u013ek\u00e9 nez\u00e1porn\u00e9 cel\u00e9 \u010d\u00edslo v hexadecim\u00e1lnom syst\u00e9me \u010d\u00edslovania, ale <em>&lt;SFFFF&gt;<\/em> to je len n\u00e1zov, ktor\u00fd by mohol vyzera\u0165 ako <em>&lt;VERYBIGVAL&gt;<\/em> <\/li>\n<li>n\u00e1zov <em>&lt;U0413&gt;<\/em> znamen\u00e1 k\u00f3dov\u00fd bod v k\u00f3dovan\u00ed <em>UCS-4<\/em><\/li>\n<li><em>collating-element &lt;U0413_0301&gt; from &quot;&lt;U0413&gt;&lt;U0301&gt;&quot;<\/em> registruje nov\u00e9 meno pre p\u00e1r Unicode bodov. <\/li>\n<\/ul>\n<p><\/p>\n<p>Ke\u010f s\u00fa v\u00e1hov\u00e9 men\u00e1 definovan\u00e9, nastavuj\u00fa sa vlastn\u00e9 v\u00e1hy. Ke\u010f\u017ee pri porovn\u00e1van\u00ed m\u00e1 v\u00fdznam len vz\u0165ah v\u00e4\u010d\u0161\u00ed-men\u0161\u00ed, v\u00e1hy sa ur\u010duj\u00fa jednoduchou postupnos\u0165ou vymenovania mien. Najprv sa vymenuj\u00fa \u013eah\u0161ie v\u00e1hy, potom \u0165a\u017e\u0161ie. Pripom\u00ednam, \u017ee ka\u017ed\u00e9mu unicode symbolu s\u00fa priraden\u00e9 \u0161tyri r\u00f4zne v\u00e1hy. Tu s\u00fa zhrnut\u00e9 do jedinej usporiadanej sekvencie. Teoreticky m\u00f4\u017ee by\u0165 ak\u00e9ko\u013evek symbolick\u00e9 meno pou\u017eit\u00e9 na ak\u00fdchko\u013evek \u0161tyroch \u00farovniach, ale koment\u00e1re nazna\u010duj\u00fa, \u017ee v\u00fdvoj\u00e1ri du\u0161evne delia men\u00e1 pod\u013ea \u00farovn\u00ed.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">% Symbolick\u00e9 priradenia v\u00e1h\n\n% Priradenia v\u00e1h tretej \u00farovne\n\n\n\n\n...\n% Priradenia v\u00e1h druhej \u00farovne\n\n % KOMBINA\u010cN\u00c1 N\u00cdZKA \u010cIARA\n % KOMBINA\u010cN\u00dd \u010c\u00cdR NAD\n % KOMBINA\u010cN\u00dd OPA\u010cN\u00dd \u010c\u00cdR NAD\n...\n% Priradenia v\u00e1h prvej \u00farovne\n % HORIZONT\u00c1LNE TABULOVANIE \n % RIADKOV\u00dd PRENOS\n % VERTIK\u00c1LNE TABULOVANIE\n...\n % CYRILICKE MAL\u00c9 P\u00cdSMENKO DE\n % CYRILICKE MAL\u00c9 P\u00cdSMENKO KOMI DE\n % CYRILICKE MAL\u00c9 P\u00cdSMENKO DJE\n % CYRILICKE MAL\u00c9 P\u00cdSMENKO KOMI DJE\n % CYRILICKE MAL\u00c9 P\u00cdSMENKO GJE\n % CYRILICKE MAL\u00c9 P\u00cdSMENKO ZE S DESCENDEROM\n % CYRILICKE MAL\u00c9 P\u00cdSMENKO IE\n % CYRILICKE MAL\u00c9 P\u00cdSMENKO IE S BREVIEROM\n % CYRILICKE MAL\u00c9 P\u00cdSMENKO UKRAJINSKEJ IE\n % CYRILICKE MAL\u00c9 P\u00cdSMENKO ZHE<\/code><\/pre>\n<p><\/p>\n<p>Nakoniec, samotn\u00e1 tabu\u013eka v\u00e1h.<\/p>\n<p><\/p>\n<p>Sekcia v\u00e1h je uzavret\u00e1 v radoch s k\u013e\u00fa\u010dov\u00fdmi slovami <em>order_start<\/em> a <em>order_end<\/em>. Doplnkov\u00e9 parametre <em>order_start<\/em> ur\u010duj\u00fa, v akom smere sa porovn\u00e1vaj\u00fa riadky na ka\u017edej \u00farovni porovn\u00e1vania. Predvolene sa pou\u017e\u00edva parameter <em>forward<\/em>. Telo sekcie pozost\u00e1va z riadkov, ktor\u00e9 obsahuj\u00fa k\u00f3d znaku a \u0161tyri jeho v\u00e1hy. K\u00f3d znaku m\u00f4\u017ee by\u0165 predstaven\u00fd samotn\u00fdm znakom, k\u00f3dovou bodkou alebo symbolick\u00fdm menom definovan\u00fdm sk\u00f4r. V\u00e1hy m\u00f4\u017eu by\u0165 tie\u017e definovan\u00e9 symbolick\u00fdmi menami, k\u00f3dov\u00fdmi bodkami alebo samotn\u00fdmi znakmi. Ak sa pou\u017e\u00edvaj\u00fa k\u00f3dov\u00e9 bodky alebo znaky, ich v\u00e1ha sa zhoduje s \u010d\u00edselnou hodnotou k\u00f3dovej bodky (poz\u00edciou v tabu\u013eke Unicode). Znakmi, ktor\u00e9 nie s\u00fa explicitne uveden\u00e9 (ako rozumiem), sa pova\u017euj\u00fa za pridan\u00e9 do tabu\u013eky s prim\u00e1rnou v\u00e1hou, ktor\u00e1 sa zhoduje s poz\u00edciou v tabu\u013eke Unicode. \u0160peci\u00e1lna hodnota v\u00e1hy <em>IGNORE<\/em> znamen\u00e1, \u017ee na zodpovedaj\u00facej \u00farovni porovn\u00e1vania sa tento znak ignoruje.<\/p>\n<p><\/p>\n<p>Na demon\u0161trovanie \u0161trukt\u00fary v\u00e1h som vybral tri pomerne zrejm\u00e9 fragmenty:<\/p>\n<p><\/p>\n<ul>\n<li>znaky, ktor\u00e9 s\u00fa \u00faplne ignorovan\u00e9<\/li>\n<li>znaky ekvivalentn\u00e9 \u010d\u00edslu tri na prv\u00fdch dvoch \u00farovniach<\/li>\n<li>za\u010diatok cyrilsk\u00e9ho abecedy, ktor\u00e1 neobsahuje diakritick\u00e9 znaky, a preto sa usporad\u00fava predov\u0161etk\u00fdm pod\u013ea prvej a tretej \u00farovne.<\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"plaintext\">order_start forward;forward;forward;forward,position\n IGNORE;IGNORE;IGNORE;IGNORE % NULL (v 6429)\n IGNORE;IGNORE;IGNORE;IGNORE % START OF HEADING (v 6429)\n IGNORE;IGNORE;IGNORE;IGNORE % START OF TEXT (v 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>Teraz sa m\u00f4\u017eeme znova vr\u00e1ti\u0165 k triedeniu pr\u00edkladov z za\u010diatku \u010dl\u00e1nku. Zrada spo\u010d\u00edva v tejto \u010dasti tabu\u013eky v\u00e1h:<\/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>Je vidno, \u017ee v tejto tabu\u013eke s\u00fa interpunk\u010dn\u00e9 znaky z tabu\u013eky <em>ASCII<\/em> (vr\u00e1tane medzery) pri porovn\u00e1van\u00ed riadkov sa takmer v\u017edy ignoruje. V\u00fdnimku tvoria len riadky, ktor\u00e9 sa zhoduj\u00fa vo v\u0161etkom, okrem interpunk\u010dn\u00fdch znakov, ktor\u00e9 sa nach\u00e1dzaj\u00fa na zhodn\u00fdch poz\u00edci\u00e1ch. Riadky z m\u00f4jho pr\u00edkladu (po trieden\u00ed) pre algoritmus porovn\u00e1vania vyzeraj\u00fa takto:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">AbakanovMichalmal\u00edr\nJolkinov\u00e1Elakranov\u010di\u010dka\nIvanov\u00e1Allamal\u00edr\nIvanovAndrejles\u00e1r<\/code><\/pre>\n<p><\/p>\n<p>Vzh\u013eadom na to, \u017ee v tabu\u013eke v\u00e1h sa ve\u013ek\u00e9 p\u00edsmen\u00e1 v ru\u0161tine nach\u00e1dzaj\u00fa po mal\u00fdch (na tretej \u00farovni <em>&lt;CAP&gt;<\/em> \u0165a\u017e\u0161ie ako <em>&lt;MIN&gt;<\/em>), triedenie vyzer\u00e1 absol\u00fatne spr\u00e1vne.<\/p>\n<p><\/p>\n<p>Pri nastavovan\u00ed premennej <em>LC_COLLATE=C<\/em> sa na\u010d\u00edta \u0161peci\u00e1lna tabu\u013eka, ktor\u00e1 ur\u010duje porovnanie po bajtoch<\/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'xfe', L'xff'\n};<\/code><\/pre>\n<p><\/p>\n<p>Ke\u010f\u017ee v Unicode sa k\u00f3dov\u00e1 bodka \u0401 nach\u00e1dza pred A, aj riadky s\u00fa trieden\u00e9 zodpovedaj\u00facim sp\u00f4sobom.<\/p>\n<p><\/p>\n<h1 id=\"tekstovye-i-dvoichnye-tablicy\">Textov\u00e9 a bin\u00e1rne tabu\u013eky<\/h1>\n<p><\/p>\n<p>Je zrejm\u00e9, \u017ee porovn\u00e1vanie riadkov je mimoriadne \u010dasto vykon\u00e1van\u00e1 oper\u00e1cia, a anal\u00fdza tabu\u013eky <em>CTT<\/em> je pomerne n\u00e1kladn\u00fd proces. Na optimaliz\u00e1ciu pr\u00edstupu k tabu\u013eke sa kompiluje do bin\u00e1rnej formy pr\u00edkazom <em>localedef<\/em>.<\/p>\n<p><\/p>\n<p>T\u00edm <em>localedef<\/em> akceptuje ako parametre s\u00fabor s tabu\u013ekou n\u00e1rodn\u00fdch \u0161pecif\u00edk (vo\u013eba <em>-i<\/em>), v ktorom s\u00fa v\u0161etky symboly uveden\u00e9 ako body Unicode, a s\u00fabor zodpovednosti bodov Unicode pre konkr\u00e9tnu k\u00f3dovanie (vo\u013eba <em>-f<\/em>). V d\u00f4sledku pr\u00e1ce vznikaj\u00fa bin\u00e1rne s\u00fabory pre lokalitu, s menom uveden\u00fdm v poslednom parametri.<\/p>\n<p><\/p>\n<p><em>Glibc<\/em> podporuje dva form\u00e1ty bin\u00e1rnych s\u00faborov: &quot;tradi\u010dn\u00fd&quot; a &quot;modern\u00fd&quot;.<\/p>\n<p><\/p>\n<p>Tradi\u010dn\u00fd form\u00e1t predpoklad\u00e1, \u017ee meno lokality je n\u00e1zov podprie\u010dinka v <em>\/usr\/lib\/locale\/<\/em>. V tomto podprie\u010dinku s\u00fa ulo\u017een\u00e9 bin\u00e1rne s\u00fabory <em>LC_COLLATE<\/em>, <em>LC_CTYPE<\/em>, <em>LC_TIME<\/em> a pod. S\u00fabor <em>LC_IDENTIFICATION<\/em> obsahuje form\u00e1lne meno lokality (ktor\u00e9 sa m\u00f4\u017ee l\u00ed\u0161i\u0165 od n\u00e1zvu prie\u010dinka) a koment\u00e1re.<\/p>\n<p><\/p>\n<p>Modern\u00fd form\u00e1t predpoklad\u00e1 ulo\u017eenie v\u0161etk\u00fdch lokal\u00edt v jedinom arch\u00edve <em>\/usr\/lib\/locale\/locale-archive<\/em>, ktor\u00fd sa zobrazuje v virtu\u00e1lnej pam\u00e4ti v\u0161etk\u00fdch procesov, ktor\u00e9 ho pou\u017e\u00edvaj\u00fa <em>glibc<\/em>. Meno locale v modernom form\u00e1te prech\u00e1dza ur\u010ditou kanoniz\u00e1ciou \u2013 v n\u00e1zvoch k\u00f3dovania zost\u00e1vaj\u00fa iba \u010d\u00edslice a p\u00edsmen\u00e1 uveden\u00e9 mal\u00fdmi p\u00edsmenami. Tak <em>ru_RU.KOI8-R<\/em>, bude ulo\u017een\u00e9 ako <em>ru_RU.koi8r<\/em>.<\/p>\n<p><\/p>\n<p>Vstupn\u00e9 s\u00fabory sa h\u013eadaj\u00fa v aktu\u00e1lnom adres\u00e1ri, ako aj v adres\u00e1roch <em>\/usr\/share\/i18n\/locales\/<\/em> a <em>\/usr\/share\/i18n\/charmaps\/<\/em> pre s\u00fabory <em>CTT<\/em> a s\u00fabory k\u00f3dovania zodpovedaj\u00faco.<\/p>\n<p><\/p>\n<p>Napr\u00edklad pr\u00edkaz<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">localedef -i ru_RU -f MAC-CYRILLIC ru_RU.MAC-CYRILLIC<\/code><\/pre>\n<p><\/p>\n<p>skompiluje s\u00fabor <em>\/usr\/share\/i18n\/locales\/ru_RU<\/em> s pou\u017eit\u00edm s\u00faboru k\u00f3dovania <em>\/usr\/share\/i18n\/charmaps\/MAC-CYRILLIC.gz<\/em> a ulo\u017e\u00ed v\u00fdsledok do <em>\/usr\/lib\/locale\/locale-archive<\/em> pod n\u00e1zvom <em>ru_RU.maccyrillic<\/em><\/p>\n<p><\/p>\n<p>Ak nastav\u00edte premenn\u00fa <em>LANG=en_US.UTF-8<\/em> , <em>glibc<\/em> bude h\u013eada\u0165 bin\u00e1rne s\u00fabory locale v nasleduj\u00facej sekvencii s\u00faborov a adres\u00e1rov:<\/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>Ak sa locale vyskytuje v tradi\u010dnom aj v modernom form\u00e1te, m\u00e1 prioritu modern\u00fd.<\/p>\n<p><\/p>\n<p>Zoznam skompilovan\u00fdch lokal\u00edt si m\u00f4\u017eete pozrie\u0165 pr\u00edkazom <em>locale -a<\/em>.<\/p>\n<p><\/p>\n<h1 id=\"podgotovka-svoey-tablicy-sravneniya\">Pr\u00edprava vlastnej tabu\u013eky porovn\u00e1vania<\/h1>\n<p><\/p>\n<p>Teraz, s vybaven\u00edm znalos\u0165ami, m\u00f4\u017eete vytvori\u0165 svoju vlastn\u00fa ide\u00e1lnu tabu\u013eku porovn\u00e1vania re\u0165azcov. T\u00e1to tabu\u013eka by mala spr\u00e1vne porovn\u00e1va\u0165 rusk\u00e9 p\u00edsmen\u00e1, vr\u00e1tane p\u00edsmena \u0401, pri\u010dom zoh\u013ead\u0148uje interpunk\u010dn\u00e9 znamienka v s\u00falade s tabu\u013ekou <em>ASCII<\/em>.<\/p>\n<p><\/p>\n<p>Proces pr\u00edpravy vlastnej triediacej tabu\u013eky sa sklad\u00e1 z dvoch f\u00e1z: \u00fapravy tabu\u013eky v\u00e1h a kompil\u00e1cie do bin\u00e1rnej formy pr\u00edkazom <em>localedef<\/em>.<\/p>\n<p><\/p>\n<p>Aby sa tabu\u013eka porovn\u00e1vania dala prisp\u00f4sobi\u0165 s minim\u00e1lnymi n\u00e1kladmi na \u00fapravu, form\u00e1t <em>ISO 14652<\/em> predpoklad\u00e1 sekcie \u00fapravy v\u00e1h u\u017e existuj\u00facej tabu\u013eky. Sekcia za\u010d\u00edna k\u013e\u00fa\u010dov\u00fdm slovom <em>reorder-after<\/em> a ur\u010den\u00edm poz\u00edcie, po ktorej sa vykon\u00e1va zmena. Sekcia kon\u010d\u00ed riadkom <em>reorder-end<\/em>. Ak je potrebn\u00e9 opravi\u0165 nieko\u013eko \u010dast\u00ed tabu\u013eky, vytvor\u00ed sa sekcia pre ka\u017ed\u00fa z t\u00fdchto \u010dast\u00ed.<\/p>\n<p><\/p>\n<p>Nahradil som nov\u00e9 verzie s\u00faborov <em>iso14651_t1_common<\/em> a <em>ru_RU<\/em> z repozit\u00e1ra <em>glibc<\/em> do svojho dom\u00e1ceho adres\u00e1ra ~\/.local\/share\/i18n\/locales\/ a mierne som upravil sekciu <em>LC_COLLATE<\/em> v <em>ru_RU<\/em>. Nov\u00e9 verzie s\u00faborov s\u00fa \u00faplne kompatibiln\u00e9 s mojou verziou <em>glibc<\/em>. Ak chcete pou\u017ei\u0165 star\u00e9 verzie s\u00faborov, budete musie\u0165 zmeni\u0165 symbolick\u00e9 men\u00e1 a miesto, odkia\u013e za\u010d\u00edna zmena v tabu\u013eke.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">LC_COLLATE\n% Skop\u00edrujte \u0161abl\u00f3nu z ISO\/IEC 14651\ncopy &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; % SPACE\n&lt;U0021&gt; &lt;S0021&gt;;&lt;BASE&gt;&lt;MIN&gt;&lt;U0021&gt; % VYKR\u00cdKNUTIE\n&lt;U0022&gt; &lt;S0022&gt;;&lt;BASE&gt;&lt;MIN&gt;&lt;U0022&gt; % \u00daS\u0164OV\u00dd ZNAK\n...\n&lt;U007D&gt; &lt;S007D&gt;;&lt;BASE&gt;&lt;MIN&gt;&lt;U007D&gt; % PRAV\u00dd Z\u00c1VERE\u010cN\u00dd ZNAK\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>V skuto\u010dnosti by bolo potrebn\u00e9 zmeni\u0165 polia v <em>LC_IDENTIFICATION<\/em> tak, aby odkazovali na lokalitu <em>sk_MY<\/em>, ale v mojom pr\u00edklade to nebolo potrebn\u00e9, preto\u017ee som vyl\u00fa\u010dil z vyh\u013ead\u00e1vania lokality arch\u00edv <em>locale-archive<\/em>.<\/p>\n<p><\/p>\n<p>Aby <em>localedef<\/em> pracoval so s\u00fabormi vo mojej zlo\u017eke cez premenn\u00fa <em>I18NPATH<\/em> m\u00f4\u017eete prida\u0165 dodato\u010dn\u00fd adres\u00e1r na vyh\u013ead\u00e1vanie vstupn\u00fdch s\u00faborov, a adres\u00e1r na ulo\u017eenie bin\u00e1rnych s\u00faborov m\u00f4\u017eete ur\u010di\u0165 ako cestu so slashmi:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; I18NPATH=~\/.local\/share\/i18n localedef -i sk_SK -f UTF-8 ~\/.local\/lib\/locale\/sk_MY.UTF-8<\/code><\/pre>\n<p><\/p>\n<p><em>POSIX<\/em> predpoklad\u00e1, \u017ee v <em>LANG<\/em> je mo\u017en\u00e9 p\u00edsa\u0165 absol\u00fatne cesty k adres\u00e1rom so s\u00fabormi lokal\u00edt, ktor\u00e9 za\u010d\u00ednaj\u00fa priamym slashom, ale <em>glibc<\/em> v <em>Linux<\/em> v\u0161etky cesty sa pova\u017euj\u00fa od z\u00e1kladn\u00e9ho adres\u00e1ra, ktor\u00fd je mo\u017en\u00e9 prep\u00edsa\u0165 pomocou premennej <em>LOCPATH<\/em>. Po nastaven\u00ed <em>LOCPATH=~\/.local\/lib\/locale\/<\/em> bud\u00fa v\u0161etky s\u00fabory s\u00favisiace s lokaliz\u00e1ciou h\u013eadan\u00e9 iba v mojej zlo\u017eke. Archiv lokal\u00edt pri nastavenej premennej <em>LOCPATH<\/em> sa ignoruje.<\/p>\n<p><\/p>\n<p>Tu je rozhoduj\u00faci test:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; LANG=sk_MY.UTF-8 LOCPATH=~\/.local\/lib\/locale\/ sort buhg.txt\nAbakanov Michal;mal\u00ed\u0159\nJelkinov\u00e1 Ella;kranovnica\nIvanov Andrej;tes\u00e1r\nIvanov\u00e1 Alla;advok\u00e1t<\/code><\/pre>\n<p><\/p>\n<p>Hur\u00e1! Podarilo sa n\u00e1m to!<\/p>\n<p><\/p>\n<h1 id=\"rabota-nad-oshibkami\">Pr\u00e1ca na chyb\u00e1ch<\/h1>\n<p><\/p>\n<p>Na ot\u00e1zky o trieden\u00ed re\u0165azcov, ktor\u00e9 boli polo\u017een\u00e9 na za\u010diatku, som u\u017e odpovedal, ale zost\u00e1va e\u0161te nieko\u013eko ot\u00e1zok o chyb\u00e1ch \u2014 vidite\u013en\u00fdch a nevidite\u013en\u00fdch.<\/p>\n<p><\/p>\n<p>Vr\u00e1\u0165me sa k p\u00f4vodnej \u00falohe.<\/p>\n<p><\/p>\n<p>A program <em>sort<\/em> a program <em>join<\/em> pou\u017e\u00edvaj\u00fa rovnak\u00e9 funkcie porovn\u00e1vania re\u0165azcov z <em>glibc<\/em>. Ako sa teda stalo, \u017ee <em>join<\/em> vykazoval chybu triedenia na re\u0165azcoch, ktor\u00e9 boli trieden\u00e9 pr\u00edkazom <em>sort<\/em> v lokalite <em>en_US.UTF-8<\/em>? \u041e\u0442\u0432\u0435\u0442 \u043f\u0440\u043e\u0441\u0442: <em>sort<\/em> porovn\u00e1va cel\u00fd re\u0165azec, zatia\u013e \u010do <em>join<\/em> porovn\u00e1va iba k\u013e\u00fa\u010d, ktor\u00fdm je predvolene za\u010diatok re\u0165azca pred prv\u00fdm medzern\u00fdm symbolom. V mojom pr\u00edklade to viedlo k hl\u00e1seniu o chybe, preto\u017ee triedenie prv\u00fdch slov v re\u0165azcoch sa neshodovalo s trieden\u00edm pln\u00fdch re\u0165azcov.<\/p>\n<p><\/p>\n<p>Lokalita <em>&quot;C&quot;<\/em> zaru\u010duje, \u017ee v zoraden\u00fdch riadkoch bud\u00fa aj po\u010diato\u010dn\u00e9 podre\u0165azce a\u017e po prv\u00fd medzery tie\u017e usporiadan\u00e9, ale to len maskuje chybu. M\u00f4\u017eete vybra\u0165 tak\u00e9 d\u00e1ta (\u013eudia s rovnak\u00fdmi priezviskami, ale r\u00f4znymi menami), ktor\u00e9 by bez hl\u00e1senia o chybe poskytli nespr\u00e1vny v\u00fdsledok pri zl\u00fa\u010den\u00ed s\u00faborov. Ak chceme, aby <em>join<\/em> zhroma\u017edil riadky s\u00faborov pod\u013ea Meno a priezvisko, spr\u00e1vny sp\u00f4sob bude jasne uvies\u0165 odde\u013eova\u010d pol\u00ed a zoradi\u0165 pod\u013ea k\u013e\u00fa\u010dov\u00e9ho po\u013ea, a nie pod\u013ea celej strany. V tomto pr\u00edpade bude zl\u00fa\u010denie prebieha\u0165 spr\u00e1vne a v \u017eiadnej lokalite nebud\u00fa chyby:<\/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>\u00daspe\u0161ne vykonan\u00fd pr\u00edklad v k\u00f3dovan\u00ed <em>CP1251<\/em> obsahuje e\u0161te jednu chybu. Probl\u00e9m je v tom, \u017ee vo v\u0161etk\u00fdch zn\u00e1mych distrib\u00faci\u00e1ch <em>Linux<\/em> v bal\u00ed\u010dkoch ch\u00fdba skompilovan\u00e1 lokalita <em>sk_SK.CP1251<\/em>. Ak skompilovan\u00e1 lokalita nie je n\u00e1jden\u00e1, <em>sort<\/em> potichu pou\u017e\u00edva porovn\u00e1vanie byte po byte, \u010do sme aj pozorovali.<\/p>\n<p><\/p>\n<p>Navy\u0161e, existuje e\u0161te jedna mal\u00e1 chyba t\u00fdkaj\u00faca sa neavailability skompilovan\u00fdch lokal\u00edt. Pr\u00edkaz <em>LOCPATH=\/tmp locale -a<\/em> vyd\u00e1 zoznam v\u0161etk\u00fdch lokal\u00edt v <em>locale-archive<\/em>, ale pri nastavenej premennej <em>LOCPATH<\/em> pre v\u0161etky programy (vr\u00e1tane samotnej <em>locale<\/em>) bud\u00fa tieto lokality nedostupn\u00e9.<\/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\">Z\u00e1ver<\/h1>\n<p><\/p>\n<p>Ak ste program\u00e1tor, ktor\u00fd je zvyknut\u00fd pova\u017eova\u0165 re\u0165azce za mno\u017einu bytov, va\u0161a vo\u013eba <em>LC_COLLATE=C<\/em>.<\/p>\n<p><\/p>\n<p>Ak ste lingvista alebo zostavovate\u013e slovn\u00edka, bolo by lep\u0161ie skompilova\u0165 va\u0161u lokalitu.<\/p>\n<p><\/p>\n<p>Ak ste be\u017en\u00fd pou\u017e\u00edvate\u013e, sta\u010d\u00ed si zvykn\u00fa\u0165 na to, \u017ee pr\u00edkaz <em>ls -a<\/em> vyd\u00e1va s\u00fabory, za\u010d\u00ednaj\u00face bodkou, v zmie\u0161anom re\u017eime so s\u00fabormi, ktor\u00e9 za\u010d\u00ednaj\u00fa p\u00edsmenom, a <em>Midnight Commander<\/em>, ktor\u00fd pou\u017e\u00edva svoje intern\u00e9 funkcie na triedenie mien, vynech\u00e1 s\u00fabory, ktor\u00e9 za\u010d\u00ednaj\u00fa bodkou, na za\u010diatku zoznamu.<\/p>\n<p><\/p>\n<h1 id=\"ssylki\">Odkazy<\/h1>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/unicode.org\/reports\/tr10\/\">Spr\u00e1va \u010d. 10 algoritmu porovn\u00e1vania Unicode <\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/www.unicode.org\/Public\/UCA\/latest\/allkeys.txt\">V\u00e1hy znakov 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 implement\u00e1cia kni\u017enice na pr\u00e1cu s Unicode od IBM. <\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/demo.icu-project.org\/icu-bin\/collation.html\">Test triedenia pomocou <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\">V\u00e1hy znakov v <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\">Popis form\u00e1tu s\u00faboru s v\u00e1hami <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\">Diskusia o porovn\u00e1van\u00ed re\u0165azcov v <em>glibc<\/em><\/a><\/noindex><\/p>\n<p>Zdroj: <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\/sk\/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=\"sk_SK\" \/>\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\/sk\/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\udd47Ako Linuxov\u00fd sort triedi riadky | ProHoster","description":"\u00davod V\u0161etko sa za\u010dalo s kr\u00e1tkym skriptom, ktor\u00fd mal spoji\u0165 inform\u00e1cie o e-mailov\u00fdch adres\u00e1ch zamestnancov, z\u00edskan\u00fdch zo zoznamu pou\u017e\u00edvate\u013eov mailovej slu\u017eby, s.","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/kak-linuxovskij-sort-sortiruet-stroki","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","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\/sk\/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\/sk\/wp-json\/wp\/v2\/posts\/83055","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=83055"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/83055\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=83055"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=83055"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=83055"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}