Познавательный блог Мобильная врсия

Страницы

Промо

Вывод русских букв в консольных приложениях на C++

Компилируя консольные приложения на славном языке программирования C++ постоянно сталкиваешься с проблемой кодировок. Русские буквы выводятся каракулями, а с английскими все в порядке. Дело в кодировках. В консоли Windows используется кодировка OEM. А в самой ОС Windows - ANSI кодировка.

Для избежания проблем с выводом русских букв в консоль мы будем пользоваться функцией CharToOem.

Функция CharToOem преобразует строку в набор символов ОЕМ. Эта функция противоположна функции AnsiToOem.

BOOL CharToOem (
LPCTSTR lpszSrc , // указатель на преобразуемую строку
LPSTR lpszDst // указатель на буфер для преобразованной строки
);

Параметры

lpszSrc - указывает на завершающуюся нулем преобразуемую строку.
lpszDst - указывает на буфер для преобразованной строки. Если CharToOem используется как ANSI -функция, то можно установить параметр lpszDst на тот же адрес, что и параметр lpszSrc . Это не может быть осуществлено в случае использования CharToOem как Unicode -функции.

Пример ниже показывает вывод русских букв в консоль. Для этого нужно подключить библиотеку "windows.h". Функция CharToOem выполняет преобразование.

Преобразование нужно проводить только для вывода на экран, для вывода в файл или внутренней работы с переменными это делать не нужно.

#include <windows.h> //нужна для функции CharToOem

void main()
{

char buf[10];
char str[10]="qwertyuiop";
CharToOem(str, buf); //преобразование
cout<<buf<<endl;
delete[] buf; //Больше нам массив buf не нужен.
}

Вот и всё.

Комментарии

Комментарий от Прохожий [ 3 июня, 2011, 01:15 ]

#include
#include

using namespace std;
int main()
{
setlocale( LC_ALL, “Russian” );

cout << "Типа привет\n";
return 0;
}

Комментарий от Я [ 10 июля, 2011, 08:11 ]

Аргумент типа char* несовместим с параметром типа LPCWSTR.
Вот какую байду выдаёт VS C++ 2010 (на CharToOem)
При попыкте перевести типы, даёт ошибку (фатальную)

Кстати, setlocale( LC_ALL, «Russian» ); работает только на вывод, а на ввод – нет.

Комментарий от STALKER [ 16 июля, 2011, 12:48 ]

#include <iostream>
#include <windows.h>

using namespace std;
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);

cout << "Привет, мир!" << endl;
return 0;
}

Комментарий от Steiner [ 30 августа, 2011, 17:19 ]

а можно просто в начале функции main написать следующее:
std::locale::global(std::locale(“.1251”));

Комментарий от alena [ 7 февраля, 2012, 21:00 ]

Комментарий от impeller (дополняю ваш комментарий)
перед тем как писать функцию
setlocale( LC_ALL, “Russian” )
подключите библиотеку #include

Комментарий от alena [ 7 февраля, 2012, 21:04 ]

#include

Комментарий от Артур [ 26 февраля, 2012, 11:57 ]

Друзья, лучший из комментариев –
//// специально для вывода русских букв
// setlocale(LC_ALL,”Russian”);
// cout << "Лучший из всех !!!";

Спасибо большое "я тут мимоходом [ Октябрь 23, 2009, 23:27 ]"

Комментарий от Ejas Tower [ 1 мая, 2012, 14:35 ]

Steiner, спасибо Вам огромное! Ваш метод очень помог мне! К тому же он самый короткий и простой! А я всё с функциями CharToOem() OemToChar() мучался!

Комментарий от Игорь [ 1 июня, 2012, 18:28 ]

// Файл тестировался в интегрированной среде разработке C++ Builder 2009
//—————————————————————————
#pragma hdrstop

#include
#include
#include
#include
#include
//—————————————————————————

#pragma argsused

char * RU(char * s); // прототип функции, реализация ниже
char * RU_T(char * s); // прототип функции, реализация ниже
//int strcmp(char * s, char * t); // прототип функции, реализация ниже

int _tmain(int argc, _TCHAR* argv[])
{
int var;
char * buffer;

var = 155;
printf( RU(“\”Говорит\” frintf\n\n”) );
cout << RU("\"Говорит\" cout\n\n");
printf(RU("printf: Переменная var = %d\n\n"), var);
cout << RU("cout: Переменная var = ") << var << "\n\n";
buffer = RU("переменная buffer в printf: Консоль \"понимает\" русские буквы\n\n");
printf(buffer);
buffer = RU("переменная buffer в cout: Консоль \"понимает\" русские буквы\n\n");
cout << buffer;

cout <> buffer;

RU_T(buffer); // Перекодирует строку для сравнения с образцом

if ( strcmp(“Любовь”, buffer) == 0 )
cout << RU("\nПравильно, вы ввели: ") << RU(buffer);
else
cout << RU("\nНеверно, вы ввели: ") << RU(buffer);

cout <=-64 && s<=-17)
s = char(s+64+128);
else if(s=char(-64+64+128) && s<=char(-17+64+128))
s = s – char(64+128);
else if (s<char(64+176))
s = s – char(64+176);
else
s = s;
return s;
}
//—————————————————————————
// strcmp: выдает < 0 при s 0 при s > t
//int strcmp(char * s, char * t) // реализация функции
//{
// for ( ; *s == *t; s++, t++)
// if (*s == ”)
// return 0;
// return *s – *t;
//}

Комментарий от Игорь [ 1 июня, 2012, 18:32 ]

Листинг ввёлся как-то коряво ….

Комментарий от Павел [ 8 октября, 2012, 23:56 ]

Для вывода русских букв добавляем в тело программы
setlocale(0, “”);

Комментарий от Aleks [ 28 февраля, 2014, 17:13 ]

Для Windows 8.1 и MS Visual Studio 2013 Pro прилагаемая программа выводит русский текст, как набранный в редакторе VS 2013, так и введенный в режиме работы программы, т.е. в режиме DOS:

#include “stdafx.h”
#include

using namespace std;

int _tmain()
{
setlocale(LC_ALL, “.1251”); // Для вывода текста набранного в редакторе VS 2013
char * str = “Вывод русского текста из строки!”; // иницализируем строку
cout << str << endl; // теперь выводим нашу строку на экран
cout << "введи что-нибудь по-русски" <> s;
cout << s << endl;
system("PAUSE");
return 0;
}

// и никаких ChatToOem

Написать комментарий








Поиск по сайту

Статистика

Мета

  Разработка и дизайн — StvPromo.ru