L' ordine di confronto attraverso LC_COLLATE
definisce non solo l'ordinamento dei singoli caratteri, ma anche il significato delle gamme di caratteri. O lo fa? Considera il seguente frammento:
unset LANGUAGE LC_ALL
echo B | LC_COLLATE=en_US grep '[a-z]'
Intuitivamente, B
non è presente [a-z]
, quindi questo non dovrebbe produrre nulla. Questo è ciò che accade su Ubuntu 8.04 o 10.04. Ma su alcune macchine che eseguono Debian Lenny o squeeze, B
si trova, perché la gamma a-z
include tutto ciò che è tra le a
e z
nell'ordine collazione, incluse le lettere maiuscole B
attraverso Z
.
Tutti i sistemi testati hanno la en_US
localizzazione generata. Ho anche provato a variare le impostazioni locali: sulle macchine in cui B
è presente la corrispondenza sopra, lo stesso accade in tutte le {en_{AU,CA,GB,IE,US},fr_FR,it_IT,es_ES,de_DE}{iso8859-1,iso8859-15,utf-8}
impostazioni locali disponibili (principalmente in latino:, anche in cinese) eccetto il giapponese (in qualsiasi codifica disponibile) e C
/ POSIX
.
Cosa significano le gamme di caratteri nelle espressioni regolari , quando vai oltre ASCII? Perché c'è una differenza tra alcune installazioni Debian da un lato e altre installazioni Debian e Ubuntu dall'altro? Come si comportano gli altri sistemi? Chi ha ragione e chi dovrebbe avere un bug segnalato contro?
(Si noti che sto specificatamente chiedendo informazioni sul comportamento degli intervalli di caratteri, ad esempio [a-z]
nelle en_US
versioni locali, principalmente sui sistemi basati su libc GNU. Non sto chiedendo come abbinare le lettere minuscole o le lettere minuscole ASCII.)
Su due macchine Debian, una in cui si B
trova [a-z]
e una in cui non lo è, l'output di LC_COLLATE=en_US locale -k LC_COLLATE
è
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=1
collate-codeset="ISO-8859-1"
e l'output di LC_COLLATE=en_US.utf8 locale -k LC_COLLATE
è
collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=2039
collate-codeset="UTF-8"
C
locale viene utilizzata come fallback e il suo ordine di confronto è costituito da valori di byte diretti, quindi B
non verrà abbinato. Test in una locale che appare nell'output di locale -a
.
en_US
Tuttavia, non ho verificato se è stato generato.