Компилируя консольные приложения на славном языке программирования 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 не нужен.
}
Вот и всё.
#include
#include
using namespace std;
int main()
{
setlocale( LC_ALL, “Russian” );
cout << "Типа привет\n";
return 0;
}
Аргумент типа char* несовместим с параметром типа LPCWSTR.
Вот какую байду выдаёт VS C++ 2010 (на CharToOem)
При попыкте перевести типы, даёт ошибку (фатальную)
Кстати, setlocale( LC_ALL, «Russian» ); работает только на вывод, а на ввод – нет.
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
cout << "Привет, мир!" << endl;
return 0;
}
а можно просто в начале функции main написать следующее:
std::locale::global(std::locale(“.1251”));
Комментарий от impeller (дополняю ваш комментарий)
перед тем как писать функцию
setlocale( LC_ALL, “Russian” )
подключите библиотеку #include
#include
Друзья, лучший из комментариев –
//// специально для вывода русских букв
// setlocale(LC_ALL,”Russian”);
// cout << "Лучший из всех !!!";
Спасибо большое "я тут мимоходом [ Октябрь 23, 2009, 23:27 ]"
Steiner, спасибо Вам огромное! Ваш метод очень помог мне! К тому же он самый короткий и простой! А я всё с функциями CharToOem() OemToChar() мучался!
// Файл тестировался в интегрированной среде разработке 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;
//}
Листинг ввёлся как-то коряво ….
Для вывода русских букв добавляем в тело программы
setlocale(0, “”);
Для 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