Принуждение UTF-8, но только для regexec()

Моя программа 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? Есть ли способ лучше?


person Paul J. Lucas    schedule 16.01.2017    source источник
comment
Примечание: возможно, лучше после завершения изменить языковой стандарт на предыдущий параметр (вернуть его таким, каким он был), а не предпочитаемый пользователем языковой стандарт.   -  person chux - Reinstate Monica    schedule 16.01.2017
comment
@chux Если я вообще никогда не устанавливаю локаль, то предыдущей настройкой будет локаль C, поскольку, согласно справочной странице setlocale (3): по умолчанию программы C запускаются в локали C.   -  person Paul J. Lucas    schedule 16.01.2017
comment
Верно, но эта функция могла просто работать без этого условия: предыдущий код вообще никогда не устанавливал локаль для правильной работы. Он просто должен установить локаль, выполнить свои операции, а затем восстановить. Вы выразили беспокойство по поводу принудительного использования UTF8 для всей программы. Восстанавливая, а не устанавливая значение по умолчанию, код позволяет избежать принуждения всей программы к изменению локали в другом месте.   -  person chux - Reinstate Monica    schedule 16.01.2017
comment
@chux: Хорошо, если я восстановлю, то это нормально, чтобы решить мою проблему?   -  person Paul J. Lucas    schedule 16.01.2017