Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Кирилица в консоли

Ответить
Настройки темы
C/C++ - Кирилица в консоли

Новый участник


Сообщения: 18
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: Drongo
Дата: 03-02-2009
Описание: Чтобы тема не разросталась. Оформлю надлежащим образом...
Как сделать, чтобы консольные проги, написанные на С++, понимали русский... Я вообще новичок в программинге, можно по подробней??? Заранее спасибо!

-------
Единственный способ изучить новую программу-пользоваться ей как можно чаще... (с)YackoN.


Отправлено: 11:02, 25-12-2003

 

Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


Зачем так усложнять код программы, вот самый простой способ как отобразить в консоли русский язык:
Нужно открыть все волишь командную строку cmd.
Потом для удобства перейти на рабочий стол вот так:

cd "Рабочий стол" <Enter>
Documents and Settings\hda0\Рабочий стол>[/i]

А дальше, все еще проще.

echo Привет, вот и русский язык в консоли > rus.txt

Всё.
На рабочем столе создаеться текстовый документ rus.txt и оттуда копируйте текст и вставляйте в cout или еще куда нибудь. Разве это не проще? Я так всегда делаю.
За дополнительной информацией можно посмотреть в справочнике Windows о перенаправлениях потока. Все думаю обьяснил все понятнее не куда!

Последний раз редактировалось Drongo, 03-02-2009 в 10:09. Причина: Сделал чуть-чуть читабельнее


Отправлено: 00:36, 03-02-2009 | #51



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

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


Аватара для XEN_STRANGER

Старожил


Сообщения: 158
Благодарности: 4

Профиль | Отправить PM | Цитировать


Я в C++ новичёк, пишу простенькую прогу Win32 console Application (запускается она не в windows-окне,а в командной строке). Так вот при выводе на экран текста на русском, кириллические символы не отображаются, точне выводятся каляки. Например:

cout << "Введите число от 1 до 10" << endl;

Фраза на кирилице не пашет, а писать русские слова английскими буквами не прилично. Помню, что кто-то делал поддержку кирилицы, но как????????????????

Отправлено: 21:44, 20-03-2009 | #52


Аватара для Alan85

Забанен


Сообщения: 463
Благодарности: 91

Профиль | Цитировать


вот что могу предложить:
Код: Выделить весь код
#include <iostream>
#include <windows.h>
using namespace std;

char* convert(char* str)
{
  char* s;
  CharToOemA(str,s); // сама конвертация
  return s;
}
int main(int argc, char* argv[])
{
 cout<<convert("привет");
 cin.get();
 return 0;
}

Отправлено: 22:30, 20-03-2009 | #53


Аватара для XEN_STRANGER

Старожил


Сообщения: 158
Благодарности: 4

Профиль | Отправить PM | Цитировать


Alan85,

Цитата Alan85:
#include <iostream>
#include <windows.h>
using namespace std;
char* convert(char* str)
{
char* s;
CharToOemA(str,s); // сама конвертация
return s;
}
int main(int argc, char* argv[])
{
cout<<convert("привет");
cin.get();
return 0;
} »
Этот твой код после сборки и запуска exe вылетает.

Alan85, Admiral, hda0, Drongo, Durson, YackoN, Busla, ganselo, SS3,

К сожалению ни один из способов, приведённых выше, у меня не прокатил (возможно я делаю что-то не так)... Кто-нибудь объясните пошагово, я начал заниматься с++ только 3 месяца назад и мне только 15 лет.

Как вывести в консоли:

#include <iostream>
#include <windows.h>
using namespace std;

int main()
{
cout << "Ура, получилось!" << endl;
return 0;
}

Моя прога очень длинная и там очень много cout <<'оф, поэтому нужно сделать так, чтобы не пришлось всё переписывать, а добавить в заголовке какой-нить include. Вобщем если так нельзя то всё равно помогите....

Кодю я в Microsoft Visual C++ 6.0
Моя прога во вложении.

Последний раз редактировалось XEN_STRANGER, 23-02-2011 в 09:45.


Отправлено: 13:51, 21-03-2009 | #54


Аватара для Alan85

Забанен


Сообщения: 463
Благодарности: 91

Профиль | Цитировать


вот что получилось:
Код: Выделить весь код
// Windows XP SP3; BDS 2006; 21.03.2009;
// основано на материале с http://cboard.cprogramming.com/showthread.php?p=745558
#include <iostream>
#include <windows.h>
using namespace std;

typedef BOOL (WINAPI *SETCONSOLEFONT)(HANDLE, DWORD);     // прототип недокументированый функции
 SETCONSOLEFONT SetConsoleFont;

int main(int argc, char* argv[])
{
  HMODULE hmod = GetModuleHandleA("KERNEL32.DLL");     // функция здесь
  SetConsoleFont =(SETCONSOLEFONT) GetProcAddress(hmod, "SetConsoleFont");   // берем ее адрес
  if (!SetConsoleFont) {cout<<"error\n" ; exit(1);}   //   если ошибка
  SetConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE),10);  // устанавливаем 10 шрифт..
  //эксперементально установил что в обычной XP  это Lucida  Console 14.
  //хз везде это ли - покажет практика.
  SetConsoleOutputCP(1251) ;  // устанавливаем кодировку вывода
  cout<<"по русски :)";
  cin.get();
  return 0;
}

Отправлено: 18:55, 21-03-2009 | #55


Аватара для Alan85

Забанен


Сообщения: 463
Благодарности: 91

Профиль | Цитировать


В Vista и Windows 7 не работает

Отправлено: 19:19, 21-03-2009 | #56


Аватара для Alan85

Забанен


