C/C++ - Кирилица в консоли

Ответить
 • Просмотры: 1
Аватара пользователя
Drongo

Re: C/C++ - Кирилица в консоли

Сообщение Drongo »

SS3, Прочитайте с самого начала, возможно решение предложенное Durson'ом, вам подойдёт.
Аватара пользователя
ganselo

Re: C/C++ - Кирилица в консоли

Сообщение ganselo »

Видил в книге "Павловска ООП" пример написания класса для ввода/вывода кириллицы. Там при вызове cout/cin из заголовочного файла iostream.h подменялись на "наши" cout/cin и тем самым текст написанный на кириллице выводился нормально. Код проги предназначался для компиляции на Visual C++ 6.0. Увы данного компилятора у меня не было и поэтому я не смог потестировать(побывал компилировать на MinGW, но было куча не понятных ошибок).
Аватара пользователя
Drongo

Re: C/C++ - Кирилица в консоли

Сообщение Drongo »

вот что могу предложить:

Код: Выделить всё

#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;
}
Аватара пользователя
ganselo

Re: C/C++ - Кирилица в консоли

Сообщение ganselo »

Alan85,




Цитата Alan85:



#include

#include

using namespace std;

char* convert(char* str)

{

char* s;

CharToOemA(str,s); // сама конвертация

return s;

}

int main(int argc, char* argv[])

{

cout
Аватара пользователя
XEN_STRANGER

Re: C/C++ - Кирилица в консоли

Сообщение XEN_STRANGER »

вот что получилось:

Код: Выделить всё

// 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;
}
Аватара пользователя
Alan85

Re: C/C++ - Кирилица в консоли

Сообщение 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;
}
Аватара пользователя
XEN_STRANGER

Re: C/C++ - Кирилица в консоли

Сообщение XEN_STRANGER »

сделал для 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 не пошло.. хз может потому что бета.
Аватара пользователя
Alan85

Re: C/C++ - Кирилица в консоли

Сообщение Alan85 »

Цитата XEN_STRANGER:



К сожалению ни один из способов, приведённых выше, у меня не прокатил
C/C++ - Кирилица в консоли




Попробуйте ещё так

Код: Выделить всё

#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;
}
Аватара пользователя
Alan85

Re: C/C++ - Кирилица в консоли

Сообщение Alan85 »

В Vista и Windows 7 не работает Изображение
Аватара пользователя
Alan85

Re: C/C++ - Кирилица в консоли

Сообщение Alan85 »

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

Нужно открыть все волишь командную строку cmd.

Потом для удобства перейти на рабочий стол вот так:



cd "Рабочий стол"

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



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



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



Всё.

На рабочем столе создаеться текстовый документ rus.txt и оттуда копируйте текст и вставляйте в cout или еще куда нибудь. Разве это не проще? Я так всегда делаю.

За дополнительной информацией можно посмотреть в справочнике Windows о перенаправлениях потока. Все думаю обьяснил все понятнее не куда!
Ответить

Вернуться в «Программирование и базы данных»