Моя установка: glibc 2.24, gcc 6.2.0, среда UTF-8.Почему функции wctype.h не работают без setlocale()?
Рассмотрим следующий пример:
#include <wchar.h>
#include <wctype.h>
#include <locale.h>
int main(void)
{
setlocale(LC_CTYPE, "en_US.UTF-8");
wchar_t wc = L'я'; /* 00000100 01001111 */
if (iswlower(wc)) return 0;
return 1;
}
компилировать и запустить его:
$ gcc test.c
$ ./a.out; echo $?
0
Теперь удалить setlocale()
и запустить снова. Результат отличается:
$ gcc test.c
$ ./a.out; echo $?
1
Технически setlocale()
здесь не требуется, так как функции от wctype.h
работы с широкими символами, которые имеют фиксированную кодировку. (Само собой разумеется, что setlocale()
требуется, если мы хотим, чтобы функции от ctype.h
работали корректно с символами, отличными от ASCII, и если мы используем функции преобразования символов из wchar.h - для установки внешней кодировки.)
Почему пример не работает Работа без setlocale()
?
Как еще он узнает, какой алфавит использовать? –
@ IgnacioVazquez-Abrams ISO10646 - он фиксируется для широких символов. https://www.gnu.org/software/libc/manual/html_node/Extended-Char-Intro.html –
ISO 10646 не называет алфавита. –