Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VC_Lect.doc
Скачиваний:
6
Добавлен:
01.07.2025
Размер:
15 Мб
Скачать
☆

10.18.Кодовые страницы в консольных приложениях

Для получения информации об установленной в системе кодовой странице (CP – code page) или ее установке предназначены следующие функции: GetConsoleCP(), SetConsoleCP(), SetConsoleOutputCP() и GetConsoleOutputCP(). Естественно, что функции, имя которых начинается со слова Get, используются для получения информации об установленной кодовой странице, а функции, имя которых начинается с Set – для установки кодовой страницы.

Функция SetConsoleCP() устанавливает кодовую страницу, используемую при вводе символов. Консоль использует установленную кодовую страницу для трансляции ввода с клавиатуры в соответствующее значение символа:

BOOL SetConsoleCP(UINT wCodePageID);

Параметр:

wCodePageID – идентификатор кодовой страницы. Идентификаторы (номера) кодовых страниц, доступных на локальном компьютере, хранятся в реестре под ключом

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage

Если функция выполнена успешно, она возвращает ненулевое значение (true); в противном случае возвращаемое значение нулевое (false). Для получения дополнительной информации об ошибке вызовите функцию GetLastError().

Для установки кодовой страницы, используемой при выводе символов на монитор, используется функция:

BOOL SetConsoleOutputCP(UINT wCodePageID);

Параметр этой функции и возвращаемое значение аналогичны функции SetConsoleCP().

В качестве иллюстрации названных функций и проблемы использования символов кириллицы в консольных приложениях приведем фрагмент программного кода консольного приложения:

cout<<GetConsoleOutputCP()<<endl // вывод 866

<<GetConsoleCP()<<endl; // вывод 866

char Temp[200];

cin>>Temp; // ввод Украина

cout<<Temp<<endl; // вывод Украина

cout<<"Русский"<<endl; // вывод ╨єёёъшщ

strcpy(Temp,"Русский"); // засылаем слово "Русский" в переменную Temp

char Res[200];

CharToOemA(Temp,Res); /* преобразуем текст, содержащийся в Temp,

из кодировки Windows в кодировку MS DOS

(из 1251 в 866) */

cout<<Res<<endl; // вывод Русский

Как видно из приведенного фрагмента, непосредственный вывод символов кириллицы (cout<<"Русский";) на консоль не дает желаемого результата, так как символы константы, как и текст программы, сохраняются в кодировке Windows, а не MS DOS. Для проверки этого факта можете воспользоваться каким-либо редактором, который позволяет переключаться между кодировками, например, оболочкой Far, и просмотреть текст программы с символами кириллицы.

10.19.Пример консольного приложения ColorRusConsole

Готовое к выполнению приложение – файл ColorRusConsole.ехе. Листинг главного файла программы приведен ниже. Приложение скомпоновано без использования CLR и для набора символов ANSI.

//============================================================

// очистка всего дисплейного буфера (по умолчанию в нем 300 строк)

//============================================================

for (coord1.X = 0; coord1.X<80; coord1.X++)

for (coord1.Y = 0; coord1.Y<300; coord1.Y++)

{

WORD wColors = 0x70;

// изменение атрибутов цвета

WriteConsoleOutputCharacter(hStdout," ",1,coord1,&cWritten);

WriteConsoleOutputAttribute(hStdout,&wColors,1,coord1,&cWritten);

}

coord2.Y = 0; coord2.X = 20;

MyText="Убедитесь, что ВЕСЬ дисплейный буфер очищен"

" (потащите за полосу скроллинга)";

WriteConsoleOutputCharacter(hStdout,Rus(MyText),strlen(MyText),

coord2,&cWritten);

_getch();

Русифицировать (консольное) приложение можно и путем вызова функции setlocale(LC_ALL,"rus");, которая, упрощенно говоря, устанавливает русский язык в качестве языка ввода/вывода. Эту функцию достаточно вызвать один раз при запуске программы на выполнение – проще всего в начале функции _tmain().

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]