Что составляет один символ для regcomp? Какая многобайтовая кодировка определяет это?

regcomp (из glibc) - это функция POSIX для компиляции регулярных выражений.

     int regcomp(regex_t *restrict preg, const char *restrict pattern,
     int cflags);

В регулярных выражениях есть некоторые конструкции, которые зависят от идеи одного символа, например [abc],

Если используется многобайтовое кодирование и в выражении используется многобайтовая буква, интерпретация будет иной, если она будет обрабатываться как последовательность байтов или последовательность многобайтовых букв.

Здесь я иллюстрирую эту идею grep (который не должен быть таким же в этом отношении как функция C regcomp):

$ { echo Г; echo Д; } | egrep '[Д]'
Д
$ { echo Г; echo Д; } | LANG=C egrep '[Д]'
Г
Д
$ 

LANG является значением по умолчанию, если какие-либо переменные локали не заданы, поэтому возникает вопрос: какая из них повлияет на regcompИдея о кодировке.

$ locale
LANG=ru_RU.utf8
LC_CTYPE="ru_RU.utf8"
LC_NUMERIC="ru_RU.utf8"
LC_TIME="ru_RU.utf8"
LC_COLLATE="ru_RU.utf8"
LC_MONETARY="ru_RU.utf8"
LC_MESSAGES=POSIX
LC_PAPER="ru_RU.utf8"
LC_NAME="ru_RU.utf8"
LC_ADDRESS="ru_RU.utf8"
LC_TELEPHONE="ru_RU.utf8"
LC_MEASUREMENT="ru_RU.utf8"
LC_IDENTIFICATION="ru_RU.utf8"
LC_ALL=
$ 

1 ответ

Что касается grep (который не должен иметь такое же поведение, как regcompкажется, это честь LC_CTYPE для этого решения:

$ { echo Г; echo Д; } | LANG=en_US.utf8 egrep '[Д]'
Д
$ { echo Г; echo Д; } | LANG=en_US.utf8 LC_COLLATE=C egrep '[Д]'
Д
$ { echo Г; echo Д; } | LANG=en_US.utf8 LC_CTYPE=C egrep '[Д]'
Г
Д
$ 
Другие вопросы по тегам