Что составляет один символ для 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 '[Д]'
Г
Д
$