Показать полную графическую версию : Кирилица в консоли
Подскажите как мне использовать русские символы при написании программы.
Пишу на на Dev-C++( http://www.bloodshed.net/ )
OC :Windows Vista Ultimate SP1.
А то надоело писатьVvedite symmy 4isel, хотелось бы Введите сумму чисел
Универсальный совет: "поиграйте" кодировкой файла с исходным кодом. В какой кодировке сохраняете сейчас? Какое приложение пишете - консольное или GUI?
Если не секрет, почему используете компилятор, у которого последний релиз датирован 2000 годом?
Какое приложение пишете - консольное или GUI? »
Консольное
Искал в "Сервис->Параметры компилятора" но так и не нашол кодировку.
Я помню, когда учился писать на Turbo Pascal 7.0 то что бы можна было б писать русскими символами нужно было, какие-то файлы кидать в System 32, это на Windows XP
Pliomera
18-01-2009, 03:32
А то надоело писать
Код:
Vvedite symmy 4isel, хотелось бы
Код:
Введите сумму чисел »
Может лучше написать: Enter the sum of numbers, please... ? :)
можно сменить кодовую страницу консоли командой chcp, а потом запускать ваше приложение
можно в нормальном редакторе вписать кириллицу, потом откомпилировать
концептуально правильнее символьные строки хранить во внешнем файле, а не в коде
Вот я на оф. форуме нашол файлы которые позволяют использование русского языка:
config.h.in, configure, configure.in, COPYING, INSTALL, koi.1, Makefile.in, README, rus.1, rus.c
Читал INSTALL но так нечего и не понял.
Может кто поможет мне в это проблеме.
В архиве нет вирусов, так что можете свободно качать)
SS3, Прочитайте с самого начала, возможно решение предложенное Durson'ом, вам подойдёт.
Видил в книге "Павловска ООП" пример написания класса для ввода/вывода кириллицы. Там при вызове cout/cin из заголовочного файла iostream.h подменялись на "наши" cout/cin и тем самым текст написанный на кириллице выводился нормально. Код проги предназначался для компиляции на Visual C++ 6.0. Увы данного компилятора у меня не было и поэтому я не смог потестировать(побывал компилировать на MinGW, но было куча не понятных ошибок).
Там при вызове cout/cin из заголовочного файла iostream.h подменялись на "наши" cout/cin и тем самым текст написанный на кириллице выводился нормально. »Можно ли выложить содержимое "наших" cout/cin? Или их самих?
Можно ли выложить содержимое "наших" cout/cin? Или их самих? »
Вот этот вариант:
//файл CyrIOS.h
#ifndef CYR_IOS_H
#define CYR_IOS_H
#include <iostream>
#include <iomanip>
#include <string>
#include <windows.h>
using namespace std;
#define MAX_STR_LEN 4096
//////////////////////////////////////////////////////////////////////////////////
// Класс CyrOstream
class CyrOstream : public ostream {
public:
CyrOstream(_Uninitialized no_init) : ostream(no_init) {};
CyrOstream& operator <<(_Myt& (_cdecl *_f)(_Myt&));
CyrOstream& operator <<(ios_base& (_cdecl *_f)(ios_base& ));
CyrOstream& operator <<(short n) { cout << n; return *this; }
CyrOstream& operator <<(unsigned short n){ cout << n; return *this; }
CyrOstream& operator <<(int n) { cout << n; return *this; }
CyrOstream& operator <<(unsigned int n){ cout << n; return *this; }
CyrOstream& operator <<(long n) { cout << n; return *this; }
CyrOstream& operator <<(unsigned long n) { cout << n; return *this; }
CyrOstream& operator <<(float f) { cout << f; return *this; }
CyrOstream& operator <<(double f) { cout << f; return *this; }
CyrOstream& operator <<(long double f) { cout << f; return *this; }
CyrOstream& operator <<(const void* v) { cout << v; return *this; }
CyrOstream& operator <<(const char*);
CyrOstream& operator <<(const unsigned char* s) { operator <<((const char*)s); return *this; }
CyrOstream& operator <<(const signed char* s) { operator <<((const char*)s); return *this; }
CyrOstream& operator <<(char);
CyrOstream& operator <<(unsigned char);
CyrOstream& operator <<(signed char c) { operator <<((char)c); return *this; }
CyrOstream& put(char);
CyrOstream& write(const char*, int);
CyrOstream& write(const unsigned char* s, int len)
{
write((const char*)s, len); return *this;
}
// Замещение методов класса ios
long setf(long lFlags) { return cout.setf(lFlags); }
void unsetf(long lFlags) { cout.unsetf(lFlags); }
char fill(char cFill) { return cout.fill(cFill); }
char fill() { return cout.fill(); }
int precision(int np) { return cout.precision(np); }
int precision() const { return cout.precision(); }
int width(int nw) { return cout.width(nw); }
int width() const { return cout.width(); }
int rdstate() const { return cout.rdstate(); }
long flags() const { return cout.flags(); }
long flags(long _l) { return cout.flags(_l); }
streambuf* rdbuf() const { return cout.rdbuf(); }
// Дружественная функция для поддержки параметризованных манипуляторов
friend CyrOstream& operator <<(CyrOstream&, const _Smanip<int>&);
private:
char buf_[MAX_STR_LEN];
};
////////////////////////////////
// Шаблон для вывода типа string
template<class _E, class _Tr, class _A>
inline CyrOstream& operator <<(CyrOstream& os, const basic_string<_E, _Tr, _A>& _X)
{
string temp(_X);
unsigned char symb[2];
symb[1] = 0;
for (int i = 0; i < temp.size(); i++)
{
symb[0] = temp.at(i);
if (symb[0] > 191)
CharToOem((const char*)symb, (char*)symb);
cout << symb;
}
return os;
}
///////////////////////////////////////////////////////////
// Класс CyrIstream
class CyrIstream : public istream {
public:
CyrIstream(_Uninitialized no_init) : istream(no_init) {};
CyrIstream& operator >>(ios_base& (_cdecl *_f)(ios_base& ));
CyrIstream& operator >>(char*);
CyrIstream& operator >>(unsigned char* s)
{
operator >>((char*)s); return *this;
}
CyrIstream& operator >>(signed char* s)
{
operator >>((char*)s); return *this;
}
CyrIstream& operator >>(char& c);
CyrIstream& operator >>(unsigned char& c)
{
operator >>((char&)c); return *this;
}
CyrIstream& operator >>(signed char& c)
{
operator >>((char&)c); return *this;
}
CyrIstream& operator >>(short &n) { cin >> n; return *this; }
CyrIstream& operator >>(unsigned short &n)
{
cin >> n; return *this;
}
CyrIstream& operator >>(int &n) { cin >> n; return *this; }
CyrIstream& operator >>(unsigned int &n)
{
cin >> n; return *this;
}
CyrIstream& operator >>(long &n) { cin >> n; return *this; }
CyrIstream& operator >>(unsigned long &n)
{
cin >> n; return *this;
}
CyrIstream& operator >>(float &f) { cin >> f; return *this; }
CyrIstream& operator >>(double &f) { cin >> f; return *this; }
CyrIstream& operator >>(long double &f)
{
cin >> f; return *this;
}
int get() { return cin.get(); }
CyrIstream& get(char&);
CyrIstream& get(char*, int, char='\n');
CyrIstream& get(unsigned char*, int, char = '\n');
CyrIstream& getline(char*, int, char='\n');
CyrIstream& getline(unsigned char* pch, int nCount, char delim ='\n')
{
getline((char*)pch, nCount, delim); return *this;
}
CyrIstream& read(char*, int);
CyrIstream& read(unsigned char* pch, int nCount)
{
read((char*)pch, nCount); return *this;
}
CyrIstream& ignore(int nCount = 1, int delim = EOF)
{
cin.ignore(nCount, delim); return *this;
}
int peek() { return cin.peek(); }
int gcount() const { return cin.gcount(); }
CyrIstream& putback(char ch) { cin.putback(ch); return *this; }
// Замещение методов класса ios
void clear(int nState = 0) { cin.clear(nState); }
long setf(long lFlags) { return cin.setf(lFlags); }
void unsetf(long lFlags) { cin.unsetf(lFlags); }
int rdstate() const { return cin.rdstate(); }
long flags() const { return cin.flags(); }
streambuf* rdbuf() const { return cin.rdbuf(); }
// Дружественная функция для поддержки параметризованных манипуляторов
friend CyrIstream& operator >>(CyrIstream&, const _Smanip<int>&);
private:
char buf_[MAX_STR_LEN];
};
/////////////////////////////////////////////////////////////
//Шаблон для ввода типа string
template<class _E, class _Tr, class _A>
inline CyrIstream& operator >>(CyrIstream& is, basic_string<_E, _Tr, _A>& _X)
{
string temp;
cin >> temp;
unsigned int n = temp.size();
char *buf = new char[n+1];
temp.copy(buf, n); buf[n] = 0;
OemToChar(buf, (char*)buf);
_X = string(buf);
delete [] buf;
return is;
}
CyrOstream& CyrOstream::operator << (_Myt& (_cdecl *_f)(_Myt&))
{
cout << _f; return *this;
}
CyrOstream& CyrOstream::operator << (ios_base& (_cdecl *_f)(ios_base& ))
{
cout << _f; return *this;
}
CyrOstream& CyrOstream::operator <<(const char *s)
{
int n = strlen(s);
strncpy(buf_, s, n); buf_[n] = 0;
CharToOem(buf_, buf_);
cout << buf_;
return *this;
}
CyrOstream& CyrOstream::operator <<(char c)
{
buf_[0] = c; buf_[1] = 0;
CharToOem(buf_, buf_);
cout << buf_;
return *this;
}
CyrOstream& CyrOstream::operator <<(unsigned char c)
{
unsigned char buf[2];
buf[0] = c; buf[1] = 0;
if (c > 191)
CharToOem((const char*)buf, (char*)buf);
cout << buf;
return *this;
}
CyrOstream& CyrOstream::put(char c)
{
buf_[0] = c; buf_[1] = 0;
CharToOem(buf_, buf_);
cout.put(buf_[0]);
return *this;
}
CyrOstream& CyrOstream::write(const char* s, int len)
{
int n = strlen(s);
strncpy(buf_, s, n); buf_[n] = 0;
CharToOem(buf_, buf_);
cout.write(buf_, len);
return *this;
}
CyrOstream& operator <<(CyrOstream& os, const _Smanip<int>& m)
{
cout << m; return os;
}
CyrIstream& CyrIstream::operator >> (ios_base& (_cdecl *_f)(ios_base& ))
{
cin >> _f; return *this;
}
CyrIstream& CyrIstream::operator >>(char* s)
{
string temp;
cin >> temp;
unsigned int n = temp.size();
temp.copy(buf_, n); buf_[n] = 0;
OemToChar(buf_, buf_);
strncpy (s, buf_, n + 1);
return *this;
}
CyrIstream& CyrIstream::operator >>(char& c)
{
cin >> buf_[0];
buf_[1] = 0;
OemToChar(buf_, buf_);
c = buf_[0];
return *this;
}
CyrIstream& CyrIstream::get(char& symb)
{
cin.get(buf_[0]);
buf_[1] = 0;
OemToChar(buf_, buf_);
symb = buf_[0];
return *this;
}
CyrIstream& CyrIstream::get(char* pch, int nCount, char delim)
{
cin.get(pch, nCount, delim);
OemToChar(pch, pch);
return *this;
}
CyrIstream& CyrIstream::get(unsigned char* pch, int nCount, char delim)
{
cin.get((char*)pch, nCount, delim);
OemToChar((const char*)pch, (char*)pch);
return *this;
}
CyrIstream& CyrIstream::getline(char* pch, int nCount, char delim)
{
cin.getline(pch, nCount, delim);
OemToChar(pch, pch);
return *this;
}
CyrIstream& CyrIstream::read(char* pch, int nCount)
{
cin.read(buf_, nCount);
buf_[nCount] = 0;
OemToChar(buf_, buf_);
for(int i = 0; i < nCount; i++)
pch[i] = buf_[i];
return *this;
}
CyrIstream& operator >>(CyrIstream& is, const _Smanip<int>& m)
{
cin >> m; return is;
}
//////////////////////////////////////////////////////////
// Глобальные объекты для ввода и вывода
CyrIstream Cin(_Noinit);
CyrOstream Cout(_Noinit);
///////////////////////////////////////////////////////////
extern CyrIstream Cin;
extern CyrOstream Cout;
#endif
#ifndef CYR_IOS_IMPLEMENTATION
#define cin Cin
#define cout Cout
#define istream CyrIstream
#define ostream CyrOstream
#endif
Работает только в Visual Studio.
Вызов:
#include "CyrIOS.h" //смотря как назовёте
using namespace std;
int main()
{
char str[100];
string a = "Привет мир С++";
cout << "Привет мир С++" << endl;
cin.getline(str, 100);
cout << str;
cout a;
return 0;
}
Думаю данный вариант более элегантнее...
Зачем так усложнять код программы, вот самый простой способ как отобразить в консоли русский язык:
Нужно открыть все волишь командную строку cmd.
Потом для удобства перейти на рабочий стол вот так:
cd "Рабочий стол" <Enter>
Documents and Settings\hda0\Рабочий стол>[/i]
А дальше, все еще проще.
echo Привет, вот и русский язык в консоли > rus.txt
Всё.
На рабочем столе создаеться текстовый документ rus.txt и оттуда копируйте текст и вставляйте в cout или еще куда нибудь. Разве это не проще? Я так всегда делаю.
За дополнительной информацией можно посмотреть в справочнике Windows о перенаправлениях потока. Все думаю обьяснил все понятнее не куда!
XEN_STRANGER
20-03-2009, 21:44
Я в C++ новичёк, пишу простенькую прогу Win32 console Application (запускается она не в windows-окне,а в командной строке). Так вот при выводе на экран текста на русском, кириллические символы не отображаются, точне выводятся каляки. Например:
cout << "Введите число от 1 до 10" << endl;
Фраза на кирилице не пашет, а писать русские слова английскими буквами не прилично. Помню, что кто-то делал поддержку кирилицы, но как????????????????
вот что могу предложить:
#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
21-03-2009, 13:51
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
Моя прога во вложении.
вот что получилось:
// 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;
}
В Vista и Windows 7 не работает :(
сделал для 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 не пошло.. хз может потому что бета.
К сожалению ни один из способов, приведённых выше, у меня не прокатил »Попробуйте ещё так
#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;
}
XEN_STRANGER
21-03-2009, 20:52
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.
Зачем так усложнять код программы, вот самый простой способ как отобразить в консоли русский язык:
Нужно открыть все волишь командную строку cmd.
Потом для удобства перейти на рабочий стол вот так:
cd "Рабочий стол" <Enter>
Documents and Settings\hda0\Рабочий стол>
А дальше, все еще проще.
echo Привет, вот и русский язык в консоли > rus.txt
Всё.
На рабочем столе создаеться текстовый документ rus.txt и оттуда копируйте текст и вставляйте в cout или еще куда нибудь. Разве это не проще? Я так всегда делаю.
За дополнительной информацией можно посмотреть в справочнике Windows о перенаправлениях потока. Все думаю обьяснил все понятнее не куда!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.