Collation um durch LC_COLLATE
definiert nicht nur die Sortierreihenfolge der einzelnen Zeichen, sondern auch die Bedeutung des Zeichenbereiches. Oder doch? Betrachten Sie das folgende Snippet:
unset LANGUAGE LC_ALL
echo B | LC_COLLATE=en_US grep '[a-z]'
Intuitiv B
ist nicht in [a-z]
, daher sollte dies nichts ausgeben. Genau das passiert unter Ubuntu 8.04 oder 10.04. Aber auf einigen Computern, auf denen Debian Lenny oder Squeeze ausgeführt wird, B
wird gefunden, dass der Bereich a-z
alles zwischen a
und z
in der Sortierreihenfolge enthält, einschließlich der Großbuchstaben B
bis Z
.
Bei allen getesteten Systemen wird das en_US
Gebietsschema generiert. Ich habe auch versucht, das Gebietsschema zu ändern: Auf den Computern, auf denen B
die oben angegebenen Übereinstimmungen vorliegen, geschieht dasselbe in jedem verfügbaren Gebietsschema (meistens lateinisch: {en_{AU,CA,GB,IE,US},fr_FR,it_IT,es_ES,de_DE}{iso8859-1,iso8859-15,utf-8}
auch chinesisch) mit Ausnahme von Japanisch (in allen verfügbaren Codierungen) und C
/ POSIX
.
Was bedeuten Zeichenbereiche in regulären Ausdrücken , wenn Sie über ASCII hinausgehen? Warum gibt es einen Unterschied zwischen einigen Debian-Installationen einerseits und anderen Debian-Installationen und Ubuntu andererseits? Wie verhalten sich andere Systeme? Wer hat Recht und gegen wen sollte ein Fehler gemeldet werden?
(Beachten Sie, dass ich speziell nach dem Verhalten von Zeichenbereichen frage, z. B. [a-z]
in en_US
Gebietsschemas, hauptsächlich auf GNU libc-basierten Systemen. Ich frage nicht, wie Kleinbuchstaben oder ASCII-Kleinbuchstaben verglichen werden sollen.)
Auf zwei Debian - Maschinen, ein , wo B
in ist [a-z]
und eine , wo dies nicht der Fall, wird der Ausgang des LC_COLLATE=en_US locale -k LC_COLLATE
IS
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=1
collate-codeset="ISO-8859-1"
und die Ausgabe von LC_COLLATE=en_US.utf8 locale -k LC_COLLATE
ist
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=2039
collate-codeset="UTF-8"
C
Gebietsschema als Fallback verwendet, und seine Sortierreihenfolge besteht aus geraden Bytewerten, sodass B
keine Übereinstimmung erzielt wird. Testen Sie in einem Gebietsschema, das in der Ausgabe von angezeigt wird locale -a
.
en_US
generiert wurde.