{"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\/sl\/blog\/administrirovanie\/kak-linuxovskij-sort-sortiruet-stroki","title":{"rendered":"Kako Linuxov sortira vrstice","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1 id=\"vvedenie\">Uvod<\/h1>\n<p><\/p>\n<p>Vse se je za\u010delo s kratkim skriptom, ki naj bi zdru\u017eil informacije o naslovih <em>e-po\u0161ta<\/em> zaposlenih, pridobljenih s seznama uporabnikov po\u0161tnega seznama, z nazivom zaposlenih, pridobljenim iz baze kadrovske slu\u017ebe. Obe seznama sta bila eksportirana v besedilne datoteke v kodiranju Unicode <em>UTF-8<\/em> in shranjena z unixovskimi konci vrstic.<\/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;ometa\nJelkinja Ella;\u017eerjavistka\nIvanov Andrej;mehanik\nAbakanov Mihail;ometa<\/code><\/pre>\n<p><\/p>\n<p>Za zdru\u017eitev sta bili datoteki sortirani z unixovskim ukazom <em>sort<\/em> in podani v unixovski program <em>pridru\u017eite se<\/em>, ki je nepri\u010dakovano kon\u010dal z napako: <\/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: ni sortiran: Ivanov Andrej;mehanik<\/code><\/pre>\n<p><\/p>\n<p>Pogled na rezultat sortiranja je pokazal, da je sortiranje na splo\u0161no pravilno, toda v primeru ujemanja mo\u0161kih in \u017eenskih priimkov, \u017eenski priimki gredo pred mo\u0161ke:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; sort buhg.txt\nAbakanov Mihail;ometa\nJelkinja Ella;\u017eerjavistka\nIvanova Alla;ometa\nIvanov Andrej;mehanik<\/code><\/pre>\n<p><\/p>\n<p>Zdi se, da gre za napako sortiranja v Unicode-u ali za izraz feminizma v algoritmu sortiranja. Prvo seveda bolj verjetno.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Pustimo za zdaj <em>pridru\u017eite se<\/em> in se osredoto\u010dimo na <em>sort<\/em>. Poskusimo re\u0161iti nalogo s poskusno metodo. Za za\u010detek spremenimo lokalno okolje iz <em>en_US<\/em> na <em>ru_RU<\/em>. Za sortiranje bi bilo dovolj nastaviti okoljsko spremenljivko <em>LC_COLLATE<\/em>, a ne bomo bili tako skopi:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; LANG=ru_RU.UTF-8 sort buhg.txt\nAbakanov Mihail;ometa\nJelkinja Ella;\u017eerjavistka\nIvanova Alla;ometa\nIvanov Andrej;mehanik<\/code><\/pre>\n<p><\/p>\n<p>Ni\u010d se ni spremenilo.<\/p>\n<p><\/p>\n<p>Poskusimo prekodirati datoteke v enobitno 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>Spet se ni ni\u010d spremenilo.<\/p>\n<p><\/p>\n<p>Ni druge, treba bo iskati re\u0161itev na internetu. O ruskih priimkih ni kaj dosti, a so vpra\u0161anja o drugih \u010dudnostih sortiranja. Na primer, tak\u0161en problem: <noindex><a rel=\"nofollow\" href=\"https:\/\/serverfault.com\/questions\/95579\/unix-sort-treats-dash-characters-as-invisible\/95593\">unix sort obravnava '-' (vezaj) kot neviden znak<\/a><\/noindex>. Na kratko, vrste \"a-b\", \"aa\", \"ac\" se sortirajo kot \"aa\", \"a-b\", \"ac\".<\/p>\n<p><\/p>\n<p>Odgovor je povsod standarden: uporabite programersko lokalno okolje <em>\"C\"<\/em> in sre\u010da vas bo spremljala. Posku\u0161amo:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; LANG=C sort buhg.txt\nJelkinja Ella;\u017eerjavistka\nAbakanov Mihail;ometa\nIvanov Andrej;mehanik\nIvanova Alla;odvetnica<\/code><\/pre>\n<p><\/p>\n<p>Nekaj se je spremenilo. Ivanovi so se postavili v pravi vrstni red, toda Jelkinja je nekam splezala. Vrnimo se k izvorni nalogi:<\/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>\u0420\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a, \u043a\u0430\u043a \u0438 \u043e\u0431\u0435\u0449\u0430\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u043e\u043c. \u0418 \u044d\u0442\u043e \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0401\u043b\u043a\u0438\u043d\u0443 \u0432 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435.<\/p>\n<p><\/p>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432\u0440\u043e\u0434\u0435 \u0440\u0435\u0448\u0435\u043d\u0430, \u043d\u043e \u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 \u0440\u0443\u0441\u0441\u043a\u0443\u044e \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0443 \u2014 \u0432\u0438\u043d\u0434\u043e\u0443\u0441\u043e\u0432\u0441\u043a\u0443\u044e. <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>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438, \u043a\u0430\u043a \u043d\u0438 \u0441\u0442\u0440\u0430\u043d\u043d\u043e, \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u044e. <em>\"C\"<\/em>, \u0438 \u0432\u0435\u0441\u044c \u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a. \u041a\u0430\u043a\u0430\u044f-\u0442\u043e \u043c\u0438\u0441\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f.<\/p>\n<p><\/p>\n<p>\u042f \u043d\u0435 \u043b\u044e\u0431\u043b\u044e \u043c\u0438\u0441\u0442\u0438\u043a\u0443 \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u043d\u0430 \u043c\u0430\u0441\u043a\u0438\u0440\u0443\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0438. \u041f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0432\u0441\u0435\u0440\u044c\u0451\u0437 \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441\u043e\u043c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 <em>sort<\/em> \u0438 \u043d\u0430 \u0447\u0442\u043e \u0432\u043b\u0438\u044f\u0435\u0442 <em>LC_COLLATE<\/em> .<\/p>\n<p><\/p>\n<p>\u0412 \u043a\u043e\u043d\u0446\u0435 \u044f \u043f\u043e\u043f\u044b\u0442\u0430\u044e\u0441\u044c \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u044b:<\/p>\n<p><\/p>\n<ul>\n<li>\u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0436\u0435\u043d\u0441\u043a\u0438\u0435 \u0444\u0430\u043c\u0438\u043b\u0438\u0438<\/li>\n<li>je merjeni predmet prav te dol\u017eine, kot jo je pokazal. Ravnil bo samo pokazal njegovo velikost in ni\u010d ve\u010d. Ni filozofski kamen, temve\u010d zgolj lesena deska, s katero merimo. <em>LANG=ru_RU.CP1251<\/em> \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043e\u043c <em>LANG=C<\/em><\/li>\n<li>\u043f\u043e\u0447\u0435\u043c\u0443 \u0443 <em>sort<\/em> in <em>pridru\u017eite se<\/em> \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a<\/li>\n<li>\u043f\u043e\u0447\u0435\u043c\u0443 \u0432\u043e \u0432\u0441\u0435\u0445 \u043c\u043e\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445 \u0435\u0441\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438<\/li>\n<li>\u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043a\u0430\u043a \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e \u0441\u0432\u043e\u0435\u043c\u0443 \u0432\u043a\u0443\u0441\u0443<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"sortirovka-v-yunikode\">\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0432 \u042e\u043d\u0438\u043a\u043e\u0434\u0435<\/h1>\n<p><\/p>\n<p>\u041f\u0435\u0440\u0432\u043e\u0439 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043e\u0442\u0447\u0451\u0442 \u2116 10 \u043f\u043e\u0434 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c <noindex><a rel=\"nofollow\" href=\"https:\/\/unicode.org\/reports\/tr10\/\">Unicode collation algorithm<\/a><\/noindex> na spletnem mestu <noindex><a rel=\"nofollow\" href=\"https:\/\/unicode.org\">unicode.org<\/a><\/noindex>. \u041e\u0442\u0447\u0451\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u043d\u043e\u0433\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0434\u0435\u0442\u0430\u043b\u0435\u0439, \u0442\u0430\u043a \u0447\u0442\u043e \u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044e \u0441\u0435\u0431\u0435 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a\u0440\u0430\u0442\u043a\u043e\u0435 \u0438\u0437\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0438\u0434\u0435\u0439.<\/p>\n<p><\/p>\n<p><em>Collation<\/em> \u2014 \"primerjanje\" nizov je osnova vsakega algoritma za sortiranje. Samo algoritmi se lahko razlikujejo (\"mehur\u010dek\", \"zdru\u017eevanje\", \"hitri\"), vendar vsi uporabljajo primerjavo parov nizov, da dolo\u010dijo njihov vrstni red.<\/p>\n<p><\/p>\n<p>\u0421\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u0442\u0440\u043e\u043a \u043d\u0430 \u0435\u0441\u0442\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435 \u2014 \u044d\u0442\u043e \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430. \u0414\u0430\u0436\u0435 \u0432 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0445 \u043e\u0434\u043d\u043e\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0445 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430\u0445 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0431\u0443\u043a\u0432 \u0432 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0435, \u0445\u043e\u0442\u044c \u0432 \u0447\u0451\u043c-\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0449\u0435\u043c\u0441\u044f \u043e\u0442 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u0439 \u043b\u0430\u0442\u0438\u043d\u0438\u0446\u044b, \u0443\u0436\u0435 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c \u0441 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u044d\u0442\u0438 \u0431\u0443\u043a\u0432\u044b \u043a\u043e\u0434\u0438\u0440\u0443\u044e\u0442\u0441\u044f. \u0422\u0430\u043a \u0432 \u043d\u0435\u043c\u0435\u0446\u043a\u043e\u043c \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0435 \u0431\u0443\u043a\u0432\u0430 <em>\u00d6<\/em> \u0441\u0442\u043e\u0438\u0442 \u043c\u0435\u0436\u0434\u0443 <em>O<\/em> in <em>P<\/em>, \u0430 \u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 <em>CP850<\/em> \u043e\u043d\u0430 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043c\u0435\u0436\u0434\u0443 <em>\u00ff<\/em> in <em>\u00dc<\/em>.<\/p>\n<p><\/p>\n<p>Lahko se poskusimo abstraktizirati od specifi\u010dne kodiranja in obravnavamo \"idealne\" \u010drke, ki so razporejene v nekem redu, kot je to storjeno v Unicode-u. Kodiranja <em>UTF8<\/em>, <em>UTF16<\/em> \u0438\u043b\u0438 \u043e\u0434\u043d\u043e\u0431\u0430\u0439\u0442\u043e\u0432\u0430\u044f <em>KOI8-R<\/em> (\u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u042e\u043d\u0438\u043a\u043e\u0434\u0430) \u0431\u0443\u0434\u0443\u0442 \u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0447\u0438\u0441\u043b\u043e\u0432\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0443\u043a\u0432, \u043d\u043e \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0430 \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. <\/p>\n<p><\/p>\n<p>Izka\u017ee se, da celo z ustvarjanjem tabele znakov od za\u010detka ne moremo dolo\u010diti univerzalnega reda znakov. V razli\u010dnih nacionalnih abecedah, ki uporabljajo iste \u010drke, se lahko red teh \u010drk razlikuje. Na primer, v franco\u0161\u010dini <em>\u00c6<\/em> bodo obravnavane kot ligatura in sortirane kot niz <em>AE<\/em>. V norve\u0161\u010dini pa <em>\u00c6<\/em> bo lo\u010dena \u010drka, ki se nahaja za <em>Z<\/em>. Mimogrede, poleg ligatur, kot je <em>\u00c6<\/em> so tudi \u010drke, zapisane z ve\u010d simboli. Tako ima \u010de\u0161ka abeceda \u010drko <em>Ch<\/em>, ki se nahaja med <em>H<\/em> in <em>I<\/em>.<\/p>\n<p><\/p>\n<p>Poleg razlik v abecedah obstajajo tudi druge nacionalne tradicije, ki vplivajo na razvr\u0161\u010danje. Zlasti se postavi vpra\u0161anje: v kak\u0161nem redu naj v slovarju sledijo besede, sestavljene iz velikih in malih \u010drk? Na razvr\u0161\u010danje lahko vplivajo tudi posebnosti uporabe lo\u010dil. V \u0161pan\u0161\u010dini se na za\u010detku vpra\u0161alne povedi postavi obrnjen vpra\u0161aj (<em>\u00bfTe gusta la m\u00fasica?<\/em>). V tem primeru je o\u010ditno, da vpra\u0161alne povedi ne bi smele biti razvr\u0161\u010dene v lo\u010den kluster zunaj abecede, ampak kako razvrstiti nize z drugimi lo\u010dili?<\/p>\n<p><\/p>\n<p>Ne bom se ustavljal pri razvr\u0161\u010danju nizi v jezikih, ki se mo\u010dno razlikujejo od evropskih. Ugotavljam, da se v jezikih s smerjo pisanja od desne proti levi ali od zgoraj navzdol znaki v nizih verjetno hranijo v vrstnem redu branja, in celo v neabecednih pismenih sistemih obstajajo lastni na\u010dini za razvr\u0161\u010danje nizov znak za znakom. Na primer, hieroglifi se lahko razvr\u0161\u010dajo po oblikovanju (<noindex><a rel=\"nofollow\" href=\"https:\/\/studychinese.ru\/kljuchi\/\">klju\u010dev kitajskih hieroglifov<\/a><\/noindex>) ali po izgovorjavi. Kako naj se razvr\u0161\u010dajo emojiji, iskreno re\u010deno, si ne predstavljam, vendar se tudi zanje lahko nekaj izmisli.<\/p>\n<p><\/p>\n<p>Na podlagi zgoraj na\u0161tetih zna\u010dilnosti so bila oblikovana osnovna na\u010dela za primerjavo nizov, ki temeljijo na Unicode tabelah:<\/p>\n<p><\/p>\n<ul>\n<li>primerjava nizov ni odvisna od polo\u017eaja znakov v kodni tabeli;<\/li>\n<li>zaporedja znakov, ki tvorijo enotne znake, se privedejo v kanoni\u010dno obliko (<em>A<\/em> + zgornji krogec je enako kot <em>\u00c5<\/em>);<\/li>\n<li>pri primerjavi nizov se znak obravnava v kontekstu niza in se, \u010de je potrebno, zdru\u017ei s sosedi v enoto primerjanja (<em>Ch<\/em> v \u010de\u0161\u010dini) ali se razdeli na ve\u010d (<em>\u00c6<\/em> v franco\u0161\u010dini);<\/li>\n<li>Vse nacionalne posebnosti (alfabet, velike\/male \u010drke, lo\u010dila, vrstni red vrst pisanja) morajo biti nastavljive, vse do ro\u010dnega dolo\u010ditve vrstnega reda (emojiji);<\/li>\n<li>Primerjava je pomembna ne le za razvr\u0161\u010danje, temve\u010d tudi na mnogih drugih mestih, na primer za dolo\u010danje razponov vrstic (podstavitev {A\u2026j} v <em>bash<\/em>);<\/li>\n<li>Primerjava mora potekati dovolj hitro.<\/li>\n<\/ul>\n<p><\/p>\n<p>Poleg tega so avtorji poro\u010dila opredelili lastnosti primerjave, na katere se razvijalci algoritmov ne bi smeli zana\u0161ati:<\/p>\n<p><\/p>\n<ul>\n<li>Algoritem primerjave ne sme zahtevati lo\u010denega nabora znakov za vsak jezik (ruski in ukrajinski jeziki skupaj uporabljajo ve\u010dino znakov cirilice);<\/li>\n<li>Primerjava ne sme temeljiti na vrstnem redu znakov v Unicode tabelah;<\/li>\n<li>Te\u017ea niza ne bi smela biti atribut niza, saj ima isti niz v razli\u010dnih kulturnih kontekstih lahko razli\u010dne te\u017ee;<\/li>\n<li>Te\u017ee nizov se lahko spreminjajo med zdru\u017eevanjem ali razdelitvijo (iz <em>x<\/em> &lt; <em>y<\/em> to ne pomeni, da <em>xz<\/em> &lt; <em>yz<\/em>);<\/li>\n<li>Razli\u010dni nizi, ki imajo enake te\u017ee, se obravnavajo kot enaki glede na algoritem razvr\u0161\u010danja. Uvedba dodatnega urejanja takih nizov je mogo\u010da, vendar lahko poslab\u0161a zmogljivost;<\/li>\n<li>Pri ponovnih razvrstitvah se nizi, ki imajo enake te\u017ee, lahko zamenjajo. Stabilnost je lastnost dolo\u010denega algoritma razvr\u0161\u010danja, ne pa lastnost algoritma primerjave nizov (glej prej\u0161njo to\u010dko);<\/li>\n<li>Pravila razvr\u0161\u010danja se lahko s \u010dasom spreminjajo, saj se kulturne tradicije natan\u010dneje opredeljujejo\/spremenijo.<\/li>\n<\/ul>\n<p><\/p>\n<p>prav tako je navedeno, da algoritem primerjave ne ve ni\u010desar o semantiki obdelanih nizov. Tako se nizi, ki vsebujejo samo \u0161tevilke, ne smejo primerjati kot \u0161tevila, in v seznamih angle\u0161kih imen ne sme biti odstranjena \u010dlenka (<em>Beatles, The<\/em>).<\/p>\n<p><\/p>\n<p>Da bi zadostili vsem navedenim zahtevam, je bil predlagan ve\u010dstopenjski (dejansko \u0161tiristopenjski) tabelarni algoritem razvr\u0161\u010danja.<\/p>\n<p><\/p>\n<p>Vnaprej se znaki v nizu pripeljejo v kanoni\u010dno obliko in razvrstijo v enote primerjave. Vsaki enoti primerjave se dodeli ve\u010d te\u017ee, ki ustrezajo ve\u010d ravnem primerjave. Te\u017ee enot primerjave so elementi urejenih mno\u017eic (v tem primeru cela \u0161tevila), ki jih je mogo\u010de primerjati na ve\u010dje-manje. Posebna vrednost <em>IGNORED<\/em> (0x0) pomeni, da ta enota pri primerjavi na ustrezni ravni ne sodeluje. Primerjava nizov se lahko ve\u010dkrat ponovi, pri \u010demer se uporabljajo ute\u017ei ustreznih ravni. Na vsaki ravni se ute\u017ei enot primerjave dveh nizov zaporedno med seboj primerjajo.<\/p>\n<p><\/p>\n<p>V razli\u010dnih razli\u010dicah algoritma za razli\u010dne nacionalne tradicije se lahko vrednosti koeficientov razlikujejo, vendar standard Unicode vklju\u010duje osnovno tabelo ute\u017ei \u2014 <em>\"Default Unicode Collation Element Table\"<\/em> (<em>DUCET<\/em>). Rad bi opozoril, da nastavitev spremenljivke <em>LC_COLLATE<\/em> v bistvu nakazuje izbiro tabele ute\u017ei v funkciji primerjave nizov.<\/p>\n<p><\/p>\n<p>Ute\u017ene koeficente <em>DUCET<\/em> so zasnovane na naslednji na\u010din:<\/p>\n<p><\/p>\n<ul>\n<li>na prvem nivoju se vse \u010drke pretvorijo v enak na\u010din pisanja, diakriti\u010dni znaki se odstranijo, lo\u010dila (ne vsa) se prezrejo;<\/li>\n<li>na drugem nivoju se upo\u0161tevajo samo diakriti\u010dni znaki;<\/li>\n<li>na tretjem nivoju se upo\u0161teva samo na\u010din pisanja;<\/li>\n<li>na \u010detrtem nivoju se upo\u0161tevajo samo lo\u010dila.<\/li>\n<\/ul>\n<p><\/p>\n<p>Primerjava poteka v ve\u010d korakih: najprej se primerjajo koeficienti prvega nivoja; \u010de se ute\u017ei ujemajo, se izvede ponovna primerjava z ute\u017emi drugega nivoja; nato, po potrebi, tretjega in \u010detrtega.<\/p>\n<p><\/p>\n<p>Primerjava se kon\u010da, ko v nizih najdemo ustrezne enote primerjave z razli\u010dnimi ute\u017emi. Nizi, ki imajo enake ute\u017ei na vseh \u0161tirih nivojih, se \u0161tejejo za enake.<\/p>\n<p><\/p>\n<p>Ta algoritem (s \u0161tevilnimi dodatnimi tehni\u010dnimi podrobnostmi) je dal ime poro\u010dilu \u0161t. 10 \u2014 <em>\"Unicode Collation Algorithm\"<\/em> (<em>UCA<\/em>).<\/p>\n<p><\/p>\n<p>Na tem mestu se vedenje sortiranja iz na\u0161ega primera nekoliko bolje razume. Dobro bi ga bilo primerjati s standardom Unicode.<\/p>\n<p><\/p>\n<p>Za testiranje izvedb <em>UCA<\/em> obstaja poseben <noindex><a rel=\"nofollow\" href=\"https:\/\/www.unicode.org\/Public\/UCA\/latest\/CollationTest.html\">test<\/a><\/noindex>, ki uporablja <noindex><a rel=\"nofollow\" href=\"http:\/\/www.unicode.org\/Public\/UCA\/latest\/allkeys.txt\">datoteko ute\u017ei<\/a><\/noindex>, koji implementira <em>DUCET<\/em>. V datoteki ute\u017ei lahko najdete razli\u010dne zanimivosti. Na primer, tam je vrstni red plo\u0161\u010dic mahjonga in evropskega domin, pa tudi vrstni red barv v igralni karti (simbol <em>1F000<\/em> in naprej). Igralne barve so razporejene v skladu s pravili brid\u017ea \u2014 P\u010cB, karte v barvi pa v zaporedju T, 2, 3\u2026 K.<\/p>\n<p><\/p>\n<p>Ro\u010dna preverba pravilnosti sortiranja nizov v skladu z <em>DUCET<\/em> bi bila precej naporna, vendar, na sre\u010do, obstaja odli\u010dna implementacija knji\u017enice za delo z Unicode-om \u2014 \"<noindex><a rel=\"nofollow\" href=\"http:\/\/site.icu-project.org\/\">Mednarodne komponente za Unicode<\/a><\/noindex>\" (<em>ICU<\/em>).<\/p>\n<p><\/p>\n<p>Na spletni strani te knji\u017enice, razvite v <em>IBM<\/em>, so demonstracijske strani, vklju\u010dno z <noindex><a rel=\"nofollow\" href=\"http:\/\/demo.icu-project.org\/icu-bin\/collation.html\">stranjo algoritma za primerjanje nizov<\/a><\/noindex>. Vnesemo na\u0161e testne nize s privzetimi nastavitvami in, o \u010dude\u017e, dobimo popolno rusko sortiranje.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Abakanov Mihail; slikopleskar\nJolkina Ella; \u017eerjavistka\nIvanov Andrej; klju\u010davni\u010dar\nIvanova Alla; odvetnica<\/code><\/pre>\n<p><\/p>\n<p>\u0160e ve\u010d, na spletni strani <em>ICU<\/em> lahko najdete pojasnilo delovanja algoritma za primerjanje ob obdelavi lo\u010dil. V primerih <noindex><a rel=\"nofollow\" href=\"http:\/\/userguide.icu-project.org\/collation\/faq\">FAQ o sortiranju<\/a><\/noindex> se apostrof in pomi\u0161ljaj prezreta.<\/p>\n<p><\/p>\n<p>Unicode nam je pomagal, vendar bo treba iskati vzroke za nenavadno vedenje <em>sort<\/em> u <em>Linux<\/em> kjer drugje.<\/p>\n<p><\/p>\n<h1 id=\"sortirovka-v-glibc\">Sortiranje v glibc<\/h1>\n<p><\/p>\n<p>Hiter pregled izvorne kode orodja <em>sort<\/em> iz <em>GNU Core Utils<\/em> je pokazal, da se v samem orodju lokalizacija zmanj\u0161a na tiskanje trenutne vrednosti spremenljivke <em>LC_COLLATE<\/em> ob zagonu v togo na\u010dinu:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ sort --debug buhg.txt &gt; buhg.srt\nsort: uporablja pravila za sortiranje \u2018en_US.UTF8\u2019<\/code><\/pre>\n<p><\/p>\n<p>Primerjanje nizov se izvaja s standardno funkcijo <em>strcoll<\/em>, kar pomeni, da je vse zanimivo v knji\u017enici <em>glibc<\/em>.<\/p>\n<p><\/p>\n<p>Na <em>wiki<\/em> projekta <em>glibc<\/em> Primerjanje nizov ima posve\u010den <noindex><a rel=\"nofollow\" href=\"https:\/\/sourceware.org\/glibc\/wiki\/Locales#LC_COLLATE\">en odstavek<\/a><\/noindex>. Iz tega odstavka lahko razumemo, da je v <em>glibc<\/em> sortiranje zasnovano na \u017ee znanem algoritmu <em>UCA<\/em> (<em>Unicode collation algorithm<\/em>) in\/ali na sorodni standardu <em>ISO 14651<\/em> (<em>Mednarodno uravnavanje in primerjanje nizov<\/em>). Glede zadnjega standarda je treba omeniti, da je na spletni strani <noindex><a rel=\"nofollow\" href=\"https:\/\/standards.iso.org\/ittf\/PubliclyAvailableStandards\">standards.iso.org<\/a><\/noindex> <em>ISO 14651<\/em> uradno razgla\u0161en za javno dostopnega, vendar ustrezna povezava vodi na neobstoje\u010do stran. Google prikazuje ve\u010d strani s povezavami na uradne strani, ki ponujajo nakup elektronske kopije standarda za sto evrov, vendar na tretji ali \u010detrti strani rezultatov iskanja najdemo tudi neposredne povezave do <em>PDF<\/em>. Splo\u0161no gledano, standard se prakti\u010dno ne razlikuje od <em>UCA<\/em>, vendar je branje dolgo\u010dasnej\u0161e, ker ne vsebuje \u017eivahnih primerov nacionalnih posebnosti pri sortiranju nizov. <\/p>\n<p><\/p>\n<p>Najzanimivej\u0161a informacija na <em>wiki<\/em> se je izkazala za povezavo do <noindex><a rel=\"nofollow\" href=\"https:\/\/sourceware.org\/bugzilla\/show_bug.cgi?id=14095\">sistem za poro\u010danje napak<\/a><\/noindex> s razpravo o izvedbi primerjanja nizov v <em>glibc<\/em>. Iz razprave lahko izvemo, da v <em>glibc<\/em> za primerjanje nizov uporabljajo <em>ISO<\/em>tabelo <noindex><a rel=\"nofollow\" href=\"http:\/\/www.iso.org\/ittf\/ISO14651_2006_TABLE1_en.txt\">The Common Template Table<\/a><\/noindex> (<em>CTT<\/em>), katere naslov lahko najdete v Prilogi <em>A<\/em> standarda <em>ISO 14651<\/em>. Med leti 2000 in 2015 je ta tabela v <em>glibc<\/em> ni imela vzdr\u017eevalca in se je precej razlikovala (vsaj zunaj) od trenutne razli\u010dice standarda. Od leta 2015 do 2018 je potekala prilagoditev novi razli\u010dici tabele in trenutno imate prilo\u017enost sre\u010dati v resni\u010dnem svetu tako novo razli\u010dico tabele (<em>CentOS 8<\/em>), kot tudi staro (<em>CentOS 7<\/em>). <\/p>\n<p><\/p>\n<p>Zdaj, ko imamo vse informacije o algoritmu in pomo\u017enih tabelah, se lahko vrnemo k izhodi\u0161\u010dnemu vpra\u0161anju in razumemo, kako pravilno razvrstiti vrstice v ruski lokalizaciji.<\/p>\n<p><\/p>\n<h1 id=\"iso-1465114652\">ISO 14651\/14652<\/h1>\n<p><\/p>\n<p>Izvorna koda tabele, ki nas zanima <em>CTT<\/em> v ve\u010dini distribucij <em>Linux<\/em> se nahaja v imeniku <em>\/usr\/share\/i18n\/locales\/<\/em>. Sama tabela se nahaja v datoteki <em>iso14651_t1_common<\/em>. Nato se ta datoteka vklju\u010duje v datoteko <em>copy iso14651_t1_common<\/em> v datoteko <em>iso14651_t1<\/em>, ki se nato vklju\u010duje v nacionalne datoteke, vklju\u010dno z <em>en_US<\/em> in <em>ru_RU<\/em>. V ve\u010dini distribucij <em>Linux<\/em> vse izvorne datoteke vklju\u010dene v osnovno namestitev, vendar \u010de jih ni, bo treba namestiti dodatni paket iz distribucije.<\/p>\n<p><\/p>\n<p>Struktura datoteke <em>iso14651_t1<\/em> se lahko zdi stra\u0161no obse\u017ena, z nejasnimi pravili oblikovanja imen, vendar \u010de se poglobite, je vse dovolj preprosto. Struktura je opisana v standardu <em>ISO 14652<\/em>, kopijo katerega lahko prenesete s spletne strani <noindex><a rel=\"nofollow\" href=\"http:\/\/www.open-std.org\/JTC1\/SC22\/WG20\/docs\/n972-14652ft.pdf\">open-std.org<\/a><\/noindex>. \u0160e en opis formata datoteke lahko preberete v <noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/9699919799\/basedefs\/V1_chap07.html\">specifikacijah<\/a><\/noindex> <em>POSIX<\/em> od <em>OpenGroup<\/em>. Kot alternativo branju standarda lahko preu\u010dite izvorne kode funkcije <em>collate_read<\/em> u <em>glibc\/locale\/programs\/ld-collate.c<\/em>.<\/p>\n<p><\/p>\n<p>Struktura datoteke izgleda takole:<\/p>\n<p><\/p>\n<p>Privzeto se simbol uporablja kot za\u0161\u010ditni simbol, konec vrstice po simbolu # pa je komentar. Obe simboli lahko prekora\u010dita, kar je bilo storjeno v novi razli\u010dici tabele:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">escape_char \/\\ncomment_char %<\/code><\/pre>\n<p><\/p>\n<p>V datoteki se bodo pojavili tokni v formatu <em>&lt;Uxxxx&gt;<\/em> ili <em>&lt;Uxxxxxxxx&gt;<\/em> (gdje <em>x<\/em> \u2014 \u0161tevilska cifra). To je \u0161tevilska predstavitev kodnih to\u010dk Unikoda v kodiranju <em>UCS-4<\/em> (<em>UTF-32<\/em>). Vsi ostali elementi v oglatih oklepajih (vklju\u010dno z <em>&lt;Uxxxx_xxxx&gt;<\/em>, <em>&lt;2&gt;<\/em> in podobno) se obravnavajo kot navadne veri\u017ene konstante, ki nimajo posebnega pomena zunaj konteksta.<\/p>\n<p><\/p>\n<p>Vrstica <em>LC_COLLATE<\/em> nam pove, da se za\u010denjajo podatki, ki opisujejo primerjavo nizov.<\/p>\n<p><\/p>\n<p>Najprej se dolo\u010dijo imena za te\u017ee v tabeli primerjave in imena za kombinacije simbolov. Na splo\u0161no sta dva tipa imen povezana z dvema razli\u010dnima entitetama, vendar so v resni\u010dni datoteki pome\u0161ana. Imena te\u017ee so dolo\u010dena s klju\u010dnimi besedami <em>collating-symbol<\/em> (comparing symbol), because when comparing Unicode characters with equal weights, they will be considered equivalent characters.<\/p>\n<p><\/p>\n<p>The total length of the section in the current revision of the file is about 900 lines. I extracted examples from several places to demonstrate the arbitrariness of names and various syntax types.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">LC_COLLATE\n\ncollating-symbol \ncollating-symbol \ncollating-symbol \ncollating-symbol \n...\ncollating-symbol \ncollating-symbol \ncollating-symbol \n...\ncollating-symbol ..\ncollating-symbol  % Najve\u010dja vrednost simbola. Obdr\u017eite na koncu te tabele\n...\ncollating-element  iz \"\"\ncollating-element  iz \"\"<\/code><\/pre>\n<p><\/p>\n<ul>\n<li><em>collating-symbol<\/em> registers the string <em>OSMANYA<\/em> in the weight names table <\/li>\n<li><em>collating-symbol ..<\/em> registers a sequence of names consisting of a prefix <em>S<\/em> and a hexadecimal numeric suffix of <em>1D000<\/em> do <em>1D35F<\/em>.<\/li>\n<li><em>FFFF<\/em> u <em>collating-symbol<\/em> appears as a large unsigned integer in hexadecimal, but <em>&lt;SFFFF&gt;<\/em> is just a name that could look like <em>&lt;VERYBIGVAL&gt;<\/em> <\/li>\n<li>\u0438\u043c\u044f <em>&lt;U0413&gt;<\/em> means a code point in the encoding <em>UCS-4<\/em><\/li>\n<li><em>collating-element  iz \"\"<\/em> registers a new name for a pair of Unicode points. <\/li>\n<\/ul>\n<p><\/p>\n<p>Ko so imena te\u017ee dolo\u010dena, se dolo\u010dijo dejanske te\u017ee. Ker pri primerjavi \u0161tejejo samo razmerja ve\u010d-manj, se te\u017ee dolo\u010dijo s preprosto zaporedjem navajanja imen. Najprej so navedene \"lahke\" te\u017ee, nato \"te\u017eje\". Spominjam se, da je vsakemu znaku Unicode dodeljenih \u0161tiri razli\u010dne te\u017ee. Tu so zdru\u017eene v enotno urejeno zaporedje. Teoreti\u010dno se lahko katerokoli simbolno ime uporablja na kateremkoli od \u0161tirih nivojev, vendar komentarji nakazujejo, da razvijalci miselno razlikujejo imena po nivojih.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">% Symbolic weight assignments\n\n% Third-level weight assignments\n\n\n\n\n...\n% Second-level weight assignments\n\n % COMBINING LOW LINE\n % COMBINING COMMA ABOVE\n % COMBINING REVERSED COMMA ABOVE\n...\n% First-level weight assignments\n % HORIZONTAL TABULATION \n % LINE FEED\n % VERTICAL TABULATION\n...\n % CYRILLIC SMALL LETTER DE\n % CYRILLIC SMALL LETTER KOMI DE\n % CYRILLIC SMALL LETTER DJE\n % CYRILLIC SMALL LETTER KOMI DJE\n % CYRILLIC SMALL LETTER GJE\n % CYRILLIC SMALL LETTER ZE WITH DESCENDER\n % CYRILLIC SMALL LETTER IE\n % CYRILLIC SMALL LETTER IE WITH BREVE\n % CYRILLIC SMALL LETTER UKRAINIAN IE\n % CYRILLIC SMALL LETTER ZHE<\/code><\/pre>\n<p><\/p>\n<p>Kon\u010dno, dejanska tabela te\u017ee.<\/p>\n<p><\/p>\n<p>Sekcija te\u017ee je vklju\u010dena v vrstice s klju\u010dnimi besedami <em>order_start<\/em> in <em>order_end<\/em>. Dodatni parametri <em>order_start<\/em> dolo\u010dajo, v katero smer se pregledujejo vrstice na vsaki ravni primerjave. Privzeto se uporablja parameter <em>forward<\/em>. Telo sekcije je sestavljeno iz vrstic, ki vsebujejo kodo znaka in \u0161tiri njegove te\u017ee. Koda znaka je lahko predstavljena kot sam znak, kodna to\u010dka ali simbolno ime, \u017ee prej dolo\u010deno. Te\u017ee se lahko dolo\u010dijo tudi s simbolnimi imeni, kodnimi to\u010dkami ali samimi znaki. \u010ce se uporabljajo kodne to\u010dke ali znaki, potem njihova te\u017ea ustreza numeri\u010dni vrednosti kodne to\u010dke (poziciji v tabeli Unicode). Znakovi, ki niso izrecno navedeni (kolikor razumem) se \u0161tejejo kot dodani v tabelo s primarno te\u017eo, ki ustreza poziciji v tabeli Unicode. Posebna vrednost te\u017ee <em>IGNORE<\/em> pomeni, da se na ustrezni ravni primerjave ta znak ignorira.<\/p>\n<p><\/p>\n<p>Za prikaz strukture te\u017ee sem izbral tri kar o\u010ditne dele:<\/p>\n<p><\/p>\n<ul>\n<li>znaki, ki se popolnoma ignorirajo<\/li>\n<li>znaki, ekvivalentni \u0161tevilu tri na prvih dveh ravneh<\/li>\n<li>za\u010detek cirilice, ki ne vsebuje diakriti\u010dnih znakov, zato se razvr\u0161\u010da predvsem po prvi in tretji ravni.<\/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>Zdaj se lahko spet vrnemo k razvr\u0161\u010danju primerov na za\u010detku \u010dlanka. Zanka se skriva v tem delu tabele te\u017ee:<\/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>Iz te tabele je o\u010digledno da su interpunkcijski znakovi iz tabele <em>ASCII<\/em> (uklju\u010duju\u0107i razmak) pri pore\u0111enju stringova prakti\u010dno uvek se ignori\u0161u. Izuzetak \u010dine samo stringovi koji se podudaraju u svemu osim interpunkcijskih znakova na odgovaraju\u0107im mestima. Stringovi iz mog primera (posle sortiranja) za algoritam pore\u0111enja izgledaju ovako:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">AbakanovMihailMalar\nJolkinaElliKranov\u0161\u010dica\nIvanovaAllaMalar\nIvanovAndrejLesar<\/code><\/pre>\n<p><\/p>\n<p>Imaju\u0107i u vidu da u tabeli te\u017eina velika slova u ruskom jeziku dolaze posle malih (na tre\u0107em nivou <em>&lt;CAP&gt;<\/em> te\u017ee nego <em>&lt;MIN&gt;<\/em>), sortiranje izgleda apsolutno ispravno.<\/p>\n<p><\/p>\n<p>Pri postavljanju varijable <em>LC_COLLATE=C<\/em> u\u010ditava se posebna tabela koja defini\u0161e bajt po bajt upore\u0111ivanje<\/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'fd', L'fe', L'ff'\n};<\/code><\/pre>\n<p><\/p>\n<p>Po\u0161to u Unikodu ta\u010dka kodiranja \u0401 prethodi A, tako se i stringovi sortiraju odgovaraju\u0107e.<\/p>\n<p><\/p>\n<h1 id=\"tekstovye-i-dvoichnye-tablicy\">Tekstualne i binarne tabele<\/h1>\n<p><\/p>\n<p>O\u010digledno je da je pore\u0111enje stringova izuzetno \u010desto kori\u0161\u0107ena operacija, a analiza tabele <em>CTT<\/em> prili\u010dno skupa procedura. Da bi se optimizovao pristup tabeli, ona se kompajlira u binarni oblik pomo\u0107u komande <em>localedef<\/em>.<\/p>\n<p><\/p>\n<p>Komanda <em>localedef<\/em> koja prima kao parametre datoteku sa tabelom nacionalnih osobina (opcija <em>-i<\/em>), u kojoj su svi simboli predstavljeni Unikod ta\u010dkama, i datoteku uskla\u0111ivanja ta\u010daka Unikoda sa odre\u0111enim kodiranjem (opcija <em>-f<\/em>). Kao rezultat rada kreiraju se binarne datoteke za lokalitet, sa imenom navedenim u poslednjem parametru.<\/p>\n<p><\/p>\n<p><em>Glibc<\/em> podpira dva formata binarnih datotek: \"tradicionalni\" in \"sodobni\".<\/p>\n<p><\/p>\n<p>Tradicionalni format podrazumeva da ime lokaliteta bude ime poddirektorijuma u <em>\/usr\/lib\/locale\/<\/em>. U ovom poddirektorijumu se \u010duvaju binarne datoteke <em>LC_COLLATE<\/em>, <em>LC_CTYPE<\/em>, <em>LC_TIME<\/em> itd. Datoteka <em>LC_IDENTIFICATION<\/em> sadr\u017ei formalno ime lokaliteta (koje mo\u017ee biti razli\u010dito od imena direktorijuma) i komentare.<\/p>\n<p><\/p>\n<p>Savremeni format podrazumeva \u010duvanje svih lokaliteta u jednom arhivu <em>\/usr\/lib\/locale\/locale-archive<\/em>, koji se mapira u virtuelnu memoriju svih procesa koji koriste <em>glibc<\/em>Ime lokaliteta u modernom formatu podlo\u017ean je odre\u0111enoj kanonizaciji \u2014 u nazivima kodiranja ostaju samo cifre i slova, dovede se u mala slova. Tako <em>sl_SI.KOI8-R<\/em>, bi\u0107e sa\u010duvano kao <em>sl_SI.koi8r<\/em>.<\/p>\n<p><\/p>\n<p>Ulazne datoteke se pretra\u017euju u trenutnom katalogu, kao i u katalogama <em>\/usr\/share\/i18n\/locales\/<\/em> in <em>\/usr\/share\/i18n\/charmaps\/<\/em> za datoteke <em>CTT<\/em> i datoteke kodiranja u skladu s tim.<\/p>\n<p><\/p>\n<p>Na primer, komanda<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">localedef -i sl_SI -f MAC-CYRILLIC sl_SI.MAC-CYRILLIC<\/code><\/pre>\n<p><\/p>\n<p>kompili\u0161e datoteku <em>\/usr\/share\/i18n\/locales\/ru_RU<\/em> koriste\u0107i datoteku kodiranja <em>\/usr\/share\/i18n\/charmaps\/MAC-CYRILLIC.gz<\/em> i sa\u010duva\u0107e rezultat u <em>\/usr\/lib\/locale\/locale-archive<\/em> pod imenom <em>sl_SI.maccyrillic<\/em><\/p>\n<p><\/p>\n<p>Ako se postavi promenljiva <em>LANG=en_US.UTF-8<\/em> onda <em>glibc<\/em> \u0107e tra\u017eiti binarne datoteke lokaliteta u slede\u0107em redosledu 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 lokalitet pojavljuje i u tradicionalnom i u modernom formatu, prioritet se daje modernom.<\/p>\n<p><\/p>\n<p>Pregledate listu kompilanih lokaliteta mo\u017eete komandom <em>locale -a<\/em>.<\/p>\n<p><\/p>\n<h1 id=\"podgotovka-svoey-tablicy-sravneniya\">Priprema svoje tabele upore\u0111ivanja<\/h1>\n<p><\/p>\n<p>Sada, naoru\u017eani znanjem, mo\u017eemo kreirati sopstvenu idealnu tabelu za upore\u0111ivanje. Ova tabela treba da ispravno upore\u0111uje ruska slova, uklju\u010duju\u0107i slovo \u0401, i pritom uzima u obzir interpunkcijske znakove u skladu sa tabelom <em>ASCII<\/em>.<\/p>\n<p><\/p>\n<p>Proces pripreme sopstvene tabele sortiranja sastoji se iz dva koraka: ure\u0111ivanja tabele te\u017eina i kompajliranja u binarni oblik komandom <em>localedef<\/em>.<\/p>\n<p><\/p>\n<p>Kako bi se tabela upore\u0111ivanja mogla prilagoditi uz minimalne tro\u0161kove ure\u0111ivanja, u formatu <em>ISO 14652<\/em> predvi\u0111ene su sekcije za korekciju te\u017eina ve\u0107 postoje\u0107ih tabela. Sekcija po\u010dinje klju\u010dnom re\u010dju <em>reorder-after<\/em> i naznakom pozicije posle koje se vr\u0161i zamena. Sekciju zavr\u0161ava linija <em>reorder-end<\/em>. Ako je potrebno ispraviti vi\u0161e delova tabele, onda se kreira po jedna sekcija za svaki takav deo.<\/p>\n<p><\/p>\n<p>Kopirao sam nove verzije datoteka <em>iso14651_t1_common<\/em> in <em>ru_RU<\/em> iz repozitorijuma <em>glibc<\/em> u svoju doma\u0107u mapu ~\/local\/share\/i18n\/locales\/ i malo uredio odeljak <em>LC_COLLATE<\/em> u <em>ru_RU<\/em>. Nove verzije datoteka su potpuno kompatibilne sa mojom verzijom <em>glibc<\/em>. Ako odlu\u010dite da koristite stare verzije datoteka, mora\u0107ete da promenite simboli\u010dka imena i mesto odakle po\u010dinje zamena u tabeli.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">LC_COLLATE\n% Kopirajte predlogo iz ISO\/IEC 14651\ncopy \"iso14651_t1\"\nreorder-after \n ;;; % SPACE\n ;;; % IZPUSTNI ZNAK\n ;;; % CITAATNI ZNAK\n...\n ;;; % DESNI ZAVIHANI OKVIR\n ;;; % TILDA\nreorder-end\nKONEC LC_COLLATE<\/code><\/pre>\n<p><\/p>\n<p>Na resni\u010dni na\u010din bi bilo treba spremeniti polja v <em>LC_IDENTIFICATION<\/em> da bi kazala na lokalno okolje <em>sl_MY<\/em>, vendar v mojem primeru to ni bilo potrebno, saj sem iz iskanja lokalizacij izklju\u010dil arhiv <em>locale-archive<\/em>.<\/p>\n<p><\/p>\n<p>Da <em>localedef<\/em> je deloval s datotekami v moji mapi prek spremenljivke <em>I18NPATH<\/em> lahko dodamo dodatni imenik za iskanje vhodnih datotek, imenik za shranjevanje binarnih datotek pa lahko navedemo v obliki poti z po\u0161evnicami:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; I18NPATH=~\/local\/share\/i18n localedef -i sl_RU -f UTF-8 ~\/local\/lib\/locale\/sl_MY.UTF-8<\/code><\/pre>\n<p><\/p>\n<p><em>POSIX<\/em> predpostavlja, da lahko v <em>LANG<\/em> napi\u0161emo absolutne poti do imenikov z lokalnimi datotekami, ki se za\u010dnejo s po\u0161evnico, toda <em>glibc<\/em> u <em>Linux<\/em> vse poti se \u0161tejejo od osnovnega imenika, ki ga lahko prepi\u0161emo s spremenljivko <em>LOCPATH<\/em>. Po nastavitvi <em>LOCPATH=~\/local\/lib\/locale\/<\/em> se bodo vse datoteke, povezane z lokalizacijo, iskale samo v moji mapi. Arhiv lokalizacij z nastavljeno spremenljivko <em>LOCPATH<\/em> je prezrta.<\/p>\n<p><\/p>\n<p>Tukaj je odlo\u010dilni test:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; LANG=sl_MY.UTF-8 LOCPATH=~\/local\/lib\/locale\/ sort buhg.txt\nAbakanov Mihail;barve\nJelkin Ela;kranovka\nIvanov Andrej;tesar\nIvanova Alla;odvetnica<\/code><\/pre>\n<p><\/p>\n<p>Hura! Uspelo nam je!<\/p>\n<p><\/p>\n<h1 id=\"rabota-nad-oshibkami\">Rad na gre\u0161kama<\/h1>\n<p><\/p>\n<p>\u017de sem odgovoril na vpra\u0161anja o razvr\u0161\u010danju vrstic, postavljena na za\u010detku, toda \u0161e vedno sta ostali dve vpra\u0161anji glede napak \u2014 vidnih in nevidnih.<\/p>\n<p><\/p>\n<p>Vrnimo se k izvorni nalogi.<\/p>\n<p><\/p>\n<p>In program <em>sort<\/em> in program <em>pridru\u017eite se<\/em> uporabljata iste funkcije za primerjavo nizov iz <em>glibc<\/em>. Kako se je to zgodilo, da <em>pridru\u017eite se<\/em> je prikazal napako pri razvr\u0161\u010danju vrstic, razvr\u0161\u010denih z ukazom <em>sort<\/em> v lokalnem okolju <em>en_US.UTF-8<\/em>? \u041e\u0442\u0432\u0435\u0442 \u043f\u0440\u043e\u0441\u0442: <em>sort<\/em> primerja celoten niz, medtem ko <em>pridru\u017eite se<\/em> primerja samo klju\u010de, ki so po privzetku za\u010detni del niza do prvega presledka. V mojem primeru je to privedlo do napake, saj razvr\u0161\u010danje prvih besed v nizih ni bilo skladno z razvr\u0161\u010danjem celotnih nizov.<\/p>\n<p><\/p>\n<p>Lokalno okolje <em>\"C\"<\/em> zagotavlja, da bodo za\u010detni podnizi do prvega presledka tudi razvr\u0161\u010deni, vendar to le prikriva napako. Mogo\u010de je izbrati tak\u0161ne podatke (ljudi z enakimi priimki, a razli\u010dnimi imeni), ki bi brez napake privedli do napa\u010dnega rezultata pri zdru\u017eevanju datotek. \u010ce \u017eelimo, da <em>pridru\u017eite se<\/em> zdru\u017ei vrstice datotek po F, I in O, bo pravilen na\u010din jasna navedba lo\u010dila za polja in razvr\u0161\u010danje po klju\u010dnem polju, ne po celotnem nizu. V tem primeru bo tudi zdru\u017eevanje pravilno potekalo in v nobenem lokalnem okolju ne bo napak:<\/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>\u0423\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 <em>CP1251<\/em> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0435\u0449\u0435 \u043e\u0434\u043d\u0443 \u043e\u0448\u0438\u0431\u043a\u0443. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u043e \u0432\u0441\u0435\u0445 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043c\u043d\u0435 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0430\u0445 <em>Linux<\/em> \u0432 \u043f\u0430\u043a\u0435\u0442\u0430\u0445 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043b\u043e\u043a\u0430\u043b\u044c <em>ru_RU.CP1251<\/em>. \u0415\u0441\u043b\u0438 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043b\u043e\u043a\u0430\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430, \u0442\u043e <em>sort<\/em> \u043c\u043e\u043b\u0447\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u043e\u0431\u0430\u0439\u0442\u043e\u0432\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435, \u0447\u0442\u043e \u043c\u044b \u0438 \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u043b\u0438.<\/p>\n<p><\/p>\n<p>\u041a\u0441\u0442\u0430\u0442\u0438, \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u0433\u043b\u044e\u043a, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u0441 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043b\u043e\u043a\u0430\u043b\u0435\u0439. \u041a\u043e\u043c\u0430\u043d\u0434\u0430 <em>LOCPATH=\/tmp locale -a<\/em> \u0432\u044b\u0434\u0430\u0441\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u043b\u043e\u043a\u0430\u043b\u0435\u0439 \u0432 <em>locale-archive<\/em>, \u043d\u043e \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <em>LOCPATH<\/em> \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u0434\u043b\u044f \u0441\u0430\u043c\u043e\u0439 <em>locale<\/em>) \u044d\u0442\u0438 \u043b\u043e\u043a\u0430\u043b\u0438 \u0431\u0443\u0434\u0443\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b.<\/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\u010dek<\/h1>\n<p><\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u0432\u044b\u043a \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0438 \u2014 \u044d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u0431\u0430\u0439\u0442\u043e\u0432, \u0442\u043e \u0432\u0430\u0448 \u0432\u044b\u0431\u043e\u0440 <em>LC_COLLATE=C<\/em>.<\/p>\n<p><\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043b\u0438\u043d\u0433\u0432\u0438\u0441\u0442 \u0438\u043b\u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u0435\u043b\u044c \u0441\u043b\u043e\u0432\u0430\u0440\u0435\u0439, \u0442\u043e \u0432\u0430\u043c \u043b\u0443\u0447\u0448\u0435 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u043b\u043e\u043a\u0430\u043b\u044c.<\/p>\n<p><\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u0442\u043e \u0432\u0430\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0438\u0432\u044b\u043a\u043d\u0443\u0442\u044c \u043a \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430 <em>ls -a<\/em> \u0432\u044b\u0434\u0430\u0451\u0442 \u0444\u0430\u0439\u043b\u044b, \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0441 \u0442\u043e\u0447\u043a\u0438, \u0432\u043f\u0435\u0440\u0435\u043c\u0435\u0448\u043a\u0443 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438, \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u0441 \u0431\u0443\u043a\u0432\u044b, \u0430 <em>Midnight Commander<\/em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0441\u0432\u043e\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0438\u043c\u0451\u043d, \u0432\u044b\u043d\u043e\u0441\u0438\u0442 \u0444\u0430\u0439\u043b\u044b, \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0438\u0435\u0441\u044f \u0441 \u0442\u043e\u0447\u043a\u0438, \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u0441\u043f\u0438\u0441\u043a\u0430.<\/p>\n<p><\/p>\n<h1 id=\"ssylki\">Povezave<\/h1>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/unicode.org\/reports\/tr10\/\">\u041e\u0442\u0447\u0451\u0442 \u211610 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\">\u0412\u0435\u0441\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043d\u0430 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 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Unicode \u043e\u0442 IBM. <\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/demo.icu-project.org\/icu-bin\/collation.html\">\u0422\u0435\u0441\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <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\">\u0412\u0435\u0441\u0430 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432 <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\">\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0430 \u0444\u0430\u0439\u043b\u0430 \u0441 \u0432\u0435\u0441\u0430\u043c\u0438 <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\">\u041e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0432 <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.5 - 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\/sl\/blog\/administrirovanie\/kak-linuxovskij-sort-sortiruet-stroki\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"sl_SI\" \/>\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\/sl\/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\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","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.","canonical_url":"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/kak-linuxovskij-sort-sortiruet-stroki","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sl_SI","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\/sl\/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\/sl\/wp-json\/wp\/v2\/posts\/83055","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/comments?post=83055"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts\/83055\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media?parent=83055"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/categories?post=83055"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/tags?post=83055"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}