{"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\/cs\/blog\/administrirovanie\/kak-linuxovskij-sort-sortiruet-stroki","title":{"rendered":"Jak linuxov\u00fd sort \u0159ad\u00ed \u0159et\u011bzce","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h1 id=\"vvedenie\">\u00davod<\/h1>\n<p><\/p>\n<p>V\u0161e za\u010dalo kr\u00e1tk\u00fdm skriptem, kter\u00fd m\u011bl slou\u010dit informace o adres\u00e1ch <em>e-mail<\/em> zam\u011bstnanc\u016f, z\u00edskan\u00fdch ze seznamu u\u017eivatel\u016f e-mailov\u00e9ho zpravodaje, s pozicemi zam\u011bstnanc\u016f, kter\u00e9 byly z\u00edsk\u00e1ny z datab\u00e1ze person\u00e1ln\u00edho odd\u011blen\u00ed. Ob\u011b seznamy byly exportov\u00e1ny do textov\u00fdch soubor\u016f v k\u00f3dov\u00e1n\u00ed Unicode <em>UTF-8<\/em> a ulo\u017eeny s unixov\u00fdmi konci \u0159\u00e1dk\u016f.<\/p>\n<p><\/p>\n<p>Obsah <em>mail.txt<\/em><\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Ivanov Andrej;ia@example.com<\/code><\/pre>\n<p><\/p>\n<p>Obsah <em>buhg.txt<\/em><\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Ivanova Alla;mal\u00ed\u0159\nJolkina Ella;je\u0159\u00e1bnice\nIvanov Andrej;zedn\u00edk\nAbakanov Michail;mal\u00ed\u0159<\/code><\/pre>\n<p><\/p>\n<p>Pro slou\u010den\u00ed byly soubory se\u0159azeny unixov\u00fdm p\u0159\u00edkazem <em>sort<\/em> a p\u0159ed\u00e1ny do unixov\u00e9ho programu <em>p\u0159ipojit<\/em>, kter\u00fd n\u00e1hle skon\u010dil s chybou: <\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt;&gt; sort buhg.txt &gt; buhg.srt\n$&gt;&gt; sort mail.txt &gt; mail.srt\n$&gt;&gt; join buhg.srt mail.srt &gt; result\njoin: buhg.srt:4: nen\u00ed se\u0159azeno: Ivanov Andrej;zedn\u00edk<\/code><\/pre>\n<p><\/p>\n<p>N\u00e1hled v\u00fdsledku t\u0159\u00edd\u011bn\u00ed uk\u00e1zal, \u017ee celkov\u011b je t\u0159\u00edd\u011bn\u00ed spr\u00e1vn\u00e9, ale v p\u0159\u00edpad\u011b shody mu\u017esk\u00fdch a \u017eensk\u00fdch p\u0159\u00edjmen\u00ed, \u017eensk\u00e1 p\u0159\u00edjmen\u00ed jsou p\u0159ed mu\u017esk\u00fdmi:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt;&gt; sort buhg.txt\nAbakanov Michail;mal\u00ed\u0159\nJolkina Ella;je\u0159\u00e1bnice\nIvanova Alla;mal\u00ed\u0159\nIvanov Andrej;zedn\u00edk<\/code><\/pre>\n<p><\/p>\n<p>Vypad\u00e1 to jako chyba t\u0159\u00edd\u011bn\u00ed v Unicode nebo jako projev feminismu v algoritmu t\u0159\u00edd\u011bn\u00ed. Prvn\u00ed mo\u017enost je samoz\u0159ejm\u011b pravd\u011bpodobn\u011bj\u0161\u00ed.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Na chv\u00edli to odlo\u017e\u00edme <em>p\u0159ipojit<\/em> a soust\u0159ed\u00edme se na <em>sort<\/em>. Zkus\u00edme vy\u0159e\u0161it probl\u00e9m metodou pokus-omyl. Pro za\u010d\u00e1tek zm\u011bn\u00edme lokalitu z <em>en_US<\/em> na <em>ru_RU<\/em>. Pro t\u0159\u00edd\u011bn\u00ed by sta\u010dilo nastavit prom\u011bnnou prost\u0159ed\u00ed <em>LC_COLLATE<\/em>, ale nebudeme se \u0161et\u0159it:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt;&gt; LANG=ru_RU.UTF-8 sort buhg.txt\nAbakanov Michail;mal\u00ed\u0159\nJolkina Ella;je\u0159\u00e1bnice\nIvanova Alla;mal\u00ed\u0159\nIvanov Andrej;zedn\u00edk<\/code><\/pre>\n<p><\/p>\n<p>Nic se nezm\u011bnilo.<\/p>\n<p><\/p>\n<p>Zkus\u00edme p\u0159ek\u00f3dovat soubory do jednovbajtov\u00e9ho k\u00f3dov\u00e1n\u00ed: <\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt;&gt; iconv -f UTF-8 -t KOI8-R buhg.txt \n | LANG=ru_RU.KOI8-R sort \n | iconv -f KOI8-R -t UTF8<\/code><\/pre>\n<p><\/p>\n<p>Op\u011bt se nic nezm\u011bnilo.<\/p>\n<p><\/p>\n<p>Nezb\u00fdv\u00e1 ne\u017e hledat \u0159e\u0161en\u00ed na internetu. O rusk\u00fdch p\u0159\u00edjmen\u00edch sice nic nen\u00ed, ale existuj\u00ed ot\u00e1zky ohledn\u011b jin\u00fdch podivnost\u00ed v t\u0159\u00edd\u011bn\u00ed. Nap\u0159\u00edklad takov\u00fd probl\u00e9m: <noindex><a rel=\"nofollow\" href=\"https:\/\/serverfault.com\/questions\/95579\/unix-sort-treats-dash-characters-as-invisible\/95593\">unix sort pova\u017euje znaky \u201e-\u201c (poml\u010dku) za neviditeln\u00e9<\/a><\/noindex>. Stru\u010dn\u011b \u0159e\u010deno, \u0159et\u011bzce \"a-b\", \"aa\", \"ac\" jsou se\u0159azeny jako \"aa\", \"a-b\", \"ac\".<\/p>\n<p><\/p>\n<p>Odpov\u011b\u010f je v\u0161ude standardn\u00ed: pou\u017eijte program\u00e1torskou lokalitu <em>\"C\"<\/em> a bude v\u00e1m zle. Zkou\u0161\u00edme:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt;&gt; LANG=C sort buhg.txt\nJolkina Ella;je\u0159\u00e1bnice\nAbakanov Michail;mal\u00ed\u0159\nIvanov Andrej;zedn\u00edk\nIvanova Alla;advok\u00e1t<\/code><\/pre>\n<p><\/p>\n<p>N\u011bco se zm\u011bnilo. Ivanovovi se \u0159adili ve spr\u00e1vn\u00e9m po\u0159ad\u00ed, ale Jolkina n\u011bkam zmizela. Vrac\u00edme se k p\u016fvodn\u00edmu \u00fakolu:<\/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>Pracovalo to bez chyb, tak jak sliboval internet. A to i p\u0159es Jolkina v prvn\u00edm \u0159\u00e1dku.<\/p>\n<p><\/p>\n<p>Probl\u00e9m se zd\u00e1 b\u00fdt vy\u0159e\u0161en, ale pro jistotu zkus\u00edme je\u0161t\u011b jedno rusk\u00e9 k\u00f3dov\u00e1n\u00ed \u2014 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>V\u00fdsledek t\u0159\u00edd\u011bn\u00ed, jak se ukazuje, odpov\u00edd\u00e1 lokalit\u011b. <em>\"C\"<\/em>, a cel\u00fd p\u0159\u00edklad proch\u00e1z\u00ed bez chyb. Je to n\u011bjak\u00e1 mystika.<\/p>\n<p><\/p>\n<p>Nem\u00e1m r\u00e1d mystiku v programov\u00e1n\u00ed, proto\u017ee obvykle maskuje chyby. Budu se muset v\u00e1\u017en\u011b zab\u00fdvat ot\u00e1zkou, jak to funguje <em>sort<\/em> a na co to m\u00e1 vliv. <em>LC_COLLATE<\/em> .<\/p>\n<p><\/p>\n<p>Na konci se pokus\u00edm odpov\u011bd\u011bt na ot\u00e1zky:<\/p>\n<p><\/p>\n<ul>\n<li>pro\u010d se nespr\u00e1vn\u011b t\u0159\u00eddily \u017eensk\u00e9 p\u0159\u00edjmen\u00ed.<\/li>\n<li>pro\u010d <em>LANG=ru_RU.CP1251<\/em> se uk\u00e1zalo jako ekvivalent. <em>LANG=C<\/em><\/li>\n<li>pro\u010d maj\u00ed <em>sort<\/em> a <em>p\u0159ipojit<\/em> r\u016fzn\u00e9 p\u0159edstavy o po\u0159ad\u00ed se\u0159azen\u00fdch \u0159et\u011bzc\u016f.<\/li>\n<li>pro\u010d jsou ve v\u0161ech m\u00fdch p\u0159\u00edkladech chyby.<\/li>\n<li>nakonec, jak t\u0159\u00eddit \u0159et\u011bzce podle sv\u00e9ho vkusu.<\/li>\n<\/ul>\n<p><\/p>\n<h1 id=\"sortirovka-v-yunikode\">T\u0159\u00edd\u011bn\u00ed v Unicode.<\/h1>\n<p><\/p>\n<p>Prvn\u00ed zast\u00e1vkou bude technick\u00e1 zpr\u00e1va \u010d. 10 s n\u00e1zvem <noindex><a rel=\"nofollow\" href=\"https:\/\/unicode.org\/reports\/tr10\/\">Unicode collation algorithm.<\/a><\/noindex> na webu <noindex><a rel=\"nofollow\" href=\"https:\/\/unicode.org\">unicode.org<\/a><\/noindex>. Zpr\u00e1va obsahuje mnoho technick\u00fdch detail\u016f, tak\u017ee si dovol\u00edm uv\u00e9st shrnut\u00ed hlavn\u00edch my\u0161lenek.<\/p>\n<p><\/p>\n<p><em>Se\u0159azen\u00ed<\/em> \u2014 \"porovn\u00e1n\u00ed\" \u0159et\u011bzc\u016f je z\u00e1kladem jak\u00e9hokoliv algoritmu t\u0159\u00edd\u011bn\u00ed. Samotn\u00e9 algoritmy se mohou li\u0161it (nap\u0159. \"bubblov\u00fd\", \"slou\u010den\u00edm\", \"rychl\u00fd\"), ale v\u0161echny pou\u017e\u00edvaj\u00ed porovn\u00e1n\u00ed dvojice \u0159et\u011bzc\u016f k ur\u010den\u00ed jejich po\u0159ad\u00ed.<\/p>\n<p><\/p>\n<p>T\u0159\u00edd\u011bn\u00ed \u0159et\u011bzc\u016f v p\u0159irozen\u00e9m jazyce je docela slo\u017eit\u00fd probl\u00e9m. Dokonce i v nejjednodu\u0161\u0161\u00edch jedno-bajtov\u00fdch k\u00f3dov\u00e1n\u00edch se po\u0159ad\u00ed p\u00edsmen v abeced\u011b, kter\u00e9 se alespo\u0148 trochu li\u0161\u00ed od anglick\u00e9ho p\u00edsma, u\u017e nebude shodovat s po\u0159ad\u00edm \u010d\u00edseln\u00fdch hodnot, jimi\u017e jsou tato p\u00edsmena zak\u00f3dov\u00e1na. Tak v n\u011bmeck\u00e9 abeced\u011b p\u00edsmeno <em>\u00d6<\/em> se nach\u00e1z\u00ed mezi <em>O<\/em> a <em>redicted Frame)<\/em>, a v k\u00f3dov\u00e1n\u00ed <em>CP850<\/em> se dost\u00e1v\u00e1 mezi <em>\u00ff<\/em> a <em>\u00dc<\/em>.<\/p>\n<p><\/p>\n<p>M\u016f\u017eeme se pokusit abstrahovat od konkr\u00e9tn\u00ed k\u00f3dov\u00e1n\u00ed a pova\u017eovat \"ide\u00e1ln\u00ed\" znaky, kter\u00e9 jsou uspo\u0159\u00e1d\u00e1ny v ur\u010dit\u00e9m po\u0159ad\u00ed, jak je to ud\u011bl\u00e1no v Unicode. K\u00f3dov\u00e1n\u00ed <em>UTF8<\/em>, <em>UTF16<\/em> nebo jedno-bajtov\u00e1 <em>KOI8-R<\/em> (pokud pot\u0159ebujete omezen\u00e9 podmno\u017einy Unicode) budou poskytovat r\u016fzn\u00e1 \u010d\u00edseln\u00e1 zobrazen\u00ed p\u00edsmen, ale budou se odvol\u00e1vat na stejn\u00e9 prvky z\u00e1kladn\u00ed tabulky. <\/p>\n<p><\/p>\n<p>Zd\u00e1 se, \u017ee i kdy\u017e vytvo\u0159\u00edme tabulku znak\u016f od z\u00e1klad\u016f, nebudeme schopni p\u0159i\u0159adit univerz\u00e1ln\u00ed po\u0159ad\u00ed znak\u016f. V r\u016fzn\u00fdch n\u00e1rodn\u00edch abeced\u00e1ch, kter\u00e9 pou\u017e\u00edvaj\u00ed stejn\u00e9 p\u00edsmena, se po\u0159ad\u00ed t\u011bchto p\u00edsmen m\u016f\u017ee li\u0161it. Nap\u0159\u00edklad ve francouz\u0161tin\u011b <em>\u00c6<\/em> bude pova\u017eov\u00e1no za ligaturu a bude se \u0159adit jako \u0159et\u011bzec <em>AE<\/em>. V norsk\u00e9m jazyce <em>\u00c6<\/em> bude samostatn\u00fdm p\u00edsmenem, kter\u00e9 se nach\u00e1z\u00ed za <em>Z<\/em>. Mimochodem, krom\u011b ligatur typu <em>\u00c6<\/em> existuj\u00ed p\u00edsmena, kter\u00e1 jsou zapisov\u00e1na n\u011bkolika znaky. Tak v \u010desk\u00e9 abeced\u011b existuje p\u00edsmeno <em>Ch<\/em>, kter\u00e9 je mezi <em>H<\/em> a <em>I<\/em>.<\/p>\n<p><\/p>\n<p>Krom\u011b rozd\u00edl\u016f v abeced\u00e1ch existuj\u00ed tak\u00e9 jin\u00e9 n\u00e1rodn\u00ed tradice, kter\u00e9 ovliv\u0148uj\u00ed \u0159azen\u00ed. Konkr\u00e9tn\u011b se objevuje ot\u00e1zka: v jak\u00e9m po\u0159ad\u00ed by m\u011bly n\u00e1sledovat v slovn\u00edku slova skl\u00e1daj\u00edc\u00ed se z velk\u00fdch a mal\u00fdch p\u00edsmen? Na \u0159azen\u00ed mohou m\u00edt tak\u00e9 vliv zvl\u00e1\u0161tnosti pou\u017e\u00edv\u00e1n\u00ed interpunk\u010dn\u00edch znam\u00e9nek. Ve \u0161pan\u011blsk\u00e9m jazyce se na za\u010d\u00e1tku ot\u00e1zkov\u00e9ho v\u00fdroku pou\u017e\u00edv\u00e1 obr\u00e1cen\u00fd otazn\u00edk (<em>\u00bfTe gusta la m\u00fasica?<\/em>). V tomto p\u0159\u00edpad\u011b je z\u0159ejm\u00e9, \u017ee ot\u00e1zkov\u00e9 v\u011bty by nem\u011bly b\u00fdt seskupov\u00e1ny do samostatn\u00e9ho klastru mimo abecedu, ale jak se maj\u00ed \u0159adit \u0159et\u011bzce s jin\u00fdmi interpunk\u010dn\u00edmi znam\u00e9nky?<\/p>\n<p><\/p>\n<p>Nebudu se zab\u00fdvat \u0159azen\u00edm \u0159et\u011bzc\u016f v jazyc\u00edch, kter\u00e9 se v\u00fdrazn\u011b li\u0161\u00ed od evropsk\u00fdch. Upozorn\u00edm, \u017ee v jazyc\u00edch s p\u00edsmem zprava doleva nebo shora dol\u016f jsou znaky ve \u0159et\u011bzc\u00edch pravd\u011bpodobn\u011b ulo\u017eeny v po\u0159ad\u00ed \u010dten\u00ed, a dokonce i v neabecedn\u00edch p\u00edsmech existuj\u00ed vlastn\u00ed zp\u016fsoby znakov\u00e9ho uspo\u0159\u00e1d\u00e1n\u00ed \u0159et\u011bzc\u016f. Nap\u0159\u00edklad, hieroglyfy mohou b\u00fdt \u0159azeny podle tvaru (<noindex><a rel=\"nofollow\" href=\"https:\/\/studychinese.ru\/kljuchi\/\">kl\u00ed\u010de \u010d\u00ednsk\u00fdch hieroglyf\u016f<\/a><\/noindex>) nebo podle v\u00fdslovnosti. Jak by se m\u011bly \u0159adit emoji, up\u0159\u00edmn\u011b \u0159e\u010deno, si nedovedu p\u0159edstavit, ale i pro n\u011b je mo\u017en\u00e9 n\u011bco vymyslet.<\/p>\n<p><\/p>\n<p>Na z\u00e1klad\u011b v\u00fd\u0161e uveden\u00fdch zvl\u00e1\u0161tnost\u00ed byla formulov\u00e1na z\u00e1kladn\u00ed krit\u00e9ria pro porovn\u00e1v\u00e1n\u00ed \u0159et\u011bzc\u016f zalo\u017een\u00fdch na tabulk\u00e1ch Unicode:<\/p>\n<p><\/p>\n<ul>\n<li>porovn\u00e1n\u00ed \u0159et\u011bzc\u016f nez\u00e1vis\u00ed na pozici znak\u016f v k\u00f3dov\u00e9 tabulce;<\/li>\n<li>sekvence znak\u016f, kter\u00e9 tvo\u0159\u00ed jeden jedin\u00fd znak, jsou p\u0159evedeny na kanonickou podobu (<em>A<\/em> + horn\u00ed kole\u010dko je tot\u00e9\u017e jako <em>\u00c5<\/em>);<\/li>\n<li>p\u0159i porovn\u00e1v\u00e1n\u00ed \u0159et\u011bzc\u016f se znak posuzuje v kontextu \u0159et\u011bzce a v p\u0159\u00edpad\u011b pot\u0159eby se spojuje s okoln\u00edmi do jedn\u00e9 jednotky porovn\u00e1n\u00ed (<em>Ch<\/em> v \u010de\u0161tin\u011b) nebo se rozd\u011bluje na n\u011bkolik (<em>\u00c6<\/em> ve francouz\u0161tin\u011b);<\/li>\n<li>V\u0161echny n\u00e1rodn\u00ed specifika (abeceda, velk\u00e1\/mal\u00e1 p\u00edsmena, interpunkce, po\u0159ad\u00ed druh\u016f p\u00edsma) mus\u00ed b\u00fdt nastavena a\u017e na ru\u010dn\u00ed ur\u010den\u00ed po\u0159ad\u00ed (emojis);<\/li>\n<li>Srovn\u00e1n\u00ed je d\u016fle\u017eit\u00e9 nejen pro t\u0159\u00edd\u011bn\u00ed, ale tak\u00e9 na mnoha jin\u00fdch m\u00edstech, nap\u0159\u00edklad pro ur\u010den\u00ed rozsahu \u0159\u00e1dk\u016f (za\u0159azen\u00ed {A\u2026\u042f} v <em>bash<\/em>);<\/li>\n<li>Srovn\u00e1n\u00ed by m\u011blo b\u00fdt prov\u00e1d\u011bno dostate\u010dn\u011b rychle.<\/li>\n<\/ul>\n<p><\/p>\n<p>Krom\u011b toho auto\u0159i zpr\u00e1vy formulovali vlastnosti srovn\u00e1n\u00ed, na kter\u00e9 se v\u00fdvoj\u00e1\u0159i algoritmu nemohou spol\u00e9hat:<\/p>\n<p><\/p>\n<ul>\n<li>Algoritmus srovn\u00e1n\u00ed by nem\u011bl vy\u017eadovat samostatnou sadu znak\u016f pro ka\u017ed\u00fd jazyk (ru\u0161tina a ukrajin\u0161tina spole\u010dn\u011b pou\u017e\u00edvaj\u00ed v\u011bt\u0161inu znak\u016f cyrilice);<\/li>\n<li>Srovn\u00e1n\u00ed by nem\u011blo z\u00e1viset na po\u0159ad\u00ed znak\u016f v tabulk\u00e1ch Unicode;<\/li>\n<li>V\u00e1ha \u0159et\u011bzce by nem\u011bla b\u00fdt atributem \u0159et\u011bzce, proto\u017ee stejn\u00fd \u0159et\u011bzec v r\u016fzn\u00fdch kulturn\u00edch kontextech m\u016f\u017ee m\u00edt r\u016fzn\u00e9 v\u00e1hy;<\/li>\n<li>V\u00e1hy \u0159et\u011bzc\u016f se mohou m\u011bnit p\u0159i slou\u010den\u00ed nebo rozd\u011blen\u00ed (z <em>x<\/em> &lt; <em>y<\/em> to neznamen\u00e1, \u017ee <em>xz<\/em> &lt; <em>yz<\/em>);<\/li>\n<li>Rozd\u00edln\u00e9 \u0159et\u011bzce, kter\u00e9 maj\u00ed stejn\u00e9 v\u00e1hy, se pova\u017euj\u00ed za rovn\u00e9 z pohledu algoritmu t\u0159\u00edd\u011bn\u00ed. Zaveden\u00ed dodate\u010dn\u00e9ho uspo\u0159\u00e1d\u00e1n\u00ed takov\u00fdch \u0159et\u011bzc\u016f je mo\u017en\u00e9, ale m\u016f\u017ee sn\u00ed\u017eit v\u00fdkon;<\/li>\n<li>P\u0159i op\u011btovn\u00fdch t\u0159\u00edd\u011bn\u00edch se \u0159et\u011bzce, kter\u00e9 maj\u00ed stejn\u00e9 v\u00e1hy, mohou m\u011bnit m\u00edsty. Stabilita je vlastnost konkr\u00e9tn\u00edho algoritmu t\u0159\u00edd\u011bn\u00ed, nikoli vlastnost algoritmu srovn\u00e1n\u00ed \u0159et\u011bzc\u016f (viz p\u0159edchoz\u00ed bod);<\/li>\n<li>Pravidla t\u0159\u00edd\u011bn\u00ed se mohou v pr\u016fb\u011bhu \u010dasu m\u011bnit, jak se up\u0159es\u0148uj\u00ed\/zm\u011bn\u00ed kulturn\u00ed tradice.<\/li>\n<\/ul>\n<p><\/p>\n<p>Tak\u00e9 se uv\u00e1d\u00ed, \u017ee algoritmus srovn\u00e1n\u00ed nic nev\u00ed o s\u00e9mantice zpracov\u00e1van\u00fdch \u0159et\u011bzc\u016f. Tak, \u0159et\u011bzce slo\u017een\u00e9 pouze z \u010d\u00edslic by nem\u011bly b\u00fdt srovn\u00e1v\u00e1ny jako \u010d\u00edsla, a v seznamech anglick\u00fdch n\u00e1zv\u016f by nem\u011bl b\u00fdt odstra\u0148ov\u00e1n \u010dlen (<em>Beatles, The<\/em>).<\/p>\n<p><\/p>\n<p>Aby byla spln\u011bna v\u0161echna uveden\u00e1 po\u017eadavky, byl navr\u017een v\u00edcestup\u0148ov\u00fd (v podstat\u011b \u010dty\u0159stup\u0148ov\u00fd) tabulkov\u00fd algoritmus t\u0159\u00edd\u011bn\u00ed.<\/p>\n<p><\/p>\n<p>Nejprve jsou znaky v \u0159et\u011bzci p\u0159evedeny do kanonick\u00e9ho tvaru a seskupeny do jednotek srovn\u00e1n\u00ed. Ka\u017ed\u00e9 jednotce srovn\u00e1n\u00ed jsou p\u0159i\u0159azeny r\u016fzn\u00e9 v\u00e1hy, kter\u00e9 odpov\u00eddaj\u00ed n\u011bkolika \u00farovn\u00edm srovn\u00e1n\u00ed. V\u00e1hy jednotek srovn\u00e1n\u00ed jsou prvky uspo\u0159\u00e1dan\u00fdch mno\u017ein (v tomto p\u0159\u00edpad\u011b cel\u00e1 \u010d\u00edsla), kter\u00e1 lze vz\u00e1jemn\u011b porovn\u00e1vat. Speci\u00e1ln\u00ed hodnota <em>IGNORED<\/em> (0x0) znamen\u00e1, \u017ee na odpov\u00eddaj\u00edc\u00ed \u00farovni porovn\u00e1n\u00ed se tato jednotka v porovn\u00e1n\u00ed ne\u00fa\u010dastn\u00ed. Porovn\u00e1n\u00ed \u0159et\u011bzc\u016f se m\u016f\u017ee opakovat n\u011bkolikr\u00e1t, s pou\u017eit\u00edm vah odpov\u00eddaj\u00edc\u00edch \u00farovn\u00ed. Na ka\u017ed\u00e9 z \u00farovn\u00ed se v\u00e1hy jednotek porovn\u00e1n\u00ed dvou \u0159et\u011bzc\u016f postupn\u011b porovn\u00e1vaj\u00ed mezi sebou.<\/p>\n<p><\/p>\n<p>V r\u016fzn\u00fdch implementac\u00edch algoritmu pro r\u016fzn\u00e9 n\u00e1rodn\u00ed tradice se velikosti koeficient\u016f mohou li\u0161it, ale sou\u010d\u00e1st\u00ed standardu Unicode je z\u00e1kladn\u00ed tabulka vah \u2014 <em>\"Default Unicode Collation Element Table\"<\/em> (<em>DUCET<\/em>). R\u00e1d bych podotkl, \u017ee nastaven\u00ed prom\u011bnn\u00e9 <em>LC_COLLATE<\/em> fakticky p\u0159edstavuje pokyn k v\u00fdb\u011bru tabulky vah ve funkci porovn\u00e1n\u00ed \u0159et\u011bzc\u016f.<\/p>\n<p><\/p>\n<p>V\u00e1hov\u00e9 koeficienty <em>DUCET<\/em> jsou uspo\u0159\u00e1d\u00e1ny takto:<\/p>\n<p><\/p>\n<ul>\n<li>na prvn\u00ed \u00farovni se v\u0161echny p\u00edsmena p\u0159ev\u00e1d\u011bj\u00ed na jeden registr, diakritick\u00e1 znam\u00e9nka se odstra\u0148uj\u00ed, interpunk\u010dn\u00ed znam\u00e9nka (ne v\u0161echna) se ignoruj\u00ed;<\/li>\n<li>na druh\u00e9 \u00farovni se berou v \u00favahu pouze diakritick\u00e1 znam\u00e9nka;<\/li>\n<li>na t\u0159et\u00ed \u00farovni se zohled\u0148uje pouze registr;<\/li>\n<li>na \u010dtvrt\u00e9 \u00farovni se zohled\u0148uj\u00ed pouze interpunk\u010dn\u00ed znam\u00e9nka.<\/li>\n<\/ul>\n<p><\/p>\n<p>Porovn\u00e1n\u00ed prob\u00edh\u00e1 v n\u011bkolika pr\u016fchodech: nejprve se porovn\u00e1vaj\u00ed koeficienty prvn\u00ed \u00farovn\u011b; pokud se v\u00e1hy shoduj\u00ed, n\u00e1sleduje op\u011btovn\u00e9 porovn\u00e1n\u00ed s v\u00e1hami druh\u00e9 \u00farovn\u011b; pot\u00e9, mo\u017en\u00e1, t\u0159et\u00ed a \u010dtvrt\u00e9.<\/p>\n<p><\/p>\n<p>Porovn\u00e1n\u00ed kon\u010d\u00ed, kdy\u017e v \u0159et\u011bzc\u00edch jsou odpov\u00eddaj\u00edc\u00ed si jednotky porovn\u00e1n\u00ed s r\u016fzn\u00fdmi v\u00e1hami. \u0158et\u011bzce, kter\u00e9 maj\u00ed shodn\u00e9 v\u00e1hy na v\u0161ech \u010dty\u0159ech \u00farovn\u00edch, se pova\u017euj\u00ed za rovnocenn\u00e9.<\/p>\n<p><\/p>\n<p>Tento algoritmus (s mno\u017estv\u00edm dal\u0161\u00edch technick\u00fdch detail\u016f) dal n\u00e1zev zpr\u00e1v\u011b \u010d. 10 \u2014 <em>\"Unicode Collation Algorithm\"<\/em> (<em>UCA<\/em>).<\/p>\n<p><\/p>\n<p>V tomto okam\u017eiku se chov\u00e1n\u00ed t\u0159\u00edd\u011bn\u00ed z na\u0161eho p\u0159\u00edkladu st\u00e1v\u00e1 o n\u011bco jasn\u011bj\u0161\u00edm. Bylo by dobr\u00e9 je porovnat se standardem Unicode.<\/p>\n<p><\/p>\n<p>Pro testov\u00e1n\u00ed implementac\u00ed <em>UCA<\/em> existuje speci\u00e1ln\u00ed <noindex><a rel=\"nofollow\" href=\"https:\/\/www.unicode.org\/Public\/UCA\/latest\/CollationTest.html\">test<\/a><\/noindex>, kter\u00fd pou\u017e\u00edv\u00e1 <noindex><a rel=\"nofollow\" href=\"http:\/\/www.unicode.org\/Public\/UCA\/latest\/allkeys.txt\">soubor vah<\/a><\/noindex>, implementuj\u00edc\u00ed <em>DUCET<\/em>. V souboru vah lze naj\u00edt r\u016fzn\u00e9 zaj\u00edmavosti. Nap\u0159\u00edklad tam je po\u0159ad\u00ed kostek mahjongu a evropsk\u00e9ho domina, stejn\u011b jako po\u0159ad\u00ed barev v bal\u00ed\u010dku karet (symbol <em>1F000<\/em> a tak d\u00e1le). Karty jsou uspo\u0159\u00e1d\u00e1ny podle pravidel brid\u017ee \u2014 P\u010cBZT, a karty v barv\u011b \u2014 v posloupnosti T,2,3\u2026 K.<\/p>\n<p><\/p>\n<p>Ru\u010dn\u00ed kontrola spr\u00e1vnosti t\u0159\u00edd\u011bn\u00ed \u0159et\u011bzc\u016f podle <em>DUCET<\/em> by bylo docela \u00fanavn\u00e9, ale na\u0161t\u011bst\u00ed pro n\u00e1s existuje uk\u00e1zkov\u00e1 implementace knihovny pro pr\u00e1ci s Unicode \u2014 \"<noindex><a rel=\"nofollow\" href=\"http:\/\/site.icu-project.org\/\">Mezin\u00e1rodn\u00ed komponenty pro Unicode<\/a><\/noindex>\" (<em>ICU<\/em>).<\/p>\n<p><\/p>\n<p>Na webu t\u00e9to knihovny, vyvinut\u00e9 v <em>IBM<\/em>, jsou demonstra\u010dn\u00ed str\u00e1nka, v\u010detn\u011b <noindex><a rel=\"nofollow\" href=\"http:\/\/demo.icu-project.org\/icu-bin\/collation.html\">str\u00e1nky algoritmu porovn\u00e1v\u00e1n\u00ed \u0159et\u011bzc\u016f<\/a><\/noindex>. Zad\u00e1me na\u0161e testovac\u00ed \u0159et\u011bzce s v\u00fdchoz\u00edmi nastaven\u00edmi a, \u00f3 z\u00e1zraku, dostaneme dokonal\u00e9 rusk\u00e9 t\u0159\u00edd\u011bn\u00ed.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">Abakanov Michail;mal\u00ed\u0159\nJolkina Ella;je\u0159\u00e1bnice\nIvanov Andrej;instalat\u00e9r\nIvanova Alla;advok\u00e1tka<\/code><\/pre>\n<p><\/p>\n<p>Mimochodem, na webu <em>ICU<\/em> m\u016f\u017eete naj\u00edt up\u0159esn\u011bn\u00ed pr\u00e1ce algoritmu porovn\u00e1v\u00e1n\u00ed p\u0159i zpracov\u00e1n\u00ed interpunk\u010dn\u00edch znam\u00e9nek. V p\u0159\u00edkladech <noindex><a rel=\"nofollow\" href=\"http:\/\/userguide.icu-project.org\/collation\/faq\">Collation FAQ<\/a><\/noindex> jsou ignorov\u00e1ny apostrof a poml\u010dka.<\/p>\n<p><\/p>\n<p>Unicode n\u00e1m pomohl, ale hledat p\u0159\u00ed\u010diny podivn\u00e9ho chov\u00e1n\u00ed <em>sort<\/em> v <em>Linux<\/em> budeme muset n\u011bkde jinde.<\/p>\n<p><\/p>\n<h1 id=\"sortirovka-v-glibc\">T\u0159\u00edd\u011bn\u00ed v glibc<\/h1>\n<p><\/p>\n<p>Rychl\u00fd pohled na zdrojov\u00e9 k\u00f3dy utility <em>sort<\/em> z <em>GNU Core Utils<\/em> uk\u00e1zal, \u017ee v samotn\u00e9 utilit\u011b je lokalizace omezena na tisk aktu\u00e1ln\u00ed hodnoty prom\u011bnn\u00e9 <em>LC_COLLATE<\/em> p\u0159i spu\u0161t\u011bn\u00ed v ladic\u00edm re\u017eimu:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$ sort --debug buhg.txt &gt; buhg.srt\nsort: pou\u017e\u00edv\u00e1 pravidla t\u0159\u00edd\u011bn\u00ed \u2018en_US.UTF8\u2019<\/code><\/pre>\n<p><\/p>\n<p>Porovn\u00e1n\u00ed \u0159et\u011bzc\u016f se prov\u00e1d\u00ed standardn\u00ed funkc\u00ed <em>strcoll<\/em>, co\u017e znamen\u00e1, \u017ee v\u0161e zaj\u00edmav\u00e9 se nach\u00e1z\u00ed v knihovn\u011b <em>glibc<\/em>.<\/p>\n<p><\/p>\n<p>Na <em>wiki<\/em> projektem <em>glibc<\/em> srovn\u00e1n\u00ed \u0159et\u011bzc\u016f se v\u011bnuje <noindex><a rel=\"nofollow\" href=\"https:\/\/sourceware.org\/glibc\/wiki\/Locales#LC_COLLATE\">jeden odstavec<\/a><\/noindex>. Z tohoto odstavce lze pochopit, \u017ee v <em>glibc<\/em> t\u0159\u00edd\u011bn\u00ed je zalo\u017eeno na ji\u017e zn\u00e1m\u00e9m algoritmu <em>UCA<\/em> (<em>The Unicode collation algorithm<\/em>) a\/nebo na standardu, kter\u00fd mu je bl\u00edzk\u00fd <em>ISO 14651<\/em> (<em>Mezin\u00e1rodn\u00ed \u0159azen\u00ed a porovn\u00e1v\u00e1n\u00ed \u0159et\u011bzc\u016f<\/em>). K posledn\u00edmu standardu je t\u0159eba poznamenat, \u017ee na webu <noindex><a rel=\"nofollow\" href=\"https:\/\/standards.iso.org\/ittf\/PubliclyAvailableStandards\">standards.iso.org<\/a><\/noindex> <em>ISO 14651<\/em> je ofici\u00e1ln\u011b ozn\u00e1men jako ve\u0159ejn\u011b p\u0159\u00edstupn\u00fd, ale odpov\u00eddaj\u00edc\u00ed odkaz vede na neexistuj\u00edc\u00ed str\u00e1nku. Google vyd\u00e1v\u00e1 n\u011bkolik str\u00e1nek s odkazy na ofici\u00e1ln\u00ed weby, kter\u00e9 nab\u00edzej\u00ed zakoupit elektronickou kopii standardu za stovku euro, ale na t\u0159et\u00ed \u010dtvrt\u00e9 str\u00e1nce v\u00fdsledk\u016f vyhled\u00e1v\u00e1n\u00ed se najdou i p\u0159\u00edm\u00e9 odkazy na <em>PDF<\/em>. Obecn\u011b se standard prakticky neli\u0161\u00ed od <em>UCA<\/em>, ale \u010dte se nudn\u011bji, proto\u017ee neobsahuje \u017eiv\u00e9 p\u0159\u00edklady n\u00e1rodn\u00edch zvl\u00e1\u0161tnost\u00ed t\u0159\u00edd\u011bn\u00ed \u0159et\u011bzc\u016f. <\/p>\n<p><\/p>\n<p>Nejzaj\u00edmav\u011bj\u0161\u00ed informace na <em>wiki<\/em> se uk\u00e1zala b\u00fdt odkazem na <noindex><a rel=\"nofollow\" href=\"https:\/\/sourceware.org\/bugzilla\/show_bug.cgi?id=14095\">bug tracker<\/a><\/noindex> s diskus\u00ed o implementaci porovn\u00e1v\u00e1n\u00ed \u0159et\u011bzc\u016f v <em>glibc<\/em>. Z diskuse lze zjistit, \u017ee v <em>glibc<\/em> pro porovn\u00e1n\u00ed \u0159et\u011bzc\u016f se pou\u017e\u00edv\u00e1 <em>ISO<\/em>tabulka <noindex><a rel=\"nofollow\" href=\"http:\/\/www.iso.org\/ittf\/ISO14651_2006_TABLE1_en.txt\">The Common Template Table<\/a><\/noindex> (<em>CTT<\/em>), jej\u00ed\u017e adresu lze nal\u00e9zt v p\u0159\u00edloze <em>A<\/em> standardu <em>ISO 14651<\/em>. Mezi lety 2000 a 2015 tato tabulka v <em>glibc<\/em> nem\u011bla maintainer a dost se li\u0161ila (alespo\u0148 z vn\u011bj\u0161\u00edho pohledu) od sou\u010dasn\u00e9 verze standardu. Od roku 2015 do roku 2018 prob\u00edhala adaptace na novou verzi tabulky a nyn\u00ed m\u00e1te \u0161anci potkat v re\u00e1ln\u00e9m \u017eivot\u011b jak novou variantu tabulky (<em>CentOS 8<\/em>), tak i starou (<em>CentOS 7<\/em>). <\/p>\n<p><\/p>\n<p>Nyn\u00ed, kdy\u017e m\u00e1me v\u0161echny informace o algoritmu a pomocn\u00fdch tabulk\u00e1ch, m\u016f\u017eeme se vr\u00e1tit k p\u016fvodn\u00edmu probl\u00e9mu a pochopit, jak spr\u00e1vn\u011b se\u0159adit \u0159\u00e1dky v rusk\u00e9 lokalizaci.<\/p>\n<p><\/p>\n<h1 id=\"iso-1465114652\">ISO 14651\/14652<\/h1>\n<p><\/p>\n<p>Zdrojov\u00fd k\u00f3d zaj\u00edmaj\u00edc\u00ed n\u00e1s tabulky <em>CTT<\/em> ve v\u011bt\u0161in\u011b distribuc\u00ed <em>Linux<\/em> se nach\u00e1z\u00ed v katalogu <em>\/usr\/share\/i18n\/locales\/<\/em>. Samotn\u00e1 tabulka je ulo\u017eena v souboru <em>iso14651_t1_common<\/em>. Pak je tento soubor pomoc\u00ed direktivy <em>copy iso14651_t1_common<\/em> za\u010dlen\u011bn do souboru <em>iso14651_t1<\/em>, kter\u00fd je zase zahrnut v n\u00e1rodn\u00edch souborech, v\u010detn\u011b <em>en_US<\/em> a <em>ru_RU<\/em>. Ve v\u011bt\u0161in\u011b distribuc\u00ed <em>Linux<\/em> jsou v\u0161echny zdrojov\u00e9 soubory sou\u010d\u00e1st\u00ed z\u00e1kladn\u00ed instalace, ale pokud chyb\u00ed, bude nutn\u00e9 nainstalovat dal\u0161\u00ed bal\u00ed\u010dek z distribuce.<\/p>\n<p><\/p>\n<p>Struktura souboru <em>iso14651_t1<\/em> m\u016f\u017ee se zd\u00e1t p\u0159ekvapiv\u011b rozs\u00e1hl\u00e1, s nejasn\u00fdmi pravidly pro tvorbu jmen, ale pokud se na to pod\u00edv\u00e1te, zjist\u00edte, \u017ee je to dost jednoduch\u00e9. Struktura je pops\u00e1na ve standardu <em>ISO 14652<\/em>, jeho\u017e kopii m\u016f\u017eete st\u00e1hnout z webu <noindex><a rel=\"nofollow\" href=\"http:\/\/www.open-std.org\/JTC1\/SC22\/WG20\/docs\/n972-14652ft.pdf\">open-std.org<\/a><\/noindex>. Dal\u0161\u00ed popis form\u00e1tu souboru si m\u016f\u017eete p\u0159e\u010d\u00edst na <noindex><a rel=\"nofollow\" href=\"https:\/\/pubs.opengroup.org\/onlinepubs\/9699919799\/basedefs\/V1_chap07.html\">specifikac\u00edch<\/a><\/noindex> <em>POSIX<\/em> od <em>OpenGroup<\/em>. Jako alternativu ke \u010dten\u00ed standardu m\u016f\u017eete prozkoumat zdrojov\u00e9 texty funkce <em>collate_read<\/em> v <em>glibc\/locale\/programs\/ld-collate.c<\/em>.<\/p>\n<p><\/p>\n<p>Struktura souboru vypad\u00e1 n\u00e1sledovn\u011b:<\/p>\n<p><\/p>\n<p>Ve v\u00fdchoz\u00edm nastaven\u00ed je znak  pou\u017eit jako \u00fanikov\u00fd znak, a konec \u0159\u00e1dku po znaku # je koment\u00e1\u0159em. Oba znaky lze p\u0159edefinovat, co\u017e bylo u\u010din\u011bno v nov\u00e9 verzi tabulky:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">escape_char \/\ncomment_char %<\/code><\/pre>\n<p><\/p>\n<p>V souboru se budou objevovat tokeny ve form\u00e1tu <em>&lt;Uxxxx&gt;<\/em> nebo <em>&lt;Uxxxxxxxx&gt;<\/em> (kde <em>x<\/em> \u2014 \u0161estim\u00edstn\u00e1 hexadecim\u00e1ln\u00ed \u010d\u00edslice). Toto hexadecim\u00e1ln\u00ed vyj\u00e1d\u0159en\u00ed k\u00f3dov\u00fdch bod\u016f Unicode je v k\u00f3dov\u00e1n\u00ed <em>UCS-4<\/em> (<em>UTF-32<\/em>). V\u0161echny ostatn\u00ed prvky v ostr\u00fdch z\u00e1vork\u00e1ch (v\u010detn\u011b <em>&lt;Uxxxx_xxxx&gt;<\/em>, <em>&lt;2&gt;<\/em> a podobn\u00e9), se pova\u017euj\u00ed za jednoduch\u00e9 \u0159et\u011bzcov\u00e9 konstanty, kter\u00e9 nemaj\u00ed \u017e\u00e1dn\u00fd zvl\u00e1\u0161tn\u00ed v\u00fdznam mimo kontext.<\/p>\n<p><\/p>\n<p>\u0158\u00e1dek <em>LC_COLLATE<\/em> n\u00e1m \u0159\u00edk\u00e1, \u017ee se d\u00e1le nach\u00e1zej\u00ed data popisuj\u00edc\u00ed porovn\u00e1v\u00e1n\u00ed \u0159et\u011bzc\u016f.<\/p>\n<p><\/p>\n<p>Nejprve jsou zad\u00e1na jm\u00e9na pro v\u00e1hy v tabulce porovn\u00e1v\u00e1n\u00ed a jm\u00e9na pro kombinace znak\u016f. Obecn\u011b plat\u00ed, \u017ee dva typy jmen pat\u0159\u00ed dv\u011bma r\u016fzn\u00fdm entit\u00e1m, ale v re\u00e1ln\u00e9m souboru jsou zam\u011b\u0161kan\u00e9. Jm\u00e9na vah jsou zad\u00e1na kl\u00ed\u010dov\u00fdm slovem <em>collating-symbol<\/em> (srovn\u00e1vac\u00ed symbol), proto\u017ee p\u0159i porovn\u00e1v\u00e1n\u00ed budou Unicode znaky s identick\u00fdmi v\u00e1hami pova\u017eov\u00e1ny za ekvivalentn\u00ed symboly.<\/p>\n<p><\/p>\n<p>Celkov\u00e1 d\u00e9lka sekce v aktu\u00e1ln\u00ed revizi souboru je asi 900 \u0159\u00e1dk\u016f. Vzal jsem p\u0159\u00edklady z n\u011bkolika m\u00edst, abych uk\u00e1zal libov\u016fli n\u00e1zv\u016f a n\u011bkolik druh\u016f syntaxe.<\/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  % Zaru\u010dena nejv\u011bt\u0161\u00ed hodnota symbolu. Udr\u017eujte na konci tohoto seznamu\n...\ncollating-element  z \"\"\ncollating-element  z \"\"<\/code><\/pre>\n<p><\/p>\n<ul>\n<li><em>collating-symbol<\/em> registruje \u0159et\u011bzec <em>OSMANYA<\/em> v tabulce n\u00e1zv\u016f v\u00e1h <\/li>\n<li><em>collating-symbol ..<\/em> registruje sekvenci n\u00e1zv\u016f, skl\u00e1daj\u00edc\u00edch se z prefixu <em>S<\/em> a hexadecim\u00e1ln\u00ed \u010d\u00edseln\u00fd sufix z <em>1D000<\/em> do <em>1D35F<\/em>.<\/li>\n<li><em>FFFF<\/em> v <em>collating-symbol<\/em> vypad\u00e1 jako velk\u00e9 nez\u00e1porn\u00e9 cel\u00e9 \u010d\u00edslo v hexadecim\u00e1ln\u00ed soustav\u011b, ale <em>&lt;SFFFF&gt;<\/em> to je jen n\u00e1zev, kter\u00fd by mohl vypadat jako <em>&lt;VERYBIGVAL&gt;<\/em> <\/li>\n<li>n\u00e1zev <em>&lt;U0413&gt;<\/em> znamen\u00e1 k\u00f3dov\u00fd bod v k\u00f3dov\u00e1n\u00ed <em>UCS-4<\/em><\/li>\n<li><em>collating-element  z \"\"<\/em> registruje nov\u00e9 jm\u00e9no pro p\u00e1r unicode bod\u016f. <\/li>\n<\/ul>\n<p><\/p>\n<p>Jakmile jsou definov\u00e1na jm\u00e9na vah, stanovuj\u00ed se vlastn\u00ed v\u00e1hy. Proto\u017ee p\u0159i porovn\u00e1v\u00e1n\u00ed z\u00e1le\u017e\u00ed pouze na vztahu v\u011bt\u0161\u00ed-men\u0161\u00ed, v\u00e1hy se ur\u010duj\u00ed jednoduch\u00fdm po\u0159ad\u00edm vyjmenov\u00e1n\u00edm n\u00e1zv\u016f. Nejd\u0159\u00edve se uvedou \"leh\u010d\u00ed\" v\u00e1hy, pot\u00e9 \"t\u011b\u017e\u0161\u00ed\". P\u0159ipom\u00edn\u00e1m, \u017ee ka\u017ed\u00e9mu Unicode symbolu je p\u0159i\u0159azena \u010dty\u0159i r\u016fzn\u00e1 v\u00e1hov\u00e1 ozna\u010den\u00ed. Zde jsou sjednocena do jedin\u00e9 se\u0159azen\u00e9 posloupnosti. Teoreticky m\u016f\u017ee b\u00fdt jak\u00e9koli symbolick\u00e9 jm\u00e9no pou\u017eito na jak\u00e9koli \u00farovni, ale koment\u00e1\u0159e nazna\u010duj\u00ed, \u017ee v\u00fdvoj\u00e1\u0159i ment\u00e1ln\u011b rozd\u011bluj\u00ed n\u00e1zvy podle \u00farovn\u00ed.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">% Symbolick\u00e9 p\u0159i\u0159azen\u00ed vah\n\n% P\u0159i\u0159azen\u00ed vah t\u0159et\u00ed \u00farovn\u011b\n\n\n\n\n...\n% P\u0159i\u0159azen\u00ed vah druh\u00e9 \u00farovn\u011b\n\n % KOMBINUJ\u00cdC\u00cd N\u00cdZKOU \u010c\u00c1RU\n % KOMBINUJ\u00cdC\u00cd \u010c\u00c1RKU NAD\n % KOMBINUJ\u00cdC\u00cd OPA\u010cNOU \u010c\u00c1RKU NAD\n...\n% P\u0159i\u0159azen\u00ed vah prvn\u00ed \u00farovn\u011b\n % HORIZONT\u00c1LN\u00cd TABULACE \n % \u0158\u00c1DKOV\u00dd ZLOM\n % VERTIK\u00c1LN\u00cd TABULACE\n...\n % KYRYLICE MAL\u00c9 P\u00cdSMENO DE\n % KYRYLICE MAL\u00c9 P\u00cdSMENO KOMI DE\n % KYRYLICE MAL\u00c9 P\u00cdSMENO DJE\n % KYRYLICE MAL\u00c9 P\u00cdSMENO KOMI DJE\n % KYRYLICE MAL\u00c9 P\u00cdSMENO GJE\n % KYRYLICE MAL\u00c9 P\u00cdSMENO ZE S KLESAJ\u00cdC\u00cdM KOVEM\n % KYRYLICE MAL\u00c9 P\u00cdSMENO IE\n % KYRYLICE MAL\u00c9 P\u00cdSMENO IE S BREVIDEM\n % KYRYLICE MAL\u00c9 P\u00cdSMENO UKRAJINSK\u00c9 IE\n % KYRYLICE MAL\u00c9 P\u00cdSMENO ZHE<\/code><\/pre>\n<p><\/p>\n<p>Kone\u010dn\u011b, tabulka vah.<\/p>\n<p><\/p>\n<p>Sekce vah je uzav\u0159ena v \u0159\u00e1dc\u00edch s kl\u00ed\u010dov\u00fdmi slovy <em>order_start<\/em> a <em>order_end<\/em>. Dal\u0161\u00ed parametry <em>order_start<\/em> ur\u010duj\u00ed, v jak\u00e9m sm\u011bru jsou \u0159\u00e1dky proch\u00e1zeny na ka\u017ed\u00e9 \u00farovni srovn\u00e1n\u00ed. V\u00fdchoz\u00ed hodnota je <em>forward<\/em>. T\u011blo sekce se skl\u00e1d\u00e1 z \u0159\u00e1dk\u016f, kter\u00e9 obsahuj\u00ed k\u00f3d znaku a \u010dty\u0159i jeho v\u00e1hy. K\u00f3d znaku m\u016f\u017ee b\u00fdt zastoupen samotn\u00fdm znakem, k\u00f3dovou bodem nebo symbolick\u00fdm n\u00e1zvem, kter\u00e9 bylo d\u0159\u00edve definov\u00e1no. V\u00e1hy mohou b\u00fdt tak\u00e9 definov\u00e1ny symbolick\u00fdmi n\u00e1zvy, k\u00f3dov\u00fdmi body nebo samotn\u00fdmi znaky. Pokud jsou pou\u017eity k\u00f3dov\u00e9 body nebo znaky, pak se jejich v\u00e1ha shoduje s \u010d\u00edselnou hodnotou k\u00f3dov\u00e9 bodu (pozice v Unicode tabulce). Znaky, kter\u00e9 nejsou v\u00fdslovn\u011b uvedeny (jak ch\u00e1pu), jsou pova\u017eov\u00e1ny za p\u0159idan\u00e9 do tabulky s prim\u00e1rn\u00ed v\u00e1hou shoduj\u00edc\u00ed se s pozic\u00ed v Unicode tabulce. Speci\u00e1ln\u00ed hodnota v\u00e1hy <em>IGNORE<\/em> znamen\u00e1, \u017ee na odpov\u00eddaj\u00edc\u00ed \u00farovni srovn\u00e1n\u00ed je tento znak ignorov\u00e1n.<\/p>\n<p><\/p>\n<p>Pro demonstraci struktury vah jsem vybral t\u0159i docela z\u0159ejm\u00e9 fragmenty:<\/p>\n<p><\/p>\n<ul>\n<li>znaky, kter\u00e9 jsou zcela ignorov\u00e1ny<\/li>\n<li>znaky ekvivalentn\u00ed \u010d\u00edslici t\u0159i na prvn\u00edch dvou \u00farovn\u00edch<\/li>\n<li>za\u010d\u00e1tek cyrilice, kter\u00e1 neobsahuje diakritick\u00e1 znamen\u00ed, a proto je \u0159azena p\u0159ev\u00e1\u017en\u011b podle prvn\u00ed a t\u0159et\u00ed \u00farovn\u011b.<\/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>Nyn\u00ed se mohu znovu vr\u00e1tit k \u0159azen\u00ed p\u0159\u00edklad\u016f na za\u010d\u00e1tku \u010dl\u00e1nku. Skryt\u00e1 past se nach\u00e1z\u00ed v t\u00e9to \u010d\u00e1sti tabulky vah:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">IGNORE;IGNORE;IGNORE; % SPACE\n IGNORE;IGNORE;IGNORE; % EXCLAMATION MARK\n IGNORE;IGNORE;IGNORE; % QUOTATION MARK\n...<\/code><\/pre>\n<p><\/p>\n<p>Je z\u0159ejm\u00e9, \u017ee v t\u00e9to tabulce jsou interpunk\u010dn\u00ed znam\u00e9nka z tabulky <em>ASCII<\/em> (v\u010detn\u011b mezery) p\u0159i porovn\u00e1v\u00e1n\u00ed \u0159et\u011bzc\u016f se prakticky v\u017edy ignoruje. V\u00fdjimku tvo\u0159\u00ed pouze \u0159et\u011bzce, kter\u00e9 se shoduj\u00ed ve v\u0161em, krom\u011b interpunkce, kter\u00e1 se nach\u00e1z\u00ed na shodn\u00fdch pozic\u00edch. \u0158et\u011bzce z m\u00e9ho p\u0159\u00edkladu (po se\u0159azen\u00ed) pro algoritmus porovn\u00e1n\u00ed vypadaj\u00ed takto:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">AbakanovMichaelsmal\u00ed\u0159\nJelkinEllaKranovna\nIvanovAlmaMal\u00ed\u0159\nIvanovAndrejzedn\u00ed\u0159<\/code><\/pre>\n<p><\/p>\n<p>Vzhledem k tomu, \u017ee v tabulce vah velk\u00e1 p\u00edsmena v ru\u0161tin\u011b n\u00e1sleduj\u00ed po mal\u00fdch (na t\u0159et\u00ed \u00farovni <em>&lt;CAP&gt;<\/em> t\u011b\u017e\u0161\u00ed ne\u017e <em>&lt;MIN&gt;<\/em>), t\u0159\u00edd\u011bn\u00ed vypad\u00e1 naprosto spr\u00e1vn\u011b.<\/p>\n<p><\/p>\n<p>P\u0159i nastavov\u00e1n\u00ed prom\u011bnn\u00e9 <em>LC_COLLATE=C<\/em> se na\u010d\u00edt\u00e1 zvl\u00e1\u0161tn\u00ed tabulka, kter\u00e1 ur\u010duje bajtov\u00e9 porovn\u00e1n\u00ed<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">static const uint32_t collseqwc[] =\n{\n  8, 1, 8, 0x0, 0xff,\n  \n  \/* 1st-level table *\/\n  6 * sizeof (uint32_t),\n  \n  \/* 2nd-level table *\/\n  7 * sizeof (uint32_t),\n  \n  \/* 3rd-level table *\/\n  L'x00', L'x01', L'x02', L'x03', L'x04', L'x05', L'x06', L'x07',\n  L'x08', L'x09', L'x0a', L'x0b', L'x0c', L'x0d', L'x0e', L'x0f',\n\n...\n  L'xf8', L'xf9', L'xfa', L'xfb', L'xfc', L'xfd', L'fe', L'xff'\n};<\/code><\/pre>\n<p><\/p>\n<p>Jeliko\u017e v Unicode bod k\u00f3du \u0401, stoj\u00ed p\u0159ed A, tak i \u0159et\u011bzce jsou se\u0159azeny odpov\u00eddaj\u00edc\u00edm zp\u016fsobem.<\/p>\n<p><\/p>\n<h1 id=\"tekstovye-i-dvoichnye-tablicy\">Textov\u00e9 a bin\u00e1rn\u00ed tabulky<\/h1>\n<p><\/p>\n<p>Je z\u0159ejm\u00e9, \u017ee porovn\u00e1n\u00ed \u0159et\u011bzc\u016f je nesm\u00edrn\u011b \u010dast\u00e1 operace, zat\u00edmco rozbor tabulky <em>CTT<\/em> je pom\u011brn\u011b n\u00e1ro\u010dn\u00e1 procedura. Pro optimalizaci p\u0159\u00edstupu k tabulce se kompiluje do bin\u00e1rn\u00ed formy p\u0159\u00edkazem <em>localedef<\/em>.<\/p>\n<p><\/p>\n<p>T\u00fdm <em>localedef<\/em> p\u0159ij\u00edm\u00e1 jako parametry soubor s tabulkou n\u00e1rodn\u00edch specifikac\u00ed (mo\u017enost <em>-i<\/em>), ve kter\u00e9m jsou v\u0161echny znaky zastoupeny jako Unicode body, a soubor shody Unicode bod\u016f se symboly konkr\u00e9tn\u00edch k\u00f3dov\u00e1n\u00ed (mo\u017enost <em>-f<\/em>). V d\u016fsledku proveden\u00e9 pr\u00e1ce se vytv\u00e1\u0159ej\u00ed bin\u00e1rn\u00ed soubory pro lokalitu, s n\u00e1zvem uveden\u00fdm v posledn\u00edm parametru.<\/p>\n<p><\/p>\n<p><em>Glibc<\/em> podporuje dva form\u00e1ty bin\u00e1rn\u00edch soubor\u016f: \"tradi\u010dn\u00ed\" a \"modern\u00ed\".<\/p>\n<p><\/p>\n<p>Tradi\u010dn\u00ed form\u00e1t p\u0159edpokl\u00e1d\u00e1, \u017ee n\u00e1zev lokality je n\u00e1zev podadres\u00e1\u0159e v <em>\/usr\/lib\/locale\/<\/em>. V tomto podadres\u00e1\u0159i se nach\u00e1zej\u00ed bin\u00e1rn\u00ed soubory <em>LC_COLLATE<\/em>, <em>LC_CTYPE<\/em>, <em>LC_TIME<\/em> a t.p. Soubory <em>LC_IDENTIFICATION<\/em> obsahuj\u00ed form\u00e1ln\u00ed n\u00e1zev lokality (kter\u00fd se m\u016f\u017ee li\u0161it od n\u00e1zvu adres\u00e1\u0159e) a koment\u00e1\u0159e.<\/p>\n<p><\/p>\n<p>Modern\u00ed form\u00e1t p\u0159edpokl\u00e1d\u00e1 uchov\u00e1v\u00e1n\u00ed v\u0161ech lokalit v jedin\u00e9m archivu <em>\/usr\/lib\/locale\/locale-archive<\/em>, kter\u00fd se mapuje do virtu\u00e1ln\u00ed pam\u011bti v\u0161ech proces\u016f, kter\u00e9 jej pou\u017e\u00edvaj\u00ed <em>glibc<\/em>. N\u00e1zev lokality v modern\u00edm form\u00e1tu podl\u00e9h\u00e1 ur\u010dit\u00e9 kanonizaci \u2013 v n\u00e1zvech k\u00f3dov\u00e1n\u00ed z\u016fst\u00e1vaj\u00ed pouze \u010d\u00edslice a p\u00edsmena uveden\u00e1 na mal\u00e9 p\u00edsmeno. Tak <em>ru_RU.KOI8-R<\/em>, bude ulo\u017eeno jako <em>ru_RU.koi8r<\/em>.<\/p>\n<p><\/p>\n<p>Vstupn\u00ed soubory se hledaj\u00ed v aktu\u00e1ln\u00edm adres\u00e1\u0159i a tak\u00e9 v adres\u00e1\u0159\u00edch <em>\/usr\/share\/i18n\/locales\/<\/em> a <em>\/usr\/share\/i18n\/charmaps\/<\/em> pro soubory <em>CTT<\/em> a soubory k\u00f3dov\u00e1n\u00ed odpov\u00eddaj\u00edc\u00edm.<\/p>\n<p><\/p>\n<p>Nap\u0159\u00edklad, p\u0159\u00edkaz<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">localedef -i ru_RU -f MAC-CYRILLIC ru_RU.MAC-CYRILLIC<\/code><\/pre>\n<p><\/p>\n<p>zkompiluje soubor <em>\/usr\/share\/i18n\/locales\/ru_RU<\/em> s pou\u017eit\u00edm souboru k\u00f3dov\u00e1n\u00ed <em>\/usr\/share\/i18n\/charmaps\/MAC-CYRILLIC.gz<\/em> a ulo\u017e\u00ed v\u00fdsledek do <em>\/usr\/lib\/locale\/locale-archive<\/em> pod n\u00e1zvem <em>ru_RU.maccyrillic<\/em><\/p>\n<p><\/p>\n<p>Pokud nastav\u00edte prom\u011bnnou <em>LANG=en_US.UTF-8<\/em> , pak <em>glibc<\/em> bude hledat bin\u00e1rn\u00ed soubory lokality v n\u00e1sleduj\u00edc\u00ed posloupnosti soubor\u016f a adres\u00e1\u0159\u016f:<\/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>Pokud se lokalita vyskytuje jak v tradi\u010dn\u00edm, tak v modern\u00edm form\u00e1tu, d\u00e1v\u00e1 se p\u0159ednost modern\u00edmu.<\/p>\n<p><\/p>\n<p>Seznam zkompilovan\u00fdch lokalit lze zobrazit p\u0159\u00edkazem <em>locale -a<\/em>.<\/p>\n<p><\/p>\n<h1 id=\"podgotovka-svoey-tablicy-sravneniya\">P\u0159\u00edprava vlastn\u00ed tabulky porovn\u00e1n\u00ed<\/h1>\n<p><\/p>\n<p>Nyn\u00ed, obezn\u00e1meni se znalostmi, m\u016f\u017eeme vytvo\u0159it vlastn\u00ed ide\u00e1ln\u00ed tabulku porovn\u00e1n\u00ed \u0159et\u011bzc\u016f. Tato tabulka by m\u011bla spr\u00e1vn\u011b porovn\u00e1vat rusk\u00e1 p\u00edsmena, v\u010detn\u011b p\u00edsmene \u0401, a z\u00e1rove\u0148 zohled\u0148ovat interpunk\u010dn\u00ed znam\u00e9nka podle tabulky <em>ASCII<\/em>.<\/p>\n<p><\/p>\n<p>Proces p\u0159\u00edpravy vlastn\u00ed tabulky \u0159azen\u00ed se skl\u00e1d\u00e1 ze dvou f\u00e1z\u00ed: \u00fapravy tabulky v\u00e1h a jej\u00ed kompilace do bin\u00e1rn\u00ed formy p\u0159\u00edkazem <em>localedef<\/em>.<\/p>\n<p><\/p>\n<p>Aby bylo mo\u017en\u00e9 tabulku porovn\u00e1n\u00ed p\u0159izp\u016fsobit s minim\u00e1ln\u00edmi n\u00e1klady na \u00fapravu, ve form\u00e1tu <em>ISO 14652<\/em> jsou p\u0159ipravov\u00e1ny sekce pro \u00fapravu v\u00e1h u\u017e existuj\u00edc\u00ed tabulky. Sekce za\u010d\u00edn\u00e1 kl\u00ed\u010dov\u00fdm slovem <em>reorder-after<\/em> a uveden\u00edm pozice, za kterou n\u00e1sleduje v\u00fdm\u011bna. Sekci zakon\u010duje \u0159\u00e1dek <em>reorder-end<\/em>. Pokud je t\u0159eba upravit n\u011bkolik \u010d\u00e1st\u00ed tabulky, vytv\u00e1\u0159\u00ed se sekce pro ka\u017edou takovou \u010d\u00e1st.<\/p>\n<p><\/p>\n<p>Zkop\u00edroval jsem nov\u00e9 verze soubor\u016f <em>iso14651_t1_common<\/em> a <em>ru_RU<\/em> z repozit\u00e1\u0159e <em>glibc<\/em> do sv\u00e9ho dom\u00e1c\u00edho adres\u00e1\u0159e ~\/.local\/share\/i18n\/locales\/ a m\u00edrn\u011b upravil sekci <em>LC_COLLATE<\/em> v <em>ru_RU<\/em>. Nov\u00e9 verze soubor\u016f jsou pln\u011b kompatibiln\u00ed s mou verz\u00ed <em>glibc<\/em>. Pokud se rozhodnete pou\u017e\u00edt star\u00e9 verze soubor\u016f, budete muset zm\u011bnit symbolick\u00e9 n\u00e1zvy a m\u00edsto, odkud za\u010d\u00edn\u00e1 v\u00fdm\u011bna v tabulce.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">LC_COLLATE\n% Zkop\u00edrujte \u0161ablonu z ISO\/IEC 14651\nk\u00f3p\u00edrovat \"iso14651_t1\"\nse\u0159adit-po \n ;;; % MEZERA\n ;;; % VYKR\u00ddVAC\u00cd ZNAMENKO\n ;;; % UVOLN\u011aN\u00cd ZNAK\n...\n ;;; % PRAV\u00dd SLOUPKOV\u00dd ZNAK\n ;;; % TILDA\nse\u0159adit-konec\nKONEC LC_COLLATE<\/code><\/pre>\n<p><\/p>\n<p>Ve skute\u010dnosti by bylo t\u0159eba zm\u011bnit pole v <em>LC_IDENTIFICATION<\/em> tak, aby ukazovala na lokalitu <em>ru_MY<\/em>, ale v m\u00e9m p\u0159\u00edkladu to nebylo pot\u0159eba, proto\u017ee jsem vylou\u010dil z vyhled\u00e1v\u00e1n\u00ed lokality archiv <em>locale-archive<\/em>.<\/p>\n<p><\/p>\n<p>Aby <em>localedef<\/em> pracoval se soubory ve sv\u00e9 slo\u017ece prost\u0159ednictv\u00edm prom\u011bnn\u00e9 <em>I18NPATH<\/em> m\u016f\u017eete p\u0159idat dal\u0161\u00ed adres\u00e1\u0159 pro hled\u00e1n\u00ed vstupn\u00edch soubor\u016f, a adres\u00e1\u0159 pro ukl\u00e1d\u00e1n\u00ed bin\u00e1rn\u00edch soubor\u016f m\u016f\u017eete specifikovat jako cestu se zlomky:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; I18NPATH=~\/local\/share\/i18n localedef -i ru_RU -f UTF-8 ~\/local\/lib\/locale\/ru_MY.UTF-8<\/code><\/pre>\n<p><\/p>\n<p><em>POSIX<\/em> p\u0159edpokl\u00e1d\u00e1, \u017ee v <em>LANG<\/em> m\u016f\u017eete ps\u00e1t absolutn\u00ed cesty k adres\u00e1\u0159\u016fm se soubory lokalizace, kter\u00e9 za\u010d\u00ednaj\u00ed p\u0159\u00edmo lom\u00edtkem, ale <em>glibc<\/em> v <em>Linux<\/em> v\u0161echny cesty se pova\u017euj\u00ed od z\u00e1kladn\u00edho adres\u00e1\u0159e, kter\u00fd lze p\u0159edefinovat prost\u0159ednictv\u00edm prom\u011bnn\u00e9 <em>LOCPATH<\/em>. Po nastaven\u00ed <em>LOCPATH=~\/local\/lib\/locale\/<\/em> budou v\u0161echny soubory souvisej\u00edc\u00ed s lokalizac\u00ed hled\u00e1ny pouze ve sv\u00e9 slo\u017ece. Archiv lokalizac\u00ed je p\u0159i nastaven\u00e9 prom\u011bnn\u00e9 <em>LOCPATH<\/em> ignorov\u00e1n.<\/p>\n<p><\/p>\n<p>To je rozhoduj\u00edc\u00ed test:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; LANG=ru_MY.UTF-8 LOCPATH=~\/local\/lib\/locale\/ sort buhg.txt\nAbakanov Michail;mal\u00ed\u0159\nJolkina Ella;je\u0159\u00e1bnice\nIvanov Andrej;zedn\u00edk\nIvanova Alla;advok\u00e1t<\/code><\/pre>\n<p><\/p>\n<p>Hur\u00e1! Ud\u011blali jsme to!<\/p>\n<p><\/p>\n<h1 id=\"rabota-nad-oshibkami\">Pr\u00e1ce na chyb\u00e1ch<\/h1>\n<p><\/p>\n<p>Ji\u017e jsem odpov\u011bd\u011bl na ot\u00e1zky o t\u0159\u00edd\u011bn\u00ed \u0159et\u011bzc\u016f, polo\u017een\u00e9 na za\u010d\u00e1tku, ale zb\u00fdv\u00e1 je\u0161t\u011b p\u00e1r ot\u00e1zek ohledn\u011b chyb \u2014 viditeln\u00fdch i neviditeln\u00fdch.<\/p>\n<p><\/p>\n<p>Vra\u0165me se k p\u016fvodn\u00edmu \u00fakolu.<\/p>\n<p><\/p>\n<p>A program <em>sort<\/em> a program <em>p\u0159ipojit<\/em> pou\u017e\u00edvaj\u00ed stejn\u00e9 funkce pro porovn\u00e1v\u00e1n\u00ed \u0159et\u011bzc\u016f z <em>glibc<\/em>. Jak se tedy stalo, \u017ee <em>p\u0159ipojit<\/em> vyvol\u00e1val chybu t\u0159\u00edd\u011bn\u00ed na \u0159et\u011bzc\u00edch, se\u0159azen\u00fdch p\u0159\u00edkazem <em>sort<\/em> v lokalit\u011b <em>en_US.UTF-8<\/em>? \u041e\u0442\u0432\u0435\u0442 \u043f\u0440\u043e\u0441\u0442: <em>sort<\/em> srovn\u00e1v\u00e1 \u0159et\u011bzec jako celek, zat\u00edmco <em>p\u0159ipojit<\/em> srovn\u00e1v\u00e1 pouze kl\u00ed\u010d, kter\u00fdm je ve v\u00fdchoz\u00edm nastaven\u00ed za\u010d\u00e1tek \u0159et\u011bzce p\u0159ed prvn\u00edm mezerou. V m\u00e9m p\u0159\u00edkladu to vedlo k chybov\u00e9mu hl\u00e1\u0161en\u00ed, proto\u017ee t\u0159\u00edd\u011bn\u00ed prvn\u00edch slov v \u0159et\u011bzc\u00edch se neshodovalo se t\u0159\u00edd\u011bn\u00edm cel\u00fdch \u0159et\u011bzc\u016f.<\/p>\n<p><\/p>\n<p>Lokalita <em>\"C\"<\/em> zaru\u010duje, \u017ee ve se\u0159azen\u00fdch \u0159et\u011bzc\u00edch budou po\u010d\u00e1te\u010dn\u00ed podsoubory a\u017e k prvn\u00edmu meze\u0159e tak\u00e9 se\u0159azeny, ale to pouze zakr\u00fdv\u00e1 chybu. Mohou b\u00fdt zvolena takov\u00e1 data (lid\u00e9 se stejn\u00fdmi p\u0159\u00edjmen\u00edmi, ale r\u016fzn\u00fdmi jm\u00e9ny), kter\u00e1 bez chybov\u00e9ho hl\u00e1\u0161en\u00ed by vedla k nespr\u00e1vn\u00e9mu v\u00fdsledku slou\u010den\u00ed soubor\u016f. Pokud chceme, aby <em>p\u0159ipojit<\/em> slou\u010dil \u0159\u00e1dky soubor\u016f podle jm\u00e9na a p\u0159\u00edjmen\u00ed, spr\u00e1vn\u00fdm zp\u016fsobem je v\u00fdslovn\u011b uv\u00e9st odd\u011blova\u010d pol\u00ed a se\u0159adit podle kl\u00ed\u010dov\u00e9ho pole, nikoli podle cel\u00e9ho \u0159\u00e1dku. V tomto p\u0159\u00edpad\u011b bude slou\u010den\u00ed prob\u00edhat spr\u00e1vn\u011b a v \u017e\u00e1dn\u00e9 lokalizaci nebudou chyby:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; sort -t ; -k 1 buhg.txt &gt; buhg.srt\n$&gt; sort -t ; -k 1 mail.txt &gt; mail.srt\n$&gt; join -t ; buhg.srt mail.srt &gt; result<\/code><\/pre>\n<p><\/p>\n<p>\u00dasp\u011b\u0161n\u011b proveden\u00fd p\u0159\u00edklad v k\u00f3dov\u00e1n\u00ed <em>CP1251<\/em> obsahuje je\u0161t\u011b jednu chybu. Jde o to, \u017ee ve v\u0161ech zn\u00e1m\u00fdch m\u00fdch distribuc\u00edch <em>Linux<\/em> nen\u00ed ve bal\u00ed\u010dc\u00edch zkompilovan\u00e1 lokalizace <em>ru_RU.CP1251<\/em>. Pokud nebyla zkompilovan\u00e1 lokalizace nalezena, <em>sort<\/em> potichu pou\u017e\u00edv\u00e1 porovn\u00e1n\u00ed po bytech, co\u017e jsme pozorovali.<\/p>\n<p><\/p>\n<p>Mimochodem, existuje je\u0161t\u011b jedna mal\u00e1 chyba spojen\u00e1 s nedostupnost\u00ed zkompilovan\u00fdch lokalizac\u00ed. P\u0159\u00edkaz <em>LOCPATH=\/tmp locale -a<\/em> vyd\u00e1 seznam v\u0161ech lokalizac\u00ed v <em>locale-archive<\/em>, ale s nastavenou prom\u011bnnou <em>LOCPATH<\/em> pro v\u0161echny programy (v\u010detn\u011b samotn\u00e9ho <em>locale<\/em>) budou tyto lokalizace nedostupn\u00e9.<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">$&gt; LOCPATH=\/tmp locale -a | grep en_US\nlocale: Cannot set LC_CTYPE to default locale: No such file or directory\nlocale: Cannot set LC_MESSAGES to default locale: No such file or directory\nlocale: Cannot set LC_COLLATE to default locale: No such file or directory\nen_US\nen_US.iso88591\nen_US.iso885915\nen_US.utf8\n\n$&gt; LC_COLLATE=en_US.UTF-8 sort --debug\nsort: using \u2018en_US.UTF-8\u2019 sorting rules\n\n$&gt; LOCPATH=\/tmp LC_COLLATE=en_US.UTF-8 sort --debug\nsort: using simple byte comparison<\/code><\/pre>\n<p><\/p>\n<h1 id=\"zaklyuchenie\">Z\u00e1v\u011br<\/h1>\n<p><\/p>\n<p>Pokud jste program\u00e1tor, kter\u00fd je zvykl\u00fd myslet si, \u017ee \u0159et\u011bzce jsou soubor bajt\u016f, pak je v\u00e1\u0161 v\u00fdb\u011br <em>LC_COLLATE=C<\/em>.<\/p>\n<p><\/p>\n<p>Pokud jste lingvista nebo autor slovn\u00edk\u016f, pak je lep\u0161\u00ed si zkompilovat svou lokalizaci.<\/p>\n<p><\/p>\n<p>Pokud jste b\u011b\u017en\u00fd u\u017eivatel, pak si sta\u010d\u00ed zvyknout na to, \u017ee p\u0159\u00edkaz <em>ls -a<\/em> vyd\u00e1v\u00e1 soubory za\u010d\u00ednaj\u00edc\u00ed te\u010dkou, spolu s soubory za\u010d\u00ednaj\u00edc\u00edmi p\u00edsmenem, a <em>Midnight Commander<\/em>, kter\u00fd pou\u017e\u00edv\u00e1 sv\u00e9 vlastn\u00ed funkce pro t\u0159\u00edd\u011bn\u00ed n\u00e1zv\u016f, umis\u0165uje soubory za\u010d\u00ednaj\u00edc\u00ed te\u010dkou na za\u010d\u00e1tek seznamu.<\/p>\n<p><\/p>\n<h1 id=\"ssylki\">Odkazy<\/h1>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/unicode.org\/reports\/tr10\/\">Zpr\u00e1va \u010d. 10 o algoritmu porovn\u00e1n\u00ed Unicode <\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/www.unicode.org\/Public\/UCA\/latest\/allkeys.txt\">V\u00e1hy znak\u016f na unicode.org <\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/userguide.icu-project.org\/intro\"><em>ICU<\/em> \u2014 implementace knihovny pro pr\u00e1ci s Unicode od IBM. <\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/demo.icu-project.org\/icu-bin\/collation.html\">Test t\u0159\u00edd\u011bn\u00ed s pomoc\u00ed <em>ICU<\/em> <\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/www.iso.org\/ittf\/ISO14651_2006_TABLE1_en.txt\">V\u00e1hy znak\u016f v <em>ISO 14651<\/em> <\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"http:\/\/www.open-std.org\/JTC1\/SC22\/WG20\/docs\/n972-14652ft.pdf\">Popis form\u00e1tu souboru s v\u00e1hami <em>ISO 14652<\/em> <\/a><\/noindex><\/p>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/sourceware.org\/bugzilla\/show_bug.cgi?id=14095\">Diskuse o porovn\u00e1n\u00ed \u0159et\u011bzc\u016f v <em>glibc<\/em><\/a><\/noindex><\/p>\n<p>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/503960\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0412\u0441\u0451 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c \u0441 \u043a\u043e\u0440\u043e\u0442\u043a\u043e\u0433\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0430\u0434\u0440\u0435\u0441\u0430\u0445 e-mail \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u043e\u0447\u0442\u043e\u0432\u043e\u0439 \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438, \u0441 \u0434\u043e\u043b\u0436\u043d\u043e\u0441\u0442\u044f\u043c\u0438 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 \u0431\u0430\u0437\u044b \u043e\u0442\u0434\u0435\u043b\u0430 \u043a\u0430\u0434\u0440\u043e\u0432. \u041e\u0431\u0430 \u0441\u043f\u0438\u0441\u043a\u0430 \u0431\u044b\u043b\u0438 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0432 \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0435 \u042e\u043d\u0438\u043a\u043e\u0434 UTF-8 \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b \u0441 \u044e\u043d\u0438\u043a\u0441\u043e\u0432\u0441\u043a\u0438\u043c\u0438 \u043a\u043e\u043d\u0446\u0430\u043c\u0438 \u0441\u0442\u0440\u043e\u043a. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 mail.txt \u0418\u0432\u0430\u043d\u043e\u0432 \u0410\u043d\u0434\u0440\u0435\u0439;ia@example.com \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 buhg.txt \u0418\u0432\u0430\u043d\u043e\u0432\u0430 \u0410\u043b\u043b\u0430;\u043c\u0430\u043b\u044f\u0440 \u0401\u043b\u043a\u0438\u043d\u0430 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-83055","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - 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\/cs\/blog\/administrirovanie\/kak-linuxovskij-sort-sortiruet-stroki\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\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\/cs\/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\udd47Jak Linuxov\u00fd sort \u0159ad\u00ed \u0159et\u011bzce | ProHoster","description":"\u00davod V\u0161echno za\u010dalo kr\u00e1tk\u00fdm skriptem, kter\u00fd m\u011bl slou\u010dit informace o e-mailov\u00fdch adres\u00e1ch zam\u011bstnanc\u016f z u\u017eivatelsk\u00e9ho seznamu newsletteru s.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/kak-linuxovskij-sort-sortiruet-stroki","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/83055","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=83055"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/83055\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=83055"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=83055"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=83055"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}