вторник, 15 марта 2011 г.

Отображение кириллических символов в консоли

1. Вариант
Использовать широкие символы
Редактор кода настраивается на ввод символов в кодировке UTF-8
Settings -> Editor… -> General Settings -> Other settings -> Encoding и выбрать UTF-8.
Теперь в тексте программы один символ кодируется двумя байтами, тип которого соответствует wchar_t (тип данных стандарта ANSI/ISO C для представления широких символов). Теперь в программе надо использовать функции, которые умеют обрабатывать wchar_t символы и корректно выполнять ввод/вывод. Обычно имена функций работающих с wchat_t начинаются с символа ‘w’, стоящим перед именем аналогичной функции, но работающей с char, например,
int wprintf( const wchar_t *format [, argument]... ) ; /*аналогична printf */
int wscanf( const wchar_t *format [, argument]... ) ; /* scanf */

В Windows API, тип wchar_t имеет размер 16 бит.
В GNU/Linux тип wchar_t имеет размер 32 бита.

Пример:
/*Компилятор MinGW*/
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main()
{
setlocale(0,".866");/*Локаль, без этой строки не будет работать*/
wprintf(L"Привет!\n"); /*L – указываем, что используются широкие символы в строке*/
return 0;
}

2. Вариант
Использовать Win32Api функцию CharToOem
Текст программы имеет кодировку WINDOWS-1251 или ANSI, функция CharToOem вызывается обычно перед выводом в консоль какого-либо текста с кириллическими символами.

Пример:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main()
{
char s[] = "Текст";
CharToOem(s,s);/*Перекодируем s, после этого вызова s меняет своё значение*/
printf("%s",s);
return 0;
}

3. Вариант
Использование шрифта Lucida Console в консоли
// установить вручную шрифт Lucida Console в свойствах окна консоли
// и запомнить это для всех окон с этим именем
// записать в начале программы строку
#include <windows.h>
// записать в начале функции main ()
// две следующих строки
SetConsoleCP(1251);
SetConsoleOutputCP(1251);

4. Вариант
Использовать опций компилятора для перекодировки текста программы из UTF-8 в CP866. Понятно, что можно использовать и другое направление перекодировки, типа WINDOWS-1251 в CP866. В консоли должна быть доступна команда iconv.
В командной строке делаем, например, так
gcc -finput-charset=UTF-8 -fexec-charset=CP866 main.c -o main

В CodeBlocks можно прописать эти опции в параметры компиляции для проекта
Project -> Build options -> Compiler settings -> Other options
Записываем строку:
-finput-charset=UTF-8 -fexec-charset=CP866

5. Вариант
Если используется компилятор от Microsoft (cl.exe), то достаточно прописать только локаль, строка в функции main():
setlocale(0,””);