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

Страницы

Промо

Вывод русских букв в консольных приложениях на 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 не нужен.
}

Вот и всё.

Комментарии

Комментарий от [NNT]Paha [ 26 мая, 2008, 01:19 ]

этого не надо (delete[] buf;) так как не было динамического выделения памяти
и еще надо подключить iostream.h для cout
вот рабочий код

#include
#include
#include
using namespace std;

int main(int argc, char* argv[])
{
char str[10] = “мама мыла”;
char buf[10];
CharToOem(str, buf);
cout << buf << endl;
getch();
return 0;
}

Комментарий от [NNT]Paha [ 26 мая, 2008, 01:20 ]

пля, библиотеки, не отобразило
вот они
windows.h для функции CharToOem
iostream.h для вывода cout
conio.h для задержки экрана getch()

Комментарий от Gekko [ 27 мая, 2008, 10:15 ]

А как сделать так чтоб он весь русский текст выводил нормально? а то если много русских строчек, неудобно делать перевод для каждой или функцию, которая их транслирует.
PS вместо getch() удобнее пользоваться system(“pause”); он без библиотек идет

Комментарий от Марат [ 29 сентября, 2008, 13:20 ]

#include
#include
#include
using namespace std;
int main(int nNumberofArgs, char* pszArgs[])
{

char buf[256]; // размер буфера зависит от размера исходной строки
::CharToOem( “Привет, Мир!\n”, buf );
cout << buf << endl;

system (“PAUSE”);
return 0;
}

Комментарий от Андрей [ 6 октября, 2008, 09:45 ]

#include
#include
#include

int main(int nNumberofArgs, char* pszArgs[])
{

char buf[256]; // размер буфера зависит от размера исходной строки
::CharToOem( “Привет, Мир!\n”, buf );
cout << buf << endl;

system (“PAUSE”);
return 0;
}
вот что вывела консоль:
Привет, Мир!

Для продолжения нажмите любую клавишу . . .
Press any key to continue

Комментарий от booleaner [ 27 ноября, 2008, 00:08 ]

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

void main()
{
system(“echo”);
system(“echo “);
}

Комментарий от throw 777 [ 5 января, 2009, 20:47 ]

Для удобство можно все это загнать в препроцессор и через define сократить до одной команды.

include
include
using namespace std;
define cyrOut(_string_) CharToOem(_string_,szStr);\
cout << szStr

char szStr[512];
int main()
{
cyrOut(“Хэллоу Уорлд”);
system(“Pause”);
return 0;
}

перед include и define ставим, естественно #

Комментарий от throw 777 [ 5 января, 2009, 20:49 ]

Ахаха… Движом форума прочитал названия библиотек, как хтмл-теги. Ну вы поняли – библиотеки – iostream и windows.h

Комментарий от Dima [ 6 февраля, 2009, 01:44 ]

Error 1 error C2664: ‘CharToOemW’ : cannot convert parameter 1 from ‘const char [14]’ to ‘LPCWSTR’ – вот какая красота выходит в Visual Studio 2005, и как с ней бороться???

Комментарий от teetUnlonee [ 2 марта, 2009, 19:11 ]

Все хотел спросить – почему выбрали именно домен http://www.makak.ru?

Комментарий от Федька [ 19 мая, 2009, 01:13 ]

cyrOut(”Хэллоу Уорлд”);
system(”Pause”);

с такими кавычками компилятор выдал 17 ошибок)))

ставьте обычные ” “

Комментарий от admin [ 19 мая, 2009, 09:34 ]

Кавычки преобразовал движок сайта =) я ставил обычные.

Комментарий от Grom [ 26 сентября, 2009, 12:14 ]

Error 1 error C2664: ‘CharToOemW’ : cannot convert parameter 1 from ‘const char [14]’ to ‘LPCWSTR’ – вот какая красота выходит в Visual Studio 2005, и как с ней бороться???

это ругань на то что юзается уникод версия функции, о чем говорит W в конце.
правится: Проект – Свойства – General – Set Character = Multy-Byte

Комментарий от я тут мимоходом [ 23 октября, 2009, 23:27 ]

Чтобы во всей программе спокойно использовать русские буквы, достаточно один раз (где-нибудь в начале) прописать:
[code]#include

setlocale( LC_ALL, “Russian” );[/code]

Комментарий от я тут мимоходом [ 23 октября, 2009, 23:29 ]

Мда, движок сайта жжот… BB коды не принимает.
Нужно:
#include &ltlocale&gt

Комментарий от я тут мимоходом [ 23 октября, 2009, 23:29 ]

Тьфу…

Ну вы поняли :)

Комментарий от Seefrau [ 21 декабря, 2009, 09:41 ]

Для вывода русских букв в консоли Visual C++, достаточно в тело программы (можно в main) записать следующее:

setlocale(0, “”);

Комментарий от impeller [ 15 января, 2010, 21:21 ]

Ну вы блин жжоте.

setlocale(LC_ALL,”Russian”);

и всё. В первую очередь надо у MSDN спрашивать.
https://msdn.microsoft.com/en-us/library/x99tb11d.aspx

Комментарий от Trifon [ 18 января, 2010, 20:52 ]

Спасибо большое все работает

Комментарий от Ivan [ 20 августа, 2010, 20:09 ]

Большое СПАСИБО. Я раньше решал проблему по-другому. Сначала я вывел в консоль 255 символов и увидел среди них русские. Таблица символов была “не на своём месте” и к тому же с разрывом. Я сделал соответствующие корректировки:

