Вывод русских букв в консольных приложениях на 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 не нужен.
}
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() мучался!
Для вывода русских букв добавляем в тело программы
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;
}
Написать комментарий