Локализация и кириллица в консоли


При использовании кириллических символов мы можем столкнуться с ситуацией, когда вместо кириллических символов отображаются непонятные знаки. Особенно это актуально для ОС Windows. И в этом случае необходимо явным образом задать текущую локаль (культуру) для вывода символов. В Си это делается с помощью функции setlocale(), определение которой имеется в заголовочном файле locale.h.

Итак, изменим код, который использовался в прошлых темах следующим образом:

1
2
3
4
5
6
7
#include <stdio.h>

int main(void)
{
printf("Привет мир! \n");
return 0;
}
Компиляция и запуск в ОС Windows может выглядеть следующим образом:

Русский язык в Си в консоли
Вместо русских слов я получаю непонятные символы, и это не то, что ожидалось. Теперь изменим код, применив функцию setlocale:

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <locale.h>

int main(void)
{
char *locale = setlocale(LC_ALL, "");

printf("Привет мир! \n");
return 0;
}
Поскольку функция setlocale определена в файле locale.h, то он подключается с помощью директивы #include <locale.h>.

Повторно компилируем и запустим приложение:

Кириллица в консоли в Си
Стоит отметить, что в качестве кодировки текстового файла в этом случае должна использоваться кодировка ANSI или Windows-1251, но не UTF-8.

На некоторых платформах, например, Ubuntu 16.04, мы можем не столкнуться с подобной проблемой. И в этом случае вызов функции setlocale просто не окажет никакого влияния.