Portál AbcLinuxu, 12. května 2025 05:37
use POSIX qw /locale_h/; use locale; @a = ('A š', 'A v', 'Aaa'); setlocale LC_COLLATE, "C"; print "$_\n" foreach sort @a; print "\n"; setlocale LC_COLLATE, "cs_CZ.UTF-8"; print "$_\n" foreach sort @a;
A v A š Aaa Aaa A š A v
No jestli on nebude problém spíš v tom, že sort
v Perlu spoléhá na to, co mu "vrátí systémový sort". Viz následující:
mike@tinky:~$ locale LANG=cs_CZ.UTF-8 LANGUAGE= LC_CTYPE="cs_CZ.UTF-8" LC_NUMERIC="cs_CZ.UTF-8" LC_TIME="cs_CZ.UTF-8" LC_COLLATE="cs_CZ.UTF-8" LC_MONETARY="cs_CZ.UTF-8" LC_MESSAGES="cs_CZ.UTF-8" LC_PAPER="cs_CZ.UTF-8" LC_NAME="cs_CZ.UTF-8" LC_ADDRESS="cs_CZ.UTF-8" LC_TELEPHONE="cs_CZ.UTF-8" LC_MEASUREMENT="cs_CZ.UTF-8" LC_IDENTIFICATION="cs_CZ.UTF-8" LC_ALL= mike@tinky:~$ cat ./foo A š A v Aaa mike@tinky:~$ sort ./foo Aaa A š A v
Možná bych popřemýšlel o použití Cz::Sort
Spojovník a nepřerušující mezera před abecedou.vizte http://racek.vlada.cz/usneseni/usneseni_webtest.nsf/WebGovRes/0AD8FEF4CC04B7A4C12571B6006D69D0?OpenDocument
Problém je v tom, že v definici locale je pro znak "mezera" (nejen) v cs_CZ.utf8 krpa, která znepříjemňuje život nejen v Perlu, ale tak nějak napříč systémem. Existuje pro to dokonce zdokumentovaná oprava:
/usr/share/i18n/locales/cs_CZ
je třeba opravit řádek:<U0020> IGNORE;IGNORE;IGNORE;<U0020>
na <U0020> <U0020>;IGNORE;<U0020>;<U0020>
$ localedef --list-archive | grep cs_CZ cs_CZ cs_CZ.utf8a smazat je:
localedef --delete-from-archive cs_CZ localedef --delete-from-archive cs_CZ.utf8
localedef -i /usr/share/i18n/locales/cs_CZ -f UTF-8 /usr/lib/locale/cs_CZ localedef -i /usr/share/i18n/locales/cs_CZ -f UTF-8 /usr/lib/locale/cs_CZ.UTF-8
cd /usr/lib/locale/ localedef --add-to-archive cs_CZ localedef --add-to-archive cs_CZ.UTF-8
$ localedef --list-archive | grep cs_CZ cs_CZ cs_CZ.utf8
A voilá po opravě locale:
$ cat foo A v Abc A b A š A č Aaa $ sort foo A b A č A š A v Aaa Abc
Díky moc
A musim říct, že v glibc jsem chybu opravdu nečekal, nemělo by se to někam bugreportovat? Nebo existuje nějaký důvod proč je to takhle?
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.