Вывод русских букв в консольных приложениях на 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 не нужен.
}
пля, библиотеки, не отобразило
вот они
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
Комментарий от 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 ]
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 <locale>
Комментарий от я тут мимоходом
[ 23 октября, 2009, 23:29 ]
Тьфу…
Ну вы поняли :)
Комментарий от Seefrau
[ 21 декабря, 2009, 09:41 ]
Для вывода русских букв в консоли Visual C++, достаточно в тело программы (можно в main) записать следующее:
setlocale(0, “”);
Комментарий от impeller
[ 15 января, 2010, 21:21 ]
Большое СПАСИБО. Я раньше решал проблему по-другому. Сначала я вывел в консоль 255 символов и увидел среди них русские. Таблица символов была “не на своём месте” и к тому же с разрывом. Я сделал соответствующие корректировки:
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;
}
Написать комментарий