regcomp
(from glibc) - это функция POSIX для компиляции регулярных выражений.Что представляет собой один символ для regcomp? Какое многобайтное кодирование действительно определяет это?
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=
$