Je joue un peu avec les locales et les classes de caractères en regex,
et je découvre que chez moi :
mpg@roth:~% env | egrep 'LANG|LC_'
LANG=fr_FR.utf8
mpg@roth:~% printf 'e\n\303\251\n\303\250\n' | \grep '[[:alpha:]]'
e
é
è
mpg@roth:~% printf 'e\n\303\251\n\303\250\n' | \grep '[[=e=]]'
e
Je me demande pourquoi « é » et « è » ne sont pas considérés comme
équivalents à « e ».
En fait, qui spécifie quels caractères sont censés être équivalents
(Unicode, l'Académie française, ...) et où cette information est-elle
stockée sur ma machine (sous Debian GNU/Linux) ?
Par ailleurs, les locales « C » et « POSIX » sont-elles toujours
équivalentes ?
--
Manuel Pégourié-Gonnard Institut de mathématiques de Jussieu
http://weblog.elzevir.fr/ http://people.math.jussieu.fr/~mpg/
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Vincent Lefevre
Bonjour,
Dans l'article <i43vq7$u12$, Manuel Pégourié-Gonnard écrit:
:~% env | egrep 'LANG|LC_' LANG=fr_FR.utf8 :~% printf 'en303251n303250n' | grep '[[:alpha:]]' e é è :~% printf 'en303251n303250n' | grep '[[=e=]]' e
Je me demande pourquoi « é » et « è » ne sont pas considérés comme équivalents à « e ».
Et le [[=e=]] ne semble pas fonctionner du tout dans les locales non UTF-8:
for i in C POSIX fr_FR.ISO8859-1 fr_FR.UTF-8 do echo $i && echo e | LC_ALL=$i grep '[[=e=]]' done
C POSIX fr_FR.ISO8859-1 fr_FR.UTF-8 e
Cette forme n'est même pas décrite dans la page man de grep (sous Linux).
En fait, qui spécifie quels caractères sont censés être équivalents (Unicode, l'Académie française, ...) et où cette information est-elle stockée sur ma machine (sous Debian GNU/Linux) ?
Je ne sais pas, mais y a-t-il un lien avec les "collating characters"?
Par ailleurs, les locales « C » et « POSIX » sont-elles toujours équivalentes ?
Normalement, sur les systèmes POSIX, oui. "C" est utilisée par la norme C ISO et "POSIX" par la norme IEEE 1003.1 (POSIX.1), qui ne sont pas censées être contradictoires. POSIX dit:
The strings "C" and "POSIX" are reserved as identifiers for the POSIX locale (see POSIX Locale).
et
7.2 POSIX Locale
Conforming systems shall provide a POSIX locale, also known as the C locale.
Dans l'article <i43vq7$u12$1@thue.elzevir.fr>,
Manuel Pégourié-Gonnard <mpg@elzevir.fr> écrit:
mpg@roth:~% env | egrep 'LANG|LC_'
LANG=fr_FR.utf8
mpg@roth:~% printf 'en303251n303250n' | grep '[[:alpha:]]'
e
é
è
mpg@roth:~% printf 'en303251n303250n' | grep '[[=e=]]'
e
Je me demande pourquoi « é » et « è » ne sont pas considérés comme
équivalents à « e ».
Et le [[=e=]] ne semble pas fonctionner du tout dans les locales
non UTF-8:
for i in C POSIX fr_FR.ISO8859-1 fr_FR.UTF-8
do
echo $i && echo e | LC_ALL=$i grep '[[=e=]]'
done
C
POSIX
fr_FR.ISO8859-1
fr_FR.UTF-8
e
Cette forme n'est même pas décrite dans la page man de grep
(sous Linux).
En fait, qui spécifie quels caractères sont censés être équivalents
(Unicode, l'Académie française, ...) et où cette information est-elle
stockée sur ma machine (sous Debian GNU/Linux) ?
Je ne sais pas, mais y a-t-il un lien avec les "collating characters"?
Par ailleurs, les locales « C » et « POSIX » sont-elles toujours
équivalentes ?
Normalement, sur les systèmes POSIX, oui. "C" est utilisée par la
norme C ISO et "POSIX" par la norme IEEE 1003.1 (POSIX.1), qui ne
sont pas censées être contradictoires. POSIX dit:
The strings "C" and "POSIX" are reserved as identifiers for the
POSIX locale (see POSIX Locale).
et
7.2 POSIX Locale
Conforming systems shall provide a POSIX locale, also known as
the C locale.
Dans l'article <i43vq7$u12$, Manuel Pégourié-Gonnard écrit:
:~% env | egrep 'LANG|LC_' LANG=fr_FR.utf8 :~% printf 'en303251n303250n' | grep '[[:alpha:]]' e é è :~% printf 'en303251n303250n' | grep '[[=e=]]' e
Je me demande pourquoi « é » et « è » ne sont pas considérés comme équivalents à « e ».
Et le [[=e=]] ne semble pas fonctionner du tout dans les locales non UTF-8:
for i in C POSIX fr_FR.ISO8859-1 fr_FR.UTF-8 do echo $i && echo e | LC_ALL=$i grep '[[=e=]]' done
C POSIX fr_FR.ISO8859-1 fr_FR.UTF-8 e
Cette forme n'est même pas décrite dans la page man de grep (sous Linux).
En fait, qui spécifie quels caractères sont censés être équivalents (Unicode, l'Académie française, ...) et où cette information est-elle stockée sur ma machine (sous Debian GNU/Linux) ?
Je ne sais pas, mais y a-t-il un lien avec les "collating characters"?
Par ailleurs, les locales « C » et « POSIX » sont-elles toujours équivalentes ?
Normalement, sur les systèmes POSIX, oui. "C" est utilisée par la norme C ISO et "POSIX" par la norme IEEE 1003.1 (POSIX.1), qui ne sont pas censées être contradictoires. POSIX dit:
The strings "C" and "POSIX" are reserved as identifiers for the POSIX locale (see POSIX Locale).
et
7.2 POSIX Locale
Conforming systems shall provide a POSIX locale, also known as the C locale.