#include “iostream”
#include “string”
using namespace std;
void WriteRussianString(string stringForWrite);
main() {
WriteRussianString(“Привет, Мир!!!”);
getchar();
return 0;
}

void WriteRussianString(string stringForWrite) {
// коды начала и конца первого отрезка русского алфавита
unsigned long beginOtrezok_1_RusABC = 0x0FFFFFFC0;
unsigned long endOtrezok_1_RusABC = 0x0FFFFFFEF;
// коды начала и конца второго отрезка русского алфавита
unsigned long beginOtrezok_2_RusABC = 0x0FFFFFFF0;
unsigned long endOtrezok_2_RusABC = 0x0FFFFFFFF;

// переменная для временного хранения символов
char charTemp;

// порядковый номер символа в принятой строке
int count_char = 0;

charTemp = stringForWrite[count_char];
// перебираем символы в входной строке, корректируем их коды и
// и выводим эти символы
while (charTemp != ”) {
count_char++;

// коррекция символов из первого и второго интервала русских символов
char charForPrint;
unsigned long codeCharTemp;
codeCharTemp = (unsigned long)charTemp;
if ((beginOtrezok_1_RusABC <= codeCharTemp ) && (codeCharTemp <= endOtrezok_1_RusABC)) {
charForPrint = char(codeCharTemp-64);
cout << charForPrint;
}
else {
if ((beginOtrezok_2_RusABC <= codeCharTemp ) && (codeCharTemp <= endOtrezok_2_RusABC)) {
charForPrint = char(codeCharTemp-16);
cout << charForPrint;
}
else {
cout << charTemp;
}
}
charTemp = stringForWrite[count_char];
}
cout << endl;
}

Комментарий от Ivan [ 20 августа, 2010, 20:24 ]

Пользуюсь кодом по совету Марата. Марат СПАСИБО!!!

Комментарий от Евгений [ 17 декабря, 2010, 17:49 ]

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

void print_rus(const char c[])
{
char ch;
for (int i=0;c[i]!=0;i++)
{
ch=c[i];
if ((ch>=’А’)&(ch=’р’)&(ch<='я')) ch-=16;
else if (ch=='Ё') ch+=72;
else if (ch=='ё') ch+=57;
else if (ch=='№') ch+=67;
cout<<ch;
}
}

Воплощение её в основной программе:
void main()
{
print_rus ("Сообщение на русском языке");
}

Комментарий от Евгений [ 17 декабря, 2010, 17:53 ]

Прошу прощения, ошибся.

void print_rus(const char c[])
{
char ch;
for (int i=0;c[i]!=0;i++)
{
ch=c[i];
if ((ch>=’А’)&(ch=’р’)&(ch<='я')) ch-=16;
else if (ch=='Ё') ch+=72;
else if (ch=='ё') ch+=57;
else if (ch=='№') ch+=67;
cout<<ch;
}
}

Комментарий от Евгений [ 17 декабря, 2010, 17:55 ]

void print_rus(const char c[])
{
char ch;
for (int i=0;c[i]!=0;i++)
{
ch=c[i];
if ((ch>=’А’)&(ch=’р’)&(ch<='я')) ch-=16;
else if (ch=='Ё') ch+=72;
else if (ch=='ё') ch+=57;
else if (ch=='№') ch+=67;
cout<<ch;
}
}

Комментарий от Эльдар [ 5 января, 2011, 11:09 ]

#include
#include
#include
using namespace std;
char* Rus(const char* text);
int main() {
cout << Rus("\nпривет мир\n");
cout << Rus("бла бла бла\n");
cout << Rus("пока всем\n");
getch();
return 0;
}
// ф-ция русификации
char buf[256]; // за пределами функции
char* Rus(const char* text)
{

CharToOem(text, buf);
return buf;
}

Комментарий от Эльдар [ 5 января, 2011, 11:12 ]

инклуды стандартные:
iostream
windows.h
conio.h

Комментарий от ARTHUR [ 10 мая, 2011, 10:36 ]

САМЫЙ ЛЕГКИЙ И ЭФФЕКТИВНЫЙ МЕТОД

Запускаем консоль, щелкаем на заголовке окна и выбираем свойства.
В свойствах на закладке Шрифт ставим шрифт Lucida Console и жмем
ОК. Чтобы вид консули не сильно отличился от обычной, ставим галочку
жирный и потом жмем ОК.

Далее набираем в консоли ChCp 1251, в ответ получаем Текущая
кодовая страница: 1251. Теперь запускаем С++ программу и
убеждаемся, что все работает. При желании можно написать bat-файл
куда вставить ChCp 1251 и создать для этого файла ярлык, в
свойствах которого прописать шрифт Lucida Console.

Допустим в коммандной строке шрифт ставили Lucida Console.
То можно данный скрипт сохранить в BAT файле, и насладится.

@echo off
chcp 1251
cls
cmd /k C:\Welcome.exe

На мой взгляд данный метод самый простой и самый эффективный, но
о ней проктически не пишут. Работает с Visual Studio, C++BuilderX,
wxDev-C++ и другимы компиляторамы.

Комментарий от karen [ 26 мая, 2011, 15:46 ]

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

Комментарий от Arakul [ 28 мая, 2011, 10:20 ]

include \
include \

int main()
{
setlocale(0,””);
std::cout<<"Все будет по-русски"<<std::endl;
return 0;
}

Комментарий от Arakul [ 28 мая, 2011, 10:20 ]

iostream и locale в инклуде

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








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

Статистика

Мета

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