Вывод русских букв в консольных приложениях на 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 не нужен.
}
Вот и всё.
Мухомор красный amanita muscaria купить мухомор сушеный купить muhomor.pro.
пля, библиотеки, не отобразило
вот они
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;
}
Написать комментарий