{"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\/sq\/blog\/administrirovanie\/kak-linuxovskij-sort-sortiruet-stroki","title":{"rendered":"Si siht sorton Linux","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1 id=\"vvedenie\">Hyrje<\/h1>\n<p><\/p>\n<p>T\u00eb gjitha filloi me nj\u00eb skenar t\u00eb shkurt\u00ebr, i cili duhej t\u00eb bashkonte informacionin mbi adresat <em>e-mail<\/em> e punonj\u00ebsve, t\u00eb marr\u00eb nga lista e p\u00ebrdoruesve t\u00eb d\u00ebrgimit t\u00eb postave, me pozitat e punonj\u00ebsve, t\u00eb marr\u00eb nga baza e t\u00eb dh\u00ebnave t\u00eb departamentit t\u00eb burimeve njer\u00ebzore. T\u00eb dyja listat ishin eksportuar n\u00eb skedar\u00eb tekstual\u00eb n\u00eb kodimin Unicode <em>UTF-8<\/em> dhe ruajtur me p\u00ebrfundimet e linjave n\u00eb Unix.<\/p>\n<p><\/p>\n<p>P\u00ebrmbajtja <em>mail.txt<\/em><\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Ivanov Andrei;ia@example.com<\/code><\/pre>\n<p><\/p>\n<p>P\u00ebrmbajtja <em>buhg.txt<\/em><\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Ivanova Alla;piktore\nJolkina Ella;kraniste\nIvanov Andrei;sanitar\nAbakanov Mihail; piktor<\/code><\/pre>\n<p><\/p>\n<p>P\u00ebr t\u00eb bashkuar, skedar\u00ebt u sortuan nga komanda Unix <em>sort<\/em> dhe u paraqit\u00ebn si hyrje n\u00eb programin Unix <em>bashkohu<\/em>, i cili p\u00ebrfundoi papritur me nj\u00eb gabim: <\/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: nuk \u00ebsht\u00eb e renditur: Ivanov Andrei;sanitar<\/code><\/pre>\n<p><\/p>\n<p>Shikimi i rezultatit t\u00eb renditjes me sy tregoi se n\u00eb p\u00ebrgjith\u00ebsi renditja \u00ebsht\u00eb korrekte, por n\u00eb rastet e emrave t\u00eb p\u00ebrputhur meshkuj dhe femra, emrat femra shkojn\u00eb para atyre meshkujve:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; sort buhg.txt\nAbakanov Mihail; piktor\nJolkina Ella;kraniste\nIvanova Alla;piktore\nIvanov Andrei;sanitar<\/code><\/pre>\n<p><\/p>\n<p>Duket si nj\u00eb gabim i renditjes n\u00eb Unicode ose si nj\u00eb shfaqje e feminizmit n\u00eb algoritmin e renditjes. E para, sigurisht, \u00ebsht\u00eb m\u00eb e besueshme.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Ta l\u00ebm\u00eb p\u00ebr tani <em>bashkohu<\/em> dhe t\u00eb p\u00ebrqendrohemi n\u00eb <em>sort<\/em>. T\u00eb p\u00ebrpiqemi t\u00eb zgjidhim problemin me metod\u00ebn e provave. P\u00ebr t\u00eb filluar, t\u00eb ndryshojm\u00eb lokalitetin nga <em>en_US<\/em> n\u00eb <em>ru_RU<\/em>. P\u00ebr renditjen do t\u00eb ishte mjaft t\u00eb vendosnim variablin e ambientit <em>LC_COLLATE<\/em>, por nuk do t\u00eb jemi t\u00eb kopert\u00eb:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; LANG=ru_RU.UTF-8 sort buhg.txt\nAbakanov Mihail;piktor\nJolkina Ella;kraniste\nIvanova Alla;piktore\nIvanov Andrei;sanitar<\/code><\/pre>\n<p><\/p>\n<p>Nuk ndodhi asgj\u00eb.<\/p>\n<p><\/p>\n<p>T\u00eb p\u00ebrpiqemi t\u00eb rikodojm\u00eb skedar\u00ebt n\u00eb nj\u00eb kodim nj\u00eb-byte: <\/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>P\u00ebrs\u00ebri nuk ndodhi asgj\u00eb.<\/p>\n<p><\/p>\n<p>Nuk ka \u00e7far\u00eb t\u00eb b\u00ebjm\u00eb, do t\u00eb duhet t\u00eb k\u00ebrkojm\u00eb zgjidhje n\u00eb internet. Drejt p\u00ebr mbi emrat rus\u00eb nuk ka asgj\u00eb, por ka pyetje rreth \u00e7udit\u00ebris\u00eb s\u00eb rendit. Ja, p\u00ebr shembull, nj\u00eb problem i till\u00eb: <noindex><a rel=\"nofollow\" href=\"https:\/\/serverfault.com\/questions\/95579\/unix-sort-treats-dash-characters-as-invisible\/95593\">unix sort i trajton karakteret &#8216;-&#8216; (dash) si t\u00eb paduksh\u00ebm<\/a><\/noindex>. N\u00ebse e p\u00ebrmbledhim, at\u00ebher\u00eb fjalit\u00eb &quot;a-b&quot;, &quot;aa&quot;, &quot;ac&quot; renditen si &quot;aa&quot;, &quot;a-b&quot;, &quot;ac&quot;.<\/p>\n<p><\/p>\n<p>P\u00ebrgjigjja \u00ebsht\u00eb standarde kudo: p\u00ebrdorni lokalitetin programues <em>&quot;C&quot;<\/em> dhe do t\u00eb jeni t\u00eb lumtur. Provo:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; LANG=C sort buhg.txt\nJolkina Ella;kraniste\nAbakanov Mihail;piktor\nIvanov Andrei;sanitar\nIvanova Alla;advokate<\/code><\/pre>\n<p><\/p>\n<p>Di\u00e7ka ka ndryshuar. Ivanov\u00ebt jan\u00eb renditur n\u00eb m\u00ebnyr\u00eb t\u00eb duhur, por \u0401lkina \u00ebsht\u00eb zvarritur diku. Po kthehemi te detyra e fillimit:<\/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>Ka funksionuar pa gabime, si\u00e7 e premtoi interneti. Edhe kjo p\u00ebrkund\u00ebr \u0401lkina n\u00eb rreshtin e par\u00eb.<\/p>\n<p><\/p>\n<p>Duket se problemi \u00ebsht\u00eb zgjidhur, por p\u00ebr \u00e7do rast do t\u00eb provojm\u00eb nj\u00eb kodim tjet\u00ebr rus\u2014at\u00eb nga Windows. <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>Rezultati i renditjes, si\u00e7 \u00ebsht\u00eb e \u00e7uditshme, do t\u00eb p\u00ebrputhet me lokalitetin <em>&quot;C&quot;<\/em>, dhe e gjith\u00eb shembulli, p\u00ebrkat\u00ebsisht, kalon pa gabime. \u00cbsht\u00eb nj\u00eb mister i \u00e7uditsh\u00ebm.<\/p>\n<p><\/p>\n<p>Nuk m\u00eb p\u00eblqen misteri n\u00eb programim, pasi zakonisht maskon gabimet. M\u00eb duhet t\u00eb merrem seriozisht me pyetjen se si funksionon <em>sort<\/em> dhe \u00e7far\u00eb ndikon <em>LC_COLLATE<\/em> .<\/p>\n<p><\/p>\n<p>N\u00eb fund do t\u00eb p\u00ebrpiqem t\u00eb p\u00ebrgjigjem n\u00eb pyetje:<\/p>\n<p><\/p>\n<ul>\n<li>pse ishin t\u00eb renditura gabimisht mbiemrat femra<\/li>\n<li>pse <em>LANG=ru_RU.CP1251<\/em> doli t\u00eb ishte ekuivalent <em>LANG=C<\/em><\/li>\n<li>pse <em>sort<\/em> dhe <em>bashkohu<\/em> kan\u00eb p\u00ebrfytyrime t\u00eb ndryshme mbi rendin e rreshtave t\u00eb renditur<\/li>\n<li>pse n\u00eb t\u00eb gjitha shembujt e mi ka gabime<\/li>\n<li>n\u00eb fund, si t\u00eb rendit\u00ebsh rreshtat sipas d\u00ebshir\u00ebs<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"sortirovka-v-yunikode\">Renditja n\u00eb Unicode<\/h1>\n<p><\/p>\n<p>Pika e par\u00eb do t\u00eb jet\u00eb raporti teknik \u2116 10 me titullin <noindex><a rel=\"nofollow\" href=\"https:\/\/unicode.org\/reports\/tr10\/\">unicode collation algorithm<\/a><\/noindex> n\u00eb faqen e internetit <noindex><a rel=\"nofollow\" href=\"https:\/\/unicode.org\">unicode.org<\/a><\/noindex>. Raporti p\u00ebrmban shum\u00eb detaje teknike, k\u00ebshtu q\u00eb do t\u00eb lejoj veten t\u00eb jap nj\u00eb p\u00ebrmbledhje t\u00eb ideve kryesore.<\/p>\n<p><\/p>\n<p><em>Renditja<\/em> \u2014 &quot;krahasimi&quot; i fjalive \u00ebsht\u00eb baza e \u00e7do algoritmi t\u00eb renditjes. Algoritmet e vet\u00eb mund t\u00eb jen\u00eb t\u00eb ndryshme (&quot;balon\u00eb&quot;, &quot;bashk\u00ebngjitje&quot;, &quot;e shpejt\u00eb&quot;), por t\u00eb gjitha do t\u00eb p\u00ebrdorin krahasimin e nj\u00eb \u00e7ifti fjalish p\u00ebr t\u00eb p\u00ebrcaktuar rendin e radhitjes s\u00eb tyre.<\/p>\n<p><\/p>\n<p>Renditja e rreshtave n\u00eb gjuh\u00ebn e natyrshme \u00ebsht\u00eb nj\u00eb problem mjaft i komplikuar. Edhe n\u00eb kodimet m\u00eb t\u00eb thjeshta me nj\u00eb bajt, rendi i shkronjave n\u00eb alfabet, ndonj\u00ebher\u00eb ndryshe nga alfabeti anglisht, nuk do t\u00eb p\u00ebrputhet me rendin e vlerave numerike q\u00eb k\u00ebto shkronja kodifikohen. K\u00ebshtu, n\u00eb alfabetin gjerman, shkronja <em>\u00d6<\/em> ndodhet midis <em>Q<\/em> dhe <em>P<\/em>, nd\u00ebrsa n\u00eb kodimin <em>CP850<\/em> ajo bie midis <em>\u00ff<\/em> dhe <em>\u00dc<\/em>.<\/p>\n<p><\/p>\n<p>Mund t\u00eb p\u00ebrpiqemi t\u00eb shk\u00ebputemi nga kodimi specifik dhe t\u00eb marrim parasysh &quot;letrat ideale&quot; q\u00eb jan\u00eb t\u00eb vendosura n\u00eb nj\u00eb rend dhe k\u00ebshtu si\u00e7 \u00ebsht\u00eb b\u00ebr\u00eb n\u00eb Unicode. Kodimet <em>UTF8<\/em>, <em>UTF16<\/em> ose nj\u00eb bajt e vetme <em>KOI8-R<\/em> (n\u00ebse nevojitet nj\u00eb n\u00ebngrup i kufizuar i Unicode) do t\u00eb japin reprezentime numerike t\u00eb ndryshme t\u00eb shkronjave, por do t\u00eb referohen n\u00eb t\u00eb nj\u00ebjt\u00ebt element\u00eb t\u00eb tabel\u00ebs themelore. <\/p>\n<p><\/p>\n<p>Kjo tregon se madje edhe n\u00ebse nd\u00ebrtuam nj\u00eb tabel\u00eb simboresh nga zero, ne nuk do t\u00eb mund ta caktojm\u00eb nj\u00eb rend universal t\u00eb simboleve. N\u00eb alfabetet e ndryshme komb\u00ebtare q\u00eb p\u00ebrdorin t\u00eb nj\u00ebjtat shkronja, rendi i k\u00ebtyre shkronjave mund t\u00eb ndryshoj\u00eb. P\u00ebr shembull, n\u00eb gjuh\u00ebn franceze <em>\u00c6<\/em> do t\u00eb konsiderohet si nj\u00eb ligatur\u00eb dhe do t\u00eb renditet si nj\u00eb varg <em>AE<\/em>. N\u00eb gjuh\u00ebn norvegjeze, <em>\u00c6<\/em> do t\u00eb jet\u00eb nj\u00eb shkronj\u00eb e ve\u00e7ant\u00eb, e cila ndodhet pas <em>Z<\/em>. P\u00ebr m\u00eb tep\u00ebr, p\u00ebrve\u00e7 ligaturave si <em>\u00c6<\/em> ekzistojn\u00eb shkronja q\u00eb regjistrohen me disa simbole. K\u00ebshtu, n\u00eb alphabetin \u00e7ek, ka shkronj\u00ebn <em>Ch<\/em>, e cila ndodhet mes <em>H<\/em> dhe <em>I<\/em>.<\/p>\n<p><\/p>\n<p>P\u00ebrve\u00e7 ndryshimeve n\u00eb alfabetet, ekzistojn\u00eb edhe tradita t\u00eb tjera komb\u00ebtare q\u00eb ndikojn\u00eb n\u00eb renditjen. N\u00eb ve\u00e7anti, lind pyetja: n\u00eb cilin rend duhet t\u00eb ndodhen n\u00eb fjalor fjal\u00ebt q\u00eb p\u00ebrb\u00ebhen nga shkronja t\u00eb m\u00ebdha dhe t\u00eb vogla? Gjithashtu, renditjen mund ta ndikojn\u00eb ve\u00e7orit\u00eb e p\u00ebrdorimit t\u00eb shenjave t\u00eb ndarjes. N\u00eb gjuh\u00ebn spanjolle, n\u00eb fillim t\u00eb nj\u00eb pyetjeje vendoset nj\u00eb shenj\u00eb pyetjeje e kthyer (<em>\u00bfTe gusta la m\u00fasica?<\/em>). N\u00eb k\u00ebt\u00eb rast, \u00ebsht\u00eb e qart\u00eb se propozimet pyet\u00ebse nuk duhet t\u00eb grumbullohen n\u00eb nj\u00eb grup t\u00eb ve\u00e7ant\u00eb jasht\u00eb alfabetit, por si duhet t\u00eb renditen vargjet me shenja t\u00eb tjera ndar\u00ebse?<\/p>\n<p><\/p>\n<p>Nuk do t\u00eb q\u00ebndroj mbi renditjen e vargjeve n\u00eb gjuh\u00ebt q\u00eb dallohen shum\u00eb nga ato evropiane. Dua t\u00eb theksoj se n\u00eb gjuh\u00ebt me drejtimin e shkrimit nga e drejta n\u00eb t\u00eb majt\u00eb ose nga lart posht\u00eb, simbolet n\u00eb vargje, me sa duket, ruhen n\u00eb rendin e leximit, dhe madje edhe n\u00eb shkrime jo-alfabetike ka m\u00ebnyra t\u00eb veta p\u00ebr renditjen e simboleve. P\u00ebr shembull, hieroglif\u00ebt mund t\u00eb renditen sipas form\u00ebs s\u00eb tyre (<noindex><a rel=\"nofollow\" href=\"https:\/\/studychinese.ru\/kljuchi\/\">\u00e7el\u00ebsat e hieroglif\u00ebve kinez\u00eb<\/a><\/noindex>) ose sipas shqiptimit. Si duhet t\u00eb renditen emoji-t, sinqerisht nuk e di, por edhe p\u00ebr ta mund t\u00eb mendohet di\u00e7ka.<\/p>\n<p><\/p>\n<p>Bazuar n\u00eb ve\u00e7orit\u00eb e p\u00ebrmendura m\u00eb sip\u00ebr, jan\u00eb formuluar k\u00ebrkesat kryesore p\u00ebr krahasimin e vargjeve t\u00eb bazuara n\u00eb tabelat e Unicode:<\/p>\n<p><\/p>\n<ul>\n<li>krahasimi i vargjeve nuk varet nga pozita e simboleve n\u00eb tabel\u00ebn e kodimit;<\/li>\n<li>sekuencat e simboleve q\u00eb formojn\u00eb nj\u00eb simbol unik, u jepen form\u00ebs kanonike (<em>A<\/em> + rreth i sip\u00ebrm \u00ebsht\u00eb e nj\u00ebjt\u00eb me <em>\u00c5<\/em>);<\/li>\n<li>n\u00eb krahasimin e vargjeve, simboli shqyrtohet n\u00eb kontekstin e vargut dhe, n\u00ebse \u00ebsht\u00eb e nevojshme, bashkohet me fqinj\u00ebt n\u00eb nj\u00eb nj\u00ebsin\u00eb krahasuese (<em>Ch<\/em> n\u00eb \u00e7ek) ose ndahet n\u00eb disa (<em>\u00c6<\/em> n\u00eb francais);<\/li>\n<li>t\u00eb gjitha ve\u00e7orit\u00eb komb\u00ebtare (alfabeti, shkronjat e m\u00ebdha\/t\u00eb vogla, shenjat e pik\u00ebsimit, rendi i shkrimeve) duhet t\u00eb konfigurohen deri n\u00eb em\u00ebrimin manual t\u00eb rendit (emoji);<\/li>\n<li>krahasimi \u00ebsht\u00eb i r\u00ebnd\u00ebsish\u00ebm jo vet\u00ebm p\u00ebr renditjen, por edhe n\u00eb shum\u00eb vende t\u00eb tjera, p\u00ebr shembull p\u00ebr caktimin e intervaleve t\u00eb rreshtave (z\u00ebvend\u00ebsimi {A\u2026 ja} n\u00eb <em>bash<\/em>);<\/li>\n<li>krahasimi duhet t\u00eb kryhet mjaft shpejt.<\/li>\n<\/ul>\n<p><\/p>\n<p>P\u00ebr m\u00eb tep\u00ebr, autor\u00ebt e raportit formuluan vetit\u00eb e krahasimit, p\u00ebr t\u00eb cilat zhvilluesit e algoritmeve nuk duhet t\u00eb mb\u00ebshteten:<\/p>\n<p><\/p>\n<ul>\n<li>algoritmi i krahasimit nuk duhet t\u00eb k\u00ebrkoj\u00eb nj\u00eb grup t\u00eb ve\u00e7ant\u00eb simbolet p\u00ebr \u00e7do gjuh\u00eb (gjuha ruse dhe ukrainase p\u00ebrdorin shumic\u00ebn e simboleve t\u00eb cirilik\u00ebs s\u00eb bashku);<\/li>\n<li>krahasimi nuk duhet t\u00eb mb\u00ebshtetet n\u00eb rendin e simboleve n\u00eb tabelat Unicode;<\/li>\n<li>pesha e nj\u00eb rreshti nuk duhet t\u00eb jet\u00eb nj\u00eb atribut i rreshtit, pasi nj\u00ebsoj si rreshti n\u00eb kontekste t\u00eb ndryshme kulturore mund t\u00eb ket\u00eb pesha t\u00eb ndryshme;<\/li>\n<li>pesha e rreshtave mund t\u00eb ndryshoj\u00eb gjat\u00eb bashkimit ose ndarjes (nga <em>x<\/em> &lt; <em>y<\/em> nuk do t\u00eb thot\u00eb se <em>xz<\/em> &lt; <em>yz<\/em>);<\/li>\n<li>rreshtat e ndrysh\u00ebm, q\u00eb kan\u00eb t\u00eb nj\u00ebjt\u00ebn pesh\u00eb, konsiderohen t\u00eb barabart\u00eb n\u00eb aspektin e algoritmit t\u00eb renditjes. Futja e nj\u00eb rendi shtes\u00eb p\u00ebr k\u00ebto rreshta \u00ebsht\u00eb e mundur, por mund t\u00eb p\u00ebrkeq\u00ebsoj\u00eb performanc\u00ebn;<\/li>\n<li>gjat\u00eb renditjeve t\u00eb p\u00ebrs\u00ebritura, rreshtat q\u00eb kan\u00eb t\u00eb nj\u00ebjt\u00ebn pesh\u00eb mund t\u00eb shk\u00ebmbehen. Stabiliteti \u00ebsht\u00eb nj\u00eb pron\u00eb e nj\u00eb algoritmi t\u00eb caktuar t\u00eb renditjes, dhe jo nj\u00eb pron\u00eb e algoritmit t\u00eb krahasimit t\u00eb rreshtave (shiko piken e m\u00ebparshme);<\/li>\n<li>rregullat e renditjes mund t\u00eb ndryshojn\u00eb me kalimin e koh\u00ebs nd\u00ebrsa traditat kulturore sakt\u00ebsohen\/ndryshojn\u00eb.<\/li>\n<\/ul>\n<p><\/p>\n<p>Po ashtu \u00ebsht\u00eb p\u00ebrcaktuar se algoritmi i krahasimit nuk di asgj\u00eb p\u00ebr semantik\u00ebn e rreshtave t\u00eb p\u00ebrpunuar. K\u00ebshtu, rreshtat q\u00eb p\u00ebrb\u00ebhen vet\u00ebm nga numra nuk duhet t\u00eb krahasohen si numra, dhe n\u00eb listat e emrave anglez\u00eb nuk duhet t\u00eb hiqet artikulli (<em>Beatles, The<\/em>).<\/p>\n<p><\/p>\n<p>P\u00ebr t\u00eb p\u00ebrmbushur t\u00eb gjitha k\u00ebrkesat e p\u00ebrmendura \u00ebsht\u00eb propozuar nj\u00eb algorit\u00ebm renditjeje me shum\u00eb nivele (p\u00ebr faktin kat\u00ebr nivele).<\/p>\n<p><\/p>\n<p>Fillimisht, simbol\u00ebt n\u00eb rresht do t\u00eb konvertohen n\u00eb form\u00eb kanonike dhe do t\u00eb grupohen n\u00eb nj\u00ebsit\u00eb e krahasimit. \u00c7do nj\u00ebsie krahasimi i atribuohen disa pesha, q\u00eb p\u00ebrputhen me disa nivele krahasimi. Pesha e nj\u00ebsive t\u00eb krahasimit jan\u00eb elemente t\u00eb grupeve t\u00eb renditura (n\u00eb k\u00ebt\u00eb rast numra t\u00eb t\u00ebr\u00eb), t\u00eb cilat mund t\u00eb krahasohen p\u00ebr m\u00eb shum\u00eb-m\u00eb pak. Vlera speciale <em>IGNORED<\/em> (0x0) do t\u00eb thot\u00eb se n\u00eb nivelin p\u00ebrkat\u00ebs t\u00eb krahasimit, kjo nj\u00ebsi nuk merr pjes\u00eb n\u00eb krahasim. Krahasimi i vargjeve mund t\u00eb p\u00ebrs\u00ebritet disa her\u00eb, duke p\u00ebrdorur peshat p\u00ebrkat\u00ebse t\u00eb niveleve. N\u00eb \u00e7do nivel, pesha e nj\u00ebsi t\u00eb krahasimit t\u00eb dy vargjeve krahasohet nj\u00ebra me tjetr\u00ebn.<\/p>\n<p><\/p>\n<p>N\u00eb realizime t\u00eb ndryshme t\u00eb algoritmit p\u00ebr tradita t\u00eb ndryshme komb\u00ebtare, madh\u00ebsit\u00eb e koeficient\u00ebve mund t\u00eb ndryshojn\u00eb, por n\u00eb p\u00ebrb\u00ebrjen e standardit Unicode p\u00ebrfshihet nj\u00eb tabel\u00eb baz\u00eb peshash \u2014 <em>&quot;Default Unicode Collation Element Table&quot;<\/em> (<em>DUCET<\/em>). Dua t\u00eb v\u00eb n\u00eb dukje se vendosja e variabl\u00ebs <em>LC_COLLATE<\/em> faktikisht \u00ebsht\u00eb nj\u00eb tregues p\u00ebr zgjedhjen e tabel\u00ebs s\u00eb peshave n\u00eb funksionin e krahasimit t\u00eb vargjeve.<\/p>\n<p><\/p>\n<p>Koeficient\u00ebt e pesha <em>DUCET<\/em> jan\u00eb strukturuar si m\u00eb posht\u00eb:<\/p>\n<p><\/p>\n<ul>\n<li>n\u00eb nivelin e par\u00eb, t\u00eb gjitha shkronjat jan\u00eb t\u00eb shnd\u00ebrruara n\u00eb nj\u00eb regjist\u00ebr, shenjat diakritike p\u00ebrjashtohen, dhe shenjat e pik\u00ebsimit (jo t\u00eb gjitha) injorohen;<\/li>\n<li>n\u00eb nivelin e dyt\u00eb, vet\u00ebm shenjat diakritike merren n\u00eb konsiderat\u00eb;<\/li>\n<li>n\u00eb nivelin e tret\u00eb, merren parasysh vet\u00ebm regjistrat;<\/li>\n<li>n\u00eb nivelin e kat\u00ebrt, merren parasysh vet\u00ebm shenjat e pik\u00ebsimit.<\/li>\n<\/ul>\n<p><\/p>\n<p>Krahasimi ndodh n\u00eb disa kalime: s\u00eb pari krahasohen koeficient\u00ebt e nivelit t\u00eb par\u00eb; n\u00ebse pesha p\u00ebrputhet, b\u00ebhet nj\u00eb krahasim i ri me peshat e nivelit t\u00eb dyt\u00eb; p\u00ebr m\u00eb pas, ndoshta, ata t\u00eb tret\u00eb dhe t\u00eb kat\u00ebrt.<\/p>\n<p><\/p>\n<p>Krahasimi p\u00ebrfundon kur n\u00eb vargje ndodhen nj\u00ebsi krahasimi p\u00ebrkat\u00ebse me pesa t\u00eb ndryshme. Vargjet q\u00eb kan\u00eb pesha t\u00eb barabarta n\u00eb t\u00eb kat\u00ebr nivelet konsiderohen t\u00eb barabarta mes tyre.<\/p>\n<p><\/p>\n<p>Ky algorit\u00ebm (me nj\u00eb mori detajesh teknike shtes\u00eb) i dha emrin raportit nr. 10 \u2014 <em>&quot;Unicode Collation Algorithm&quot;<\/em> (<em>UCA<\/em>).<\/p>\n<p><\/p>\n<p>N\u00eb k\u00ebt\u00eb pik\u00eb, sjellja e renditjes nga shembulli yn\u00eb b\u00ebhet pak m\u00eb e qart\u00eb. Do t\u00eb ishte mir\u00eb ta krahasonim me standardin Unicode.<\/p>\n<p><\/p>\n<p>P\u00ebr testimin e realizimeve <em>UCA<\/em> ekziston nj\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/www.unicode.org\/Public\/UCA\/latest\/CollationTest.html\">test<\/a><\/noindex>, q\u00eb p\u00ebrdor <noindex><a rel=\"nofollow\" href=\"http:\/\/www.unicode.org\/Public\/UCA\/latest\/allkeys.txt\">skedarin e peshave<\/a><\/noindex>, q\u00eb implementon <em>DUCET<\/em>. N\u00eb skedarin e peshave mund t\u00eb gjeni gj\u00ebra t\u00eb ndryshme interesante. P\u00ebr shembull, ka rendin e domino-s europian dhe pjes\u00ebve t\u00eb mahjongut, si dhe rendin e llojeve n\u00eb nj\u00eb paket\u00eb kartash (simbol <em>1F000<\/em> dhe m\u00eb tej). Llojet e kartave jan\u00eb t\u00eb vendosura sipas rregullave t\u00eb bridge-it \u2014 P\u00c7BT, dhe kartat brenda llojit jan\u00eb n\u00eb renditjen T, 2, 3\u2026 K.<\/p>\n<p><\/p>\n<p>Kontrolli manual i sakt\u00ebsis\u00eb s\u00eb renditjes s\u00eb vargjeve n\u00eb p\u00ebrputhje me <em>DUCET<\/em> do t\u00eb ishte mjaft e lodhshme, por, fatmir\u00ebsisht p\u00ebr ne, ekziston nj\u00eb realizim shembullor i bibliotek\u00ebs p\u00ebr pun\u00ebn me Unicode \u2014 &quot;<noindex><a rel=\"nofollow\" href=\"http:\/\/site.icu-project.org\/\">Komponent\u00ebt Nd\u00ebrkomb\u00ebtar\u00eb p\u00ebr Unicode<\/a><\/noindex>&quot; (<em>ICU<\/em>).<\/p>\n<p><\/p>\n<p>N\u00eb faqen e k\u00ebsaj biblioteke, e cila u zhvillua n\u00eb <em>IBM<\/em>, ka faqe demonstrimi, p\u00ebrfshir\u00eb <noindex><a rel=\"nofollow\" href=\"http:\/\/demo.icu-project.org\/icu-bin\/collation.html\">faqen e algoritmit t\u00eb krahasimit t\u00eb vargjeve<\/a><\/noindex>. Futim vargjet tona testuese me cil\u00ebsimet e parazgjedhura dhe, o mrekulli, marrim nj\u00eb renditje t\u00eb p\u00ebrsosur n\u00eb rusisht.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Abakanov Mikhail;piktor\nJolkina Ella;nj\u00eb grua ndihmuese\nIvanov Andrei;ndihm\u00ebs\nIvanova Alla;avokate<\/code><\/pre>\n<p><\/p>\n<p>Tani, n\u00eb faqen <em>ICU<\/em> mund t\u00eb gjejm\u00eb qart\u00ebsimin e funksionit t\u00eb algoritmit t\u00eb krahasimit kur p\u00ebrpunohen shenjat e pik\u00ebsimit. N\u00eb shembujt <noindex><a rel=\"nofollow\" href=\"http:\/\/userguide.icu-project.org\/collation\/faq\">FAQ p\u00ebr Krahasimin<\/a><\/noindex> t\u00eb apostrofit dhe lidh\u00ebsit injorohen.<\/p>\n<p><\/p>\n<p>Unicode na ndihmoi, por do t\u00eb duhet t\u00eb k\u00ebrkojm\u00eb shkaktarin e sjelljes s\u00eb \u00e7uditshme <em>sort<\/em> n\u00eb <em>Linux<\/em> diku tjet\u00ebr.<\/p>\n<p><\/p>\n<h1 id=\"sortirovka-v-glibc\">Renditja n\u00eb glibc<\/h1>\n<p><\/p>\n<p>Nj\u00eb shikim i shpejt\u00eb n\u00eb kodin burimor t\u00eb utilitetit <em>sort<\/em> nga <em>GNU Core Utils<\/em> tregon se, n\u00eb vet\u00eb utilitetin, lokalizimi reduktohet n\u00eb shfaqjen e vler\u00ebs aktuale t\u00eb variabl\u00ebs <em>LC_COLLATE<\/em> kur ekzekutohet n\u00eb modin e depuratimit:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ sort --debug buhg.txt &gt; buhg.srt\nsort: duke p\u00ebrdorur rregullat e renditjes \u2018en_US.UTF8\u2019<\/code><\/pre>\n<p><\/p>\n<p>Krahasimi i vargjeve kryhet nga funksioni standard <em>strcoll<\/em>, k\u00ebshtu q\u00eb gjith\u00e7ka interesante ndodhet n\u00eb bibliotek\u00eb <em>glibc<\/em>.<\/p>\n<p><\/p>\n<p>N\u00eb <em>wiki<\/em> i projektit <em>glibc<\/em> krahasimit t\u00eb vargjeve i kushtohet <noindex><a rel=\"nofollow\" href=\"https:\/\/sourceware.org\/glibc\/wiki\/Locales#LC_COLLATE\">nj\u00eb paragraf<\/a><\/noindex>. Nga ky paragraf mund t\u00eb kuptohet se n\u00eb <em>glibc<\/em> renditja bazohet n\u00eb algoritmin q\u00eb tashm\u00eb e dim\u00eb <em>UCA<\/em> (<em>Algoritmi i renditjes Unicode<\/em>) dhe\/ose n\u00eb nj\u00eb standard t\u00eb ngjash\u00ebm <em>ISO 14651<\/em> (<em>Renditja dhe krahasimi nd\u00ebrkomb\u00ebtar i vargjeve<\/em>). N\u00eb lidhje me standardin e fundit, duhet t\u00eb theksohet se n\u00eb faqen <noindex><a rel=\"nofollow\" href=\"https:\/\/standards.iso.org\/ittf\/PubliclyAvailableStandards\">standards.iso.org<\/a><\/noindex> <em>ISO 14651<\/em> \u00ebsht\u00eb shpallur zyrtarisht publik, por lidhja p\u00ebrkat\u00ebse \u00e7on n\u00eb nj\u00eb faqe joeksistuese. Google jep disa faqe me lidhje n\u00eb faqet zyrtare q\u00eb ofrojn\u00eb blerjen e nj\u00eb kopjeje elektronike t\u00eb standardit p\u00ebr nj\u00ebqind euro, por n\u00eb faqen e tret\u00eb-kat\u00ebrt t\u00eb rezultatet e k\u00ebrkimit mund t\u00eb gjenden edhe lidhje t\u00eb drejtp\u00ebrdrejta n\u00eb <em>PDF<\/em>. N\u00eb p\u00ebrgjith\u00ebsi, standardi praktisht nuk ndryshon nga <em>UCA<\/em>, por lexohet m\u00eb ngadal\u00eb, pasi nuk p\u00ebrmban shembuj t\u00eb duksh\u00ebm t\u00eb ve\u00e7orive komb\u00ebtare t\u00eb renditjes s\u00eb vargjeve. <\/p>\n<p><\/p>\n<p>Informata m\u00eb interesante n\u00eb <em>wiki<\/em> ka qen\u00eb lidhja mbi <noindex><a rel=\"nofollow\" href=\"https:\/\/sourceware.org\/bugzilla\/show_bug.cgi?id=14095\">bug tracker<\/a><\/noindex> me diskutimin e implementimit t\u00eb krahasimit t\u00eb vargjeve n\u00eb <em>glibc<\/em>. Nga diskutimi mund t\u00eb kuptohet se n\u00eb <em>glibc<\/em> p\u00ebr krahasimin e vargjeve p\u00ebrdoret <em>ISO<\/em>tabela e zakonshme <noindex><a rel=\"nofollow\" href=\"http:\/\/www.iso.org\/ittf\/ISO14651_2006_TABLE1_en.txt\">Tabela e P\u00ebrbashk\u00ebt e Shabllon\u00ebve<\/a><\/noindex> (<em>CTT<\/em>), adresa e s\u00eb cil\u00ebs mund t\u00eb gjendet n\u00eb aplikacionin <em>A<\/em> standardit <em>ISO 14651<\/em>. Midis vitit 2000 dhe 2015 kjo tabel\u00eb n\u00eb <em>glibc<\/em> Nuk kishte nj\u00eb mbajt\u00ebs dhe ndryshoi mjaft (t\u00eb pakt\u00ebn n\u00eb sip\u00ebrfaqe) nga versioni aktual i standardit. Nga 2015 deri n\u00eb 2018, u adaptua p\u00ebr versionin e ri t\u00eb tabel\u00ebs dhe tani keni mund\u00ebsin\u00eb t\u00eb takoni n\u00eb jet\u00ebn reale si variantin e ri t\u00eb tabel\u00ebs (<em>CentOS 8<\/em>), ashtu dhe t\u00eb vjet\u00ebr (<em>CentOS 7<\/em>). <\/p>\n<p><\/p>\n<p>Tani q\u00eb e kemi t\u00eb gjith\u00eb informacionin rreth algoritmit dhe tabelave ndihm\u00ebse, mund t\u00eb kthehemi te problemi fillestar dhe t\u00eb kuptojm\u00eb si t\u00eb rendisim rreshtat n\u00eb lokalitetin rus.<\/p>\n<p><\/p>\n<h1 id=\"iso-1465114652\">ISO 14651\/14652<\/h1>\n<p><\/p>\n<p>Kodi burimor i tabel\u00ebs q\u00eb na intereson <em>CTT<\/em> n\u00eb shumic\u00ebn e distribucioneve <em>Linux<\/em> ndodhet n\u00eb katalogun <em>\/usr\/share\/i18n\/locales\/<\/em>. Tabela vet\u00eb ndodhet n\u00eb skedarin <em>iso14651_t1_common<\/em>. Pastaj, ky skedar me direktiv\u00ebn <em>copy iso14651_t1_common<\/em> p\u00ebrfshihet n\u00eb skedarin <em>iso14651_t1<\/em>, i cili, nga ana e tij, p\u00ebrfshihet n\u00eb skedar\u00ebt komb\u00ebtar\u00eb, p\u00ebrfshir\u00eb n\u00eb <em>en_US<\/em> dhe <em>ru_RU<\/em>. N\u00eb shumic\u00ebn e distribucioneve <em>Linux<\/em> t\u00eb gjitha skedar\u00ebt burimor\u00eb p\u00ebrfshihen n\u00eb p\u00ebrb\u00ebrjen e instalimit baz\u00eb, por n\u00ebse nuk ka, do t\u00eb duhet t\u00eb instaloni nj\u00eb paket\u00eb shtes\u00eb nga distribuimi.<\/p>\n<p><\/p>\n<p>Struktura e skedarit <em>iso14651_t1<\/em> mund t\u00eb duket shum\u00eb m\u00eb e gjat\u00eb, me rregulla jo t\u00eb qarta p\u00ebr nd\u00ebrtimin e emrave, por n\u00ebse e kuptoni, \u00ebsht\u00eb mjaft e thjesht\u00eb. Struktura p\u00ebrshkruhet n\u00eb standardin <em>ISO 14652<\/em>, nj\u00eb kopje e t\u00eb cilit mund t\u00eb shkarkohet nga faqja <noindex><a rel=\"nofollow\" href=\"http:\/\/www.open-std.org\/JTC1\/SC22\/WG20\/docs\/n972-14652ft.pdf\">open-std.org<\/a><\/noindex>. Nj\u00eb p\u00ebrshkrim tjet\u00ebr i formatit t\u00eb skedarit mund t\u00eb lexoni n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/9699919799\/basedefs\/V1_chap07.html\">specifikimet<\/a><\/noindex> <em>POSIX<\/em> nga <em>OpenGroup<\/em>. Si nj\u00eb alternativ\u00eb p\u00ebr t\u00eb lexuar standardin, mund t\u00eb studiuesh skedaret burimore t\u00eb funksionit <em>collate_read<\/em> n\u00eb <em>glibc\/locale\/programs\/ld-collate.c<\/em>.<\/p>\n<p><\/p>\n<p>Struktura e skedarit duket k\u00ebshtu:<\/p>\n<p><\/p>\n<p>Sipas rregullave, simbolet p\u00ebrdoren si simboli i shk\u00ebputjes, dhe fundi i rreshtit pas simbolit # \u00ebsht\u00eb nj\u00eb koment. T\u00eb dy simbolet mund t\u00eb tejkalohen, di\u00e7ka q\u00eb \u00ebsht\u00eb b\u00ebr\u00eb n\u00eb versionin e ri t\u00eb tabel\u00ebs:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">escape_char \/\ncomment_char %<\/code><\/pre>\n<p><\/p>\n<p>N\u00eb skedar do t\u00eb hasni toka n\u00eb formatin <em>&lt;Uxxxx&gt;<\/em> ose <em>&lt;Uxxxxxxxx&gt;<\/em> (ku <em>x<\/em> \u2014 numri n\u00eb hex). Ky \u00ebsht\u00eb nj\u00eb p\u00ebrfaq\u00ebsim heksadeshimal i pikave t\u00eb kodit Unicode n\u00eb kodimin <em>UCS-4<\/em> (<em>UTF-32<\/em>). T\u00eb gjitha elementet e tjera n\u00eb k\u00ebndore (p\u00ebrfshir\u00eb <em>&lt;Uxxxx_xxxx&gt;<\/em>, <em>&lt;2&gt;<\/em> dhe t\u00eb ngjashme), konsiderohen si konstanta t\u00eb thjeshta t\u00eb vargjeve, pa kuptim t\u00eb ve\u00e7ant\u00eb jasht\u00eb kontekstit.<\/p>\n<p><\/p>\n<p>String <em>LC_COLLATE<\/em> na thot\u00eb se m\u00eb pas fillojn\u00eb t\u00eb dh\u00ebnat q\u00eb p\u00ebrshkruajn\u00eb krahasimin e vargjeve.<\/p>\n<p><\/p>\n<p>Fillimisht, emrat p\u00ebr peshat n\u00eb tabel\u00ebn e krahasimit dhe emrat p\u00ebr kombinimet e simboleve p\u00ebrcaktohen. K\u00ebshtu q\u00eb, dy lloje emrash i p\u00ebrkasin dy entiteteve t\u00eb ndryshme, por n\u00eb skedarin e v\u00ebrtet\u00eb ato jan\u00eb t\u00eb p\u00ebrziera. Emrat e peshave p\u00ebrcaktohen nga fjala ky\u00e7e <em>collating-symbol<\/em> (simboli i krahasimit), sepse kur krahasohen simbolet Unicode q\u00eb kan\u00eb pesha t\u00eb nj\u00ebjta, ato do t\u00eb konsiderohen si simbole ekuivalente.<\/p>\n<p><\/p>\n<p>Gjat\u00ebsia totale e seksionit n\u00eb revizionin e tanish\u00ebm t\u00eb skedarit \u00ebsht\u00eb rreth 900 rreshta. Kam nxjerr\u00eb shembuj nga disa vende p\u00ebr t\u00eb treguar rast\u00ebsin\u00eb e emrave dhe disa lloje sintaksash.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">LC_COLLATE\n\nsimboli-i-rendit &lt;RES-1&gt;\nsymboli-i-rendit &lt;BLK&gt;\nsymboli-i-rendit &lt;MIN&gt;\nsymboli-i-rendit &lt;WIDE&gt;\n...\nsymboli-i-rendit &lt;ARABIC&gt;\nsymboli-i-rendit &lt;ETHPC&gt;\nsymboli-i-rendit &lt;OSMANYA&gt;\n...\nsymboli-i-rendit &lt;S1D000&gt;..&lt;S1D35F&gt;\nsymboli-i-rendit &lt;SFFFF&gt; % Vlera m\u00eb e madhe e garantuar p\u00ebr simbolin. Mbani n\u00eb fund t\u00eb k\u00ebtij list\u00eb\n...\nelementi-i-rendit &lt;U0413_0301&gt; nga &quot;&lt;U0413&gt;&lt;U0301&gt;&quot;\nelementi-i-rendit &lt;U0413_0341&gt; nga &quot;&lt;U0413&gt;&lt;U0341&gt;&quot;<\/code><\/pre>\n<p><\/p>\n<ul>\n<li><em>simboli-i-krahasimit &lt;OSMANYA&gt;<\/em> regjistron nj\u00eb varg <em>OSMANYA<\/em> n\u00eb tabel\u00ebn e emrave t\u00eb peshave <\/li>\n<li><em>simboli-i-krahasimit &lt;S1D000&gt;..&lt;S1D35F&gt;<\/em> regjistron nj\u00eb sekuenc\u00eb emrash q\u00eb p\u00ebrb\u00ebhet nga nj\u00eb prefiks <em>S<\/em> dhe nj\u00eb sufiks numerik n\u00eb gjashtor nga <em>1D000<\/em> n\u00eb <em>1D35F<\/em>.<\/li>\n<li><em>FFFF<\/em> n\u00eb <em>simboli-i-krahasimit &lt;SFFFF&gt;<\/em> duket si nj\u00eb num\u00ebr i madh pa n\u00ebnshkrim n\u00eb sistemin e numeracionit n\u00eb gjashtor, por <em>&lt;SFFFF&gt;<\/em> \u00ebsht\u00eb thjesht nj\u00eb em\u00ebr q\u00eb mund t\u00eb dukej si <em>&lt;VERYBIGVAL&gt;<\/em> <\/li>\n<li>emri <em>&lt;U0413&gt;<\/em> tregon nj\u00eb pik\u00eb kodimi n\u00eb kodimin <em>UCS-4<\/em><\/li>\n<li><em>elementi-i-rendit &lt;U0413_0301&gt; nga &quot;&lt;U0413&gt;&lt;U0301&gt;&quot;<\/em> regjistron nj\u00eb em\u00ebr t\u00eb ri p\u00ebr nj\u00eb \u00e7ift pikash unicode. <\/li>\n<\/ul>\n<p><\/p>\n<p>Kur emrat e peshave jan\u00eb p\u00ebrcaktuar, caktohen vet\u00eb peshat. Pasi vet\u00ebm marr\u00ebdh\u00ebnia m\u00eb e madhe-m\u00eb e vog\u00ebl ka r\u00ebnd\u00ebsi n\u00eb krahasim, peshat caktohen nga nj\u00eb rend i thjesht\u00eb i listimit t\u00eb emrave. Fillimisht renditen peshat m\u00eb &quot;t\u00eb lehta&quot;, pastaj ato m\u00eb &quot;t\u00eb r\u00ebnda&quot;. T\u00eb kujtojm\u00eb se \u00e7do simbol Unicode ka kat\u00ebr peshat e ndryshme t\u00eb caktuara. K\u00ebtu ato jan\u00eb t\u00eb mbledhura n\u00eb nj\u00eb rend t\u00eb vet\u00ebm. Teoretikisht, \u00e7do em\u00ebr simbolik mund t\u00eb p\u00ebrdoret n\u00eb \u00e7do nj\u00eb nga kat\u00ebr nivelet, por komentet tregojn\u00eb se zhvilluesit mend\u00ebrisht ndajn\u00eb emrat sipas niveleve.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">% Caktimet e peshave simbolike\n\n% Caktimet e peshave t\u00eb nivelit t\u00eb tret\u00eb\n&lt;RES-1&gt;\n&lt;BLK&gt;\n&lt;MIN&gt;\n&lt;WIDE&gt;\n...\n% Caktimet e peshave t\u00eb nivelit t\u00eb dyt\u00eb\n&lt;BASE&gt;\n&lt;LOWLINE&gt; % KOMBINUAR N\u00cb POSHT\u00cb\n&lt;PSILI&gt; % KOMBINUAR KOM\u00cb N\u00cb SIP\u00cbR\n&lt;DASIA&gt; % KOMBINUAR KOM\u00cb E KTHYER N\u00cb SIP\u00cbR\n...\n% Caktimet e peshave t\u00eb nivelit t\u00eb par\u00eb\n&lt;S0009&gt; % TABULIMI HORIZONTAL\n&lt;S000A&gt; % RRESHTI I AUTOMATIZUAR\n&lt;S000B&gt; % TABULIMI VERTIKAL\n...\n&lt;S0434&gt; % LETRA E SMALL CYRILIC DE\n&lt;S0501&gt; % LETRA E SMALL CYRILIC KOMI DE\n&lt;S0452&gt; % LETRA E SMALL CYRILIC DJE\n&lt;S0503&gt; % LETRA E SMALL CYRILIC KOMI DJE\n&lt;S0453&gt; % LETRA E SMALL CYRILIC GJE\n&lt;S0499&gt; % LETRA E SMALL CYRILIC ZE ME N\u00cbNTESH\n&lt;S0435&gt; % LETRA E SMALL CYRILIC IE\n&lt;S04D7&gt; % LETRA E SMALL CYRILIC IE ME BREVE\n&lt;S0454&gt; % LETRA E SMALL CYRILIC IE UKRAINIAN\n&lt;S0436&gt; % LETRA E SMALL CYRILIC ZHE<\/code><\/pre>\n<p><\/p>\n<p>S\u00eb fundi, tabela e peshave.<\/p>\n<p><\/p>\n<p>Seksi i peshave \u00ebsht\u00eb i mbyllur n\u00eb radh\u00eb me fjal\u00eb ky\u00e7e <em>order_start<\/em> dhe <em>order_end<\/em>. Parametrat e tjer\u00eb <em>order_start<\/em> p\u00ebrcaktojn\u00eb se n\u00eb cilin drejtim shihen radh\u00ebt n\u00eb secil\u00ebn nivel krahasimi. Si rregull, p\u00ebrdoret parametri <em>forward<\/em>. Trupi i seksionit p\u00ebrb\u00ebhet nga radh\u00eb q\u00eb p\u00ebrmbajn\u00eb kodin e karakterit dhe kat\u00ebr peshat e tij. Kodi i karakterit mund t\u00eb p\u00ebrfaq\u00ebsohet nga vet\u00eb karakteri, pika e kodit ose emri simbolik i p\u00ebrcaktuar m\u00eb par\u00eb. Pesha gjithashtu mund t\u00eb jepet nga emra simbolik\u00eb, pika kodimi ose vet\u00eb karakteret. N\u00ebse p\u00ebrdoren pika kodimi ose karaktere, pesha e tyre p\u00ebrputhet me vler\u00ebn numerike t\u00eb pik\u00ebs s\u00eb kodit (pozita n\u00eb tabel\u00ebn e Unicode). Karakteret q\u00eb nuk jan\u00eb p\u00ebrmendur qart\u00eb (ashtu si\u00e7 e kuptoj) konsiderohen t\u00eb shtuar n\u00eb tabel\u00eb me pesh\u00eb primare, e cila p\u00ebrputhet me pozitat n\u00eb tabel\u00ebn e Unicode. Vlera speciale e pesh\u00ebs <em>IGNORE<\/em> do t\u00eb thot\u00eb se n\u00eb nivelin p\u00ebrkat\u00ebs t\u00eb krahasimit ky karakter injorohet.<\/p>\n<p><\/p>\n<p>P\u00ebr t\u00eb demonstruar struktur\u00ebn e peshave, kam zgjedhur tre fragmente mjaft t\u00eb qarta:<\/p>\n<p><\/p>\n<ul>\n<li>karaktere q\u00eb injorohen krejtesisht<\/li>\n<li>karaktere ekuivalente me numrin tre n\u00eb dy nivelet e para<\/li>\n<li>fillimi i alfabetit cirilik, i cili nuk p\u00ebrmban shenja diakritike, dhe prandaj renditet, kryesisht, sipas niveleve t\u00eb para dhe t\u00eb treta.<\/li>\n<\/ul>\n<p><\/p>\n<pre><code class=\"plaintext\">order_start forward;forward;forward;forward,position\n IGNORE;IGNORE;IGNORE;IGNORE % NULL (n\u00eb 6429)\n IGNORE;IGNORE;IGNORE;IGNORE % FILLIMI I TITULLIT (n\u00eb 6429)\n IGNORE;IGNORE;IGNORE;IGNORE % FILLIMI I TEKSTIT (n\u00eb 6429)\n...\n ;;; % NUMRI TRE\n ;;; % NUMRI TRE ME GJAT\u00cbSI T\u00cb PLOTE\n ;;; % NUMRI TRE N\u00cb PRAN\u00cb\n ;;; % NUMRI TRE ME PIK\u00cb\n ;;<FONT>; % NUMRI TRE ME BOLD MATHEMATIK\n...\n ;;; % LETRA E VOLE CIRILIKE A\n ;;; % LETRA KOKE CIRILIKE A\n ;;; % LETRA E VOLE CIRILIKE A ME BREVE\n ;;; % LETRA E VOLE CIRILIKE A ME BREVE\n...\n ;;; % LETRA E VOLE CIRILIKE BE\n ;;; % LETRA KOKE CIRILIKE BE\n ;;; % LETRA E VOLE CIRILIKE VE\n ;;; % LETRA KOKE CIRILIKE VE\n...\norder_end<\/code><\/pre>\n<p><\/p>\n<p>Tani \u00ebsht\u00eb koha p\u00ebr t\u00eb rikthyer v\u00ebmendjen n\u00eb renditjen e shembujve nga fillimi i artikullit. Problemi fshihet n\u00eb k\u00ebt\u00eb pjes\u00eb t\u00eb tabel\u00ebs s\u00eb peshave:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">INJORO; INJORO; INJORO; % HAP\n INJORO; INJORO; INJORO; % SHENJ\u00cb NGRITJE\n INJORO; INJORO; INJORO; % SHENJ\u00cb CITIMI\n...<\/code><\/pre>\n<p><\/p>\n<p>\u00cbsht\u00eb e dukshme se n\u00eb k\u00ebt\u00eb tabel\u00eb shenjat e pik\u00ebsimit vijn\u00eb nga tabela. <em>ASCII<\/em> (duke p\u00ebrfshir\u00eb hap\u00ebsir\u00ebn) kur krahasoni vargjet zakonisht injorohen. Rastet e vetme jan\u00eb ato vargje q\u00eb p\u00ebrputhen plot\u00ebsisht, p\u00ebrve\u00e7 shenjave t\u00eb pik\u00ebsimit q\u00eb ndodhen n\u00eb pozita p\u00ebrputh\u00ebse. Vargjet nga shembulli im (pas renditjes) p\u00ebr algoritmin e krahasimit duken k\u00ebshtu:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">AbakanovMihailpiktor\nJolkinaEllaekraniste\nIvanovaAllamalpiktor\nIvanovAndreypun\u00ebtor druri<\/code><\/pre>\n<p><\/p>\n<p>Duke konsideruar se n\u00eb tabel\u00ebn e peshave shkronjat e m\u00ebdha n\u00eb gjuh\u00ebn ruse vijn\u00eb pas atyre t\u00eb vogla (n\u00eb nivelin e tret\u00eb. <em>&lt;CAP&gt;<\/em> m\u00eb t\u00eb r\u00ebnda se <em>&lt;MIN&gt;<\/em>), renditja duket krejt\u00ebsisht e sakt\u00eb.<\/p>\n<p><\/p>\n<p>Kur vendosni variablin <em>LC_COLLATE=C<\/em> ngarkohet nj\u00eb tabel\u00eb speciale q\u00eb p\u00ebrcakton krahasimin byte p\u00ebr byte<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">static const uint32_t collseqwc[] =\n{\n  8, 1, 8, 0x0, 0xff,\n  \/* tabela e par\u00eb * \/\n  6 * sizeof (uint32_t),\n  \/* tabela e dyt\u00eb * \/\n  7 * sizeof (uint32_t),\n  \/* tabela e tret\u00eb * \/\n  L'x00', L'x01', L'x02', L'x03', L'x04', L'x05', L'x06', L'x07',\n  L'x08', L'x09', L'x0a', L'x0b', L'x0c', L'x0d', L'x0e', L'x0f',\n\n...\n  L'xf8', L'xf9', L'xfa', L'xfb', L'xfc', L'xfd', L'fe', L'xff'\n};<\/code><\/pre>\n<p><\/p>\n<p>Duke pasur parasysh se n\u00eb Unicode pika koduese \u0451 \u00ebsht\u00eb para A, k\u00ebshtu q\u00eb dhe vargjet renditen n\u00eb p\u00ebrputhje.<\/p>\n<p><\/p>\n<h1 id=\"tekstovye-i-dvoichnye-tablicy\">Tabelat tekstuale dhe binare<\/h1>\n<p><\/p>\n<p>Sigurisht, krahasimi i vargjeve \u00ebsht\u00eb nj\u00eb operacion q\u00eb ndodh shum\u00eb shpesh, nd\u00ebrsa analizimi i tabel\u00ebs <em>CTT<\/em> \u00ebsht\u00eb nj\u00eb procedur\u00eb mjaft e kushtueshme. P\u00ebr optimizimin e aksesit n\u00eb tabel\u00eb, ajo kompiloohet n\u00eb nj\u00eb form\u00eb binare me komand\u00ebn <em>localedef<\/em>.<\/p>\n<p><\/p>\n<p>Ekipa <em>localedef<\/em> pranimi i sked\u00ebs me tabel\u00ebn e karakteristikave komb\u00ebtare (opsioni <em>-i<\/em>), n\u00eb t\u00eb cil\u00ebn t\u00eb gjith\u00eb karakteret paraqiten me pika Unicode, dhe sked\u00ebs s\u00eb p\u00ebrputhjes s\u00eb pikave Unicode me kodimin p\u00ebrkat\u00ebs (opsioni <em>--follow<\/em>). Si rezultat i procesit krijohen skedar\u00eb binar\u00eb p\u00ebr lokalitetin, me emrin e caktuar n\u00eb parametrin e fundit.<\/p>\n<p><\/p>\n<p><em>Glibc<\/em> mb\u00ebshtet dy formate skedar\u00ebsh binar\u00eb: &quot;tradicional&quot; dhe &quot;modern&quot;.<\/p>\n<p><\/p>\n<p>Formati tradicional n\u00ebnkupton se emri i lokalitetit \u00ebsht\u00eb emri i nj\u00eb n\u00ebnfolderi n\u00eb <em>\/usr\/lib\/locale\/<\/em>. N\u00eb k\u00ebt\u00eb n\u00ebnfolder ruhen skedar\u00ebt binar\u00eb <em>LC_COLLATE<\/em>, <em>LC_CTYPE<\/em>, <em>LC_TIME<\/em> etj. Skedari <em>LC_IDENTIFICATION<\/em> p\u00ebrmban emrin formal t\u00eb lokalitetit (i cili mund t\u00eb ndryshoj\u00eb nga emri i folderit) dhe komente.<\/p>\n<p><\/p>\n<p>Formati modern supozon ruajtjen e t\u00eb gjitha lokaliteteve n\u00eb nj\u00eb arkiv t\u00eb vet\u00ebm <em>\/usr\/lib\/locale\/locale-archive<\/em>, i cili mapohet n\u00eb memorin\u00eb virtuale t\u00eb t\u00eb gjith\u00eb proceseve q\u00eb e p\u00ebrdorin. <em>glibc<\/em>. Emri i lokalit n\u00eb formatin modern i n\u00ebnshtrohet nj\u00eb kanonizimi t\u00eb caktuar \u2014 n\u00eb emrat e kodimeve mbeten vet\u00ebm numrat dhe shkronjat, t\u00eb sjella n\u00eb format t\u00eb vog\u00ebl. K\u00ebshtu <em>ru_RU.KOI8-R<\/em>, do t\u00eb ruhet si <em>ru_RU.koi8r<\/em>.<\/p>\n<p><\/p>\n<p>Skedar\u00ebt hyr\u00ebs k\u00ebrkohen n\u00eb katalogun aktual, si dhe n\u00eb katalog\u00ebt <em>\/usr\/share\/i18n\/locales\/<\/em> dhe <em>\/usr\/share\/i18n\/charmaps\/<\/em> p\u00ebr skedar\u00ebt <em>CTT<\/em> dhe skedar\u00ebt e kodimeve p\u00ebrkat\u00ebsisht.<\/p>\n<p><\/p>\n<p>P\u00ebr shembull, komanda<\/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>do t\u00eb kompiloj\u00eb skedarin <em>\/usr\/share\/i18n\/locales\/ru_RU<\/em> duke p\u00ebrdorur skedarin e kodimit <em>\/usr\/share\/i18n\/charmaps\/MAC-CYRILLIC.gz<\/em> dhe do ta ruaj\u00eb rezultatin n\u00eb <em>\/usr\/lib\/locale\/locale-archive<\/em> me emrin <em>ru_RU.maccyrillic<\/em><\/p>\n<p><\/p>\n<p>N\u00ebse vendosni variabl\u00ebn <em>LANG=en_US.UTF-8<\/em> at\u00ebher\u00eb <em>glibc<\/em> do t\u00eb k\u00ebrkoj\u00eb skedar\u00eb binar\u00eb t\u00eb lokaliteteve n\u00eb k\u00ebt\u00eb rend p\u00ebr skedar\u00ebt dhe katalog\u00ebt:<\/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>N\u00ebse lokaliteti shfaqet si n\u00eb formatet tradicionale ashtu edhe n\u00eb ato moderne, p\u00ebrpar\u00ebsia i jepet atij modernit.<\/p>\n<p><\/p>\n<p>Lista e lokaliteteve t\u00eb kompiluar mund t\u00eb shikohet me komand\u00ebn <em>locale -a<\/em>.<\/p>\n<p><\/p>\n<h1 id=\"podgotovka-svoey-tablicy-sravneniya\">P\u00ebrgatitja e tabel\u00ebs tuaj t\u00eb krahasimit<\/h1>\n<p><\/p>\n<p>Tani, me njohurit\u00eb e fituara, mund t\u00eb krijoni tabel\u00ebn tuaj ideale t\u00eb krahasimit t\u00eb vargjeve. Kjo tabel\u00eb duhet t\u00eb krahasoj\u00eb sakt\u00ebsisht shkronjat ruse, duke p\u00ebrfshir\u00eb shkronj\u00ebn \u0401, dhe gjithashtu duhet t\u00eb marr\u00eb parasysh shenjat e pik\u00ebsimit n\u00eb p\u00ebrputhje me tabel\u00ebn <em>ASCII<\/em>.<\/p>\n<p><\/p>\n<p>Procesi i p\u00ebrgatitjes s\u00eb tabel\u00ebs tuaj t\u00eb renditjes p\u00ebrb\u00ebhet nga dy etapa: redaktimi i tabel\u00ebs s\u00eb peshave dhe kompaktimi i saj n\u00eb form\u00eb binar me komand\u00ebn <em>localedef<\/em>.<\/p>\n<p><\/p>\n<p>P\u00ebr t\u00eb p\u00ebrshtatur tabel\u00ebn e krahasimit me minimumin e kostove p\u00ebr redaktim, n\u00eb formatin <em>ISO 14652<\/em> parashikohen seksione p\u00ebr korrigjimin e peshave t\u00eb tabel\u00ebs ekzistuese. Seksioni fillon me fjal\u00ebn ky\u00e7e <em>reorder-after<\/em> dhe tregimi i pozicionit, pas t\u00eb cilit b\u00ebhet z\u00ebvend\u00ebsimi. Seksioni p\u00ebrfundon me rrjeshtin <em>reorder-end<\/em>. N\u00ebse \u00ebsht\u00eb e nevojshme t\u00eb rregulloni disa pjes\u00eb t\u00eb tabel\u00ebs, krijohet nj\u00eb seksion p\u00ebr \u00e7do pjes\u00eb t\u00eb till\u00eb.<\/p>\n<p><\/p>\n<p>Kam kopjuar versionet e reja t\u00eb skedar\u00ebve <em>iso14651_t1_common<\/em> dhe <em>ru_RU<\/em> nga repozitori <em>glibc<\/em> n\u00eb katalogun tim t\u00eb sht\u00ebpis\u00eb ~\/ .local\/ share\/ i18n\/ locales\/ dhe pak e redaktova seksionin <em>LC_COLLATE<\/em> n\u00eb <em>ru_RU<\/em>. Versionet e reja t\u00eb skedar\u00ebve jan\u00eb plot\u00ebsisht t\u00eb p\u00ebrshtatshme me versionin tim. <em>glibc<\/em>N\u00ebse d\u00ebshironi t\u00eb p\u00ebrdorni versionet e vjetra t\u00eb skedar\u00ebve, do t'ju duhet t\u00eb ndryshoni emrat simbolik\u00eb dhe vendin ku fillon z\u00ebvend\u00ebsimi n\u00eb tabel\u00eb.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">LC_COLLATE\n% Kopjoni shabllonin nga ISO\/IEC 14651\nkopjoni &quot;iso14651_t1&quot;\nriordoni-pas &lt;U000D&gt;\n&lt;U0020&gt; &lt;S0020&gt;;&lt;BAZ\u00cb&gt;;&lt;MIN&gt;;&lt;U0020&gt; % HAPSI\n&lt;U0021&gt; &lt;S0021&gt;;&lt;BAZ\u00cb&gt;;&lt;MIN&gt;;&lt;U0021&gt; % SHENJA E KREJT\u00cbS\n&lt;U0022&gt; &lt;S0022&gt;;&lt;BAZ\u00cb&gt;;&lt;MIN&gt;;&lt;U0022&gt; % SHENJA CITUARE\n...\n&lt;U007D&gt; &lt;S007D&gt;;&lt;BAZ\u00cb&gt;;&lt;MIN&gt;;&lt;U007D&gt; % KURORA E DJATHT\u00cb\n&lt;U007E&gt; &lt;S007E&gt;;&lt;BAZ\u00cb&gt;;&lt;MIN&gt;;&lt;U007E&gt; % TILDA\nriordoni-fund\nEND LC_COLLATE<\/code><\/pre>\n<p><\/p>\n<p>N\u00eb t\u00eb v\u00ebrtet\u00eb, duhej t\u00eb kishim ndryshuar fushat n\u00eb <em>LC_IDENTIFICATION<\/em> n\u00eb m\u00ebnyr\u00eb q\u00eb ato t\u00eb p\u00ebrcaktonin lokalitetin <em>sq_MY<\/em>, por n\u00eb shembullin tim kjo nuk ishte e nevojshme, pasi e hoqa nga k\u00ebrkimi lokalitetin e arkivuar <em>locale-archive<\/em>.<\/p>\n<p><\/p>\n<p>P\u00ebr <em>localedef<\/em> punoja me skedar\u00ebt n\u00eb dosjen time p\u00ebrmes variabl\u00ebs <em>I18NPATH<\/em> mund t\u00eb shtoni nj\u00eb katalog t\u00eb m\u00ebtejsh\u00ebm p\u00ebr t\u00eb k\u00ebrkuar skedar\u00ebt hyr\u00ebs, dhe katalogu p\u00ebr ruajtjen e skedar\u00ebve binar\u00eb mund t\u00eb p\u00ebrcaktohet si nj\u00eb rrug\u00eb me shqiponja:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; I18NPATH=~\\\/..local\\\/share\\\/i18n localedef -i sq_RU -f UTF-8 ~\\\/..local\\\/lib\\\/locale\\\/sq_MY.UTF-8<\/code><\/pre>\n<p><\/p>\n<p><em>POSIX<\/em> percepton se n\u00eb <em>LANG<\/em> mund t\u00eb shkruhen rrug\u00eb absolute p\u00ebr katalog\u00ebt me skedar\u00eb lokalizimi q\u00eb fillojn\u00eb me nj\u00eb shqiponj\u00eb, por <em>glibc<\/em> n\u00eb <em>Linux<\/em> t\u00eb gjitha rrug\u00ebt llogariten nga katalogu baz\u00eb, q\u00eb mund t\u00eb tejkaloj\u00eb n\u00ebp\u00ebrmjet variabl\u00ebs <em>LOCPATH<\/em>. Pas vendosjes <em>LOCPATH=~\\\/..local\\\/lib\\\/locale\\\/<\/em> t\u00eb gjitha skedaret q\u00eb lidhen me lokalizimin do t\u00eb k\u00ebrkohen vet\u00ebm n\u00eb dosjen time. Arkiva e lokaliteteve me variabl\u00ebn e vendosur <em>LOCPATH<\/em> neglizhohet.<\/p>\n<p><\/p>\n<p>Ja testi vendimtar:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; LANG=sq_MY.UTF-8 LOCPATH=~\\\/..local\\\/lib\\\/locale\\\/ sort buhg.txt\nAbakanov Mihail;piktor\nJolkina Ella;kranok\nIvanov Andrey;gazetar\nIvanova Alla;avokate<\/code><\/pre>\n<p><\/p>\n<p>T\u00eb lumt\u00eb! E b\u00ebm\u00eb k\u00ebt\u00eb!<\/p>\n<p><\/p>\n<h1 id=\"rabota-nad-oshibkami\">Rregullimi i gabimeve<\/h1>\n<p><\/p>\n<p>Kam p\u00ebrgjigjur tashm\u00eb n\u00eb pyetjet rreth renditjes s\u00eb rreshtave, t\u00eb shtruara n\u00eb fillim, por kan\u00eb mbetur disa pyetje rreth gabimeve - t\u00eb dukshme dhe t\u00eb padukshme.<\/p>\n<p><\/p>\n<p>Kthehemi n\u00eb detyr\u00ebn fillestare.<\/p>\n<p><\/p>\n<p>Dhe programi <em>sort<\/em> dhe programi <em>bashkohu<\/em> p\u00ebrdorin t\u00eb nj\u00ebjtat funksione krahasimi t\u00eb rreshtave nga <em>glibc<\/em>. Si ndodhi q\u00eb <em>bashkohu<\/em> jepte nj\u00eb gabim n\u00eb renditje p\u00ebr rreshtat e renditur nga komanda <em>sort<\/em> n\u00eb lokalitetin <em>en_US.UTF-8<\/em>? \u041e\u0442\u0432\u0435\u0442 \u043f\u0440\u043e\u0441\u0442: <em>sort<\/em> krahason rreshtin n\u00eb t\u00ebr\u00ebsi, nd\u00ebrsa <em>bashkohu<\/em> krahason vet\u00ebm \u00e7el\u00ebsin, i cili p\u00ebr default \u00ebsht\u00eb fillimi i rreshtit deri n\u00eb simbolin e par\u00eb t\u00eb bardh\u00eb. N\u00eb shembullin tim, kjo \u00e7oi n\u00eb nj\u00eb mesazh gabimi pasi renditja e fjal\u00ebve t\u00eb para n\u00eb rreshta nuk p\u00ebrputhej me renditjen e rreshtave t\u00eb plota.<\/p>\n<p><\/p>\n<p>Lokaliteti <em>&quot;C&quot;<\/em> garanton q\u00eb n\u00eb rreshtat e renditur, n\u00ebnstringat fillestare deri n\u00eb hap\u00ebsir\u00ebn e par\u00eb gjithashtu do t\u00eb jen\u00eb t\u00eb renditura, por kjo vet\u00ebm maske nj\u00eb gabim. Mund t\u00eb zgjidhen t\u00eb dh\u00ebna t\u00eb tilla (persona me mbiemra t\u00eb nj\u00ebjt\u00eb, por me emra t\u00eb ndrysh\u00ebm), t\u00eb cilat pa nj\u00eb mesazh gabimi do t\u00eb jepnin rezultate t\u00eb gabuara n\u00eb bashkimin e skedar\u00ebve. N\u00ebse duam q\u00eb <em>bashkohu<\/em> t\u00eb bashkoj\u00eb rreshtat e skedar\u00ebve sipas emri mbiemri, at\u00ebher\u00eb m\u00ebnyra e duhur do t\u00eb ishte t\u00eb tregohej qart\u00eb ndar\u00ebsi i fushave dhe renditja sipas fush\u00ebs ky\u00e7, e jo sipas t\u00ebr\u00eb rreshtit. N\u00eb k\u00ebt\u00eb rast dhe bashkimi do t\u00eb kaloj\u00eb n\u00eb m\u00ebnyr\u00eb t\u00eb drejt\u00eb dhe nuk do t\u00eb ket\u00eb gabime n\u00eb asnj\u00eb lokalitet:<\/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; rezultat<\/code><\/pre>\n<p><\/p>\n<p>Shembulli i suksessh\u00ebm n\u00eb kodimin <em>CP1251<\/em> p\u00ebrmban edhe nj\u00eb gabim tjet\u00ebr. E v\u00ebrteta \u00ebsht\u00eb q\u00eb n\u00eb t\u00eb gjitha shp\u00ebrndarjet q\u00eb njoh <em>Linux<\/em> n\u00eb paketat mungon lokaliteti i kompiluar <em>ru_RU.CP1251<\/em>. N\u00ebse lokaliteti i kompiluar nuk gjendet, at\u00ebher\u00eb <em>sort<\/em> n\u00eb heshtje p\u00ebrdor krahasimin byte, q\u00eb ne e v\u00ebrejm\u00eb.<\/p>\n<p><\/p>\n<p>Dhe, p\u00ebr t'u th\u00ebn\u00eb, ka edhe nj\u00eb gabim t\u00eb vog\u00ebl q\u00eb lidhet me pamund\u00ebsin\u00eb e lokaliteteve t\u00eb kompiluar. Komanda <em>LOCPATH=\/tmp locale -a<\/em> do t\u00eb jap\u00eb nj\u00eb list\u00eb t\u00eb t\u00eb gjith\u00eb lokaliteteve n\u00eb <em>locale-archive<\/em>, por me variablin e vendosur <em>LOCPATH<\/em> p\u00ebr t\u00eb gjitha programet (p\u00ebrfshir\u00eb edhe vet\u00eb <em>locale<\/em>) k\u00ebto lokalitete do t\u00eb jen\u00eb t\u00eb pakapshme.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; LOCPATH=\/tmp locale -a | grep en_US\nlocale: Nuk mund t\u00eb caktoj LC_CTYPE n\u00eb lokalitetin e parazgjedhur: Nuk ekziston nj\u00eb skedar ose drejtor\nlocale: Nuk mund t\u00eb caktoj LC_MESSAGES n\u00eb lokalitetin e parazgjedhur: Nuk ekziston nj\u00eb skedar ose drejtor\nlocale: Nuk mund t\u00eb caktoj LC_COLLATE n\u00eb lokalitetin e parazgjedhur: Nuk ekziston nj\u00eb skedar ose drejtor\nen_US\nen_US.iso88591\nen_US.iso885915\nen_US.utf8\n\n$&gt; LC_COLLATE=en_US.UTF-8 sort --debug\nsort: duke p\u00ebrdorur rregullat \u2018en_US.UTF-8\u2019 t\u00eb renditjes\n\n$&gt; LOCPATH=\/tmp LC_COLLATE=en_US.UTF-8 sort --debug\nsort: duke p\u00ebrdorur krahasimin e thjesht\u00eb t\u00eb bajt\u00ebve<\/code><\/pre>\n<p><\/p>\n<h1 id=\"zaklyuchenie\">P\u00ebrfundim<\/h1>\n<p><\/p>\n<p>N\u00ebse je programues q\u00eb je m\u00ebsuar t\u00eb mendosh se rreshtat jan\u00eb nj\u00eb s\u00ebr\u00eb bajt\u00ebsh, at\u00ebher\u00eb zgjedhja jote <em>LC_COLLATE=C<\/em>.<\/p>\n<p><\/p>\n<p>N\u00ebse je nj\u00eb gjuh\u00ebtar ose hartues fjalor\u00ebsh, at\u00ebher\u00eb \u00ebsht\u00eb m\u00eb mir\u00eb t\u00eb kompilosh lokalitetin t\u00ebnd.<\/p>\n<p><\/p>\n<p>N\u00ebse je nj\u00eb p\u00ebrdorues i zakonsh\u00ebm, at\u00ebher\u00eb \u00ebsht\u00eb mjaft t\u00eb m\u00ebsosh se komanda <em>ls -a<\/em> jep skedar\u00eb q\u00eb fillojn\u00eb me pik\u00eb, bashk\u00eb me skedar\u00eb q\u00eb fillojn\u00eb me shkronj\u00eb, dhe <em>Midnight Commander<\/em>, e cila p\u00ebrdor funksionet e veta t\u00eb brendshme p\u00ebr t\u00eb renditur emrat, nxjerr skedar\u00ebt q\u00eb fillojn\u00eb me pik\u00eb n\u00eb fillim t\u00eb list\u00ebs.<\/p>\n<p><\/p>\n<h1 id=\"ssylki\">Linket<\/h1>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/unicode.org\/reports\/tr10\/\">Raporti Nr.10 algoritmi i renditjes s\u00eb Unicode <\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/www.unicode.org\/Public\/UCA\/latest\/allkeys.txt\">Peshat e simboleve n\u00eb 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 implementimi i bibliotek\u00ebs p\u00ebr pun\u00eb me Unicode nga IBM. <\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/demo.icu-project.org\/icu-bin\/collation.html\">Testi i renditjes me <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\">Peshat e simboleve n\u00eb <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\">P\u00ebrshkrimi i formatit t\u00eb skedarit me peshat <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\">Diskutimi mbi krahasimin e rreshtave n\u00eb <em>glibc<\/em><\/a><\/noindex><\/p>\n<p>Burimi: <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.2 - 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\/sq\/blog\/administrirovanie\/kak-linuxovskij-sort-sortiruet-stroki\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\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\/sq\/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\udd47Si Linux'i sort rendit vargjet | ProHoster","description":"Hyrja \u00c7do gj\u00eb filloi me nj\u00eb skript t\u00eb shkurt\u00ebr q\u00eb duhej t\u00eb bashkonte informacionin mbi adresat e e-mailit t\u00eb punonj\u00ebsve, t\u00eb marra nga lista e p\u00ebrdoruesve t\u00eb d\u00ebrgimit t\u00eb post\u00ebs, me.","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/kak-linuxovskij-sort-sortiruet-stroki","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sq_AL","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\/sq\/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\/sq\/wp-json\/wp\/v2\/posts\/83055","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=83055"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/83055\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=83055"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=83055"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=83055"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}