Моя программа C читает и записывает данные исключительно в UTF-8. Он также использует функции регулярных выражений POSIX. Я хочу, чтобы эти функции, в частности regexec(3)
, всегда соответствовали тексту UTF-8, чтобы [:alpha:]
соответствовала буквенным символам, в том числе в UTF-8, например, 'é'
(латинская маленькая буква «е» с ударением). regexec(3)
зависит от локали, и, если текущая локаль действительно UTF-8, это работает так, как я хочу).
Однако я также читал, что принудительное использование UTF-8 для всей программы - это неправильно. (Помимо прочего, я предполагаю, что системные ошибки не будут в предпочитаемом пользователем языковом стандарте.)
Так что, если я форсирую UTF-8 только для вызова regexec(3)
, а затем возвращаю его, как было, например, с учетом этого:
void setlocale_utf8( void ) {
if ( !setlocale( LC_CTYPE, "UTF-8" ) && !setlocale( LC_CTYPE, "UTF8" ) ) {
fprintf( stderr, "setlocale() failed\n" );
// do something
}
}
сделай это:
setlocale_utf8();
int err_code = regexec( re, utf8_str_to_match, re->re_nsub + 1, match, 0 );
setlocale( LC_CTYPE, "" ); // put locale back to the user's preferred locale
Является ли это нормальным способом убедиться, что regexec(3)
всегда совпадает с использованием UTF-8? Есть ли способ лучше?