Сообщения: 463
Благодарности: 91

Профиль | Цитировать


сделал для Vista и XP одновременно (проверял на Vista SP1) :
Код: Выделить весь код
// Windows XP SP3; BDS 2006; 21.03.2009;
// основано на материале с http://cboard.cprogramming.com/showthread.php?p=745558
//  http://msdn.microsoft.com/en-us/library/ms686200(VS.85).aspx
#include <iostream>
#include <windows.h>
using namespace std;

typedef struct _CONSOLE_FONT_INFOEX {
  ULONG cbSize;
  DWORD nFont;
  COORD dwFontSize;
  UINT  FontFamily;
  UINT  FontWeight;
  WCHAR FaceName[LF_FACESIZE];
} CONSOLE_FONT_INFOEX, *PCONSOLE_FONT_INFOEX;

typedef BOOL (WINAPI *SETCONSOLEFONT)(HANDLE, DWORD);     // прототип недокументированый функции для XP

typedef BOOL (WINAPI *SETCURRENTCONSOLEFONTEX)(HANDLE,BOOL, PCONSOLE_FONT_INFOEX);  // для vista
SETCURRENTCONSOLEFONTEX SetCurrentConsoleFontEx  ;
SETCONSOLEFONT SetConsoleFont;

int main(int argc, char* argv[])
{
  OSVERSIONINFOEX osvi;
  CONSOLE_FONT_INFOEX cfon;
  ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));
  osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
  GetVersionEx((OSVERSIONINFO *) &osvi) ;   // получение версии винды
  HMODULE hmod = GetModuleHandleA("KERNEL32.DLL");     // функции здесь
  if (osvi.dwMajorVersion<6) {     // xp или ниже : для 9x не проверял.
	 SetConsoleFont =(SETCONSOLEFONT) GetProcAddress(hmod, "SetConsoleFont");   // берем  адрес функции
	 if (!SetConsoleFont) {cout<<"error\n" ; exit(1);}   //   если ошибка
	 SetConsoleFont(GetStdHandle(STD_OUTPUT_HANDLE),10);  // устанавливаем 10 шрифт..
	//эксперементально установил что в обычной XP  это Lucida  Console 14.
	//хз везде это ли - покажет практика.

  }  else
  {
	 SetCurrentConsoleFontEx =(SETCURRENTCONSOLEFONTEX) GetProcAddress(hmod, "SetCurrentConsoleFontEx");   // берем  адрес  функции
	 if (!SetCurrentConsoleFontEx) {cout<<"error\n" ; exit(1);}   //   если ошибка
	 ZeroMemory(&cfon, sizeof(CONSOLE_FONT_INFOEX));
	 cfon.cbSize=sizeof(CONSOLE_FONT_INFOEX);
	 //cfon.nFont=10;
	 cfon.FontFamily=54;   //   Lucida  Console
	 if (!SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), false, &cfon)) cout<<"error";
  }

  SetConsoleOutputCP(1251) ;  // устанавливаем кодировку вывода
  cout<<"по русски :)";
  cin.get();
  return 0;
}
А на Windows 7 7000 не пошло.. хз может потому что бета.
Это сообщение посчитали полезным следующие участники:

Отправлено: 20:22, 21-03-2009 | #57


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Цитата XEN_STRANGER:
К сожалению ни один из способов, приведённых выше, у меня не прокатил »
Попробуйте ещё так
Код: Выделить весь код
#include <iostream>
#include <windows.h>
using namespace std;

// Функция перекодировки в кирилицу
char* rus(char* st)
{
    unsigned char* p = st;  // при объявлении символов как char русские буквы
                                      // кодируются отрицательными числами
    while( *p ){
        if(*p >= 192) // здесь русская буква
            if(*p <= 239)
               *p -= 64;
            else
               *p -= 16;
        p++;
    }
    return st;
}

int main()
{
   cout << rus("Ура, получилось!") << endl;
   cin.get();
   return 0;
}

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:46, 21-03-2009 | #58


Аватара для XEN_STRANGER

Старожил


Сообщения: 158
Благодарности: 4

Профиль | Отправить PM | Цитировать


Alan85, Ура, спасибо тебе великое

Drongo, А твой пример при компиляции ссылается на:
error C2440: 'initializing' : cannot convert from 'char *' to 'unsigned char *'
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
Error executing cl.exe.

Отправлено: 20:52, 21-03-2009 | #59


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


Зачем так усложнять код программы, вот самый простой способ как отобразить в консоли русский язык:
Нужно открыть все волишь командную строку cmd.
Потом для удобства перейти на рабочий стол вот так:

cd "Рабочий стол" <Enter>
Documents and Settings\hda0\Рабочий стол>

А дальше, все еще проще.

echo Привет, вот и русский язык в консоли > rus.txt

Всё.
На рабочем столе создаеться текстовый документ rus.txt и оттуда копируйте текст и вставляйте в cout или еще куда нибудь. Разве это не проще? Я так всегда делаю.
За дополнительной информацией можно посмотреть в справочнике Windows о перенаправлениях потока. Все думаю обьяснил все понятнее не куда!

Отправлено: 21:08, 21-03-2009 | #60



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Кирилица в консоли

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Кирилица на DVD Guest Хочу все знать 3 08-05-2004 14:59
Кирилица и ересь bdn Microsoft Windows 95/98/Me (архив) 3 20-01-2004 14:02
странная кирилица dreamparadise Программирование и базы данных 2 28-07-2003 12:33
Кирилица в прогах Alex VZ Общий по Linux 20 19-07-2003 17:09
Кирилица и Сидиром Pink Punk Общий по Linux 11 14-03-2003 06:03




 
Переход