Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Русский шрифт в командной строке


Автор: KARDAN 27.12.2005, 18:09
В Винде в командной строке - не коректно(абра-кадабра) отбражается русский шрифт(записаный в коде).

Использую Microsoft Visual C++ 6.0(SP6). Где в настройках, можна изменить, чтоб русский определял коректно.
За рание блогадарен.

P.S. Я только учюсь, по Шилдту. Первое знакомство с C++.

Автор: Chaos A.D. 27.12.2005, 18:16
Самый легкий вариант - возьми какой-нибудь текстовый редактор (лично я предпочитаю Bred), и переведи в нем твой русский текст в кодировку, в которой сохраняет текст твоя IDE. По-моему, у тебя это win1251. В коде твой текст будет выглядеть абракадаброй, а в консоли - все нормально.

Автор: JoyEx 27.12.2005, 18:23
http://www.rsdn.ru/article/qna/ui/concp.xml

Автор: KARDAN 28.12.2005, 09:52
Цитата(Chaos @ 27.12.2005, 18:16)
возьми какой-нибудь текстовый редактор

Хотелось бы чтоб MV C++ всё обрабатывал автоматом. smile
Добавлено @ 10:01
JoyEx
ВЫХОД 3 - был самый заманчевый но всёравно не работает smile


Кто-нибуть знает выход с этой ситуации. smile

Автор: chaos 28.12.2005, 10:08
можно попробовать
команду командного интерпретатора chcp
пример: перевод в 1251 - chcp 1251

Автор: KARDAN 28.12.2005, 10:34
Забыл написать, на машине установлена Win2k.

На картинке видно ввод команды - и вывод кадабры.

Может ключ в реестре прописать(говорят помагает), что б в DOS-e кодеровку нормальло выводило.


Автор: chaos 28.12.2005, 11:30
запускай так свою программу
chcp 1251 | appname.exe
и все у тебя получиться!!!
Добавлено @ 11:34
или же при каждом выводе придется делать так:
Пример:
Код

char szText[20];
CharToOem("Привет мир!!!", szText);
cout << szText << endl;

Автор: Exekutor 28.12.2005, 13:48
все дело в том что в Windows и в Дос кодировки символов разные. Самый простой и легкий способ - это написать собственную функцию по переводу. Создай строку символов в которой будет содержаться текст, который ты желаешь вывести на экран. Создай функцию, которая будет получать строку и возвращать строку в качестве результата. В функции пропиши кодировки символов в винде и дос. Пусть функция меняет код каждого символа полученой строки (винда) на код символа возвращаемой строки строки (дос). Используй эту функцию во всех приложениях, в которых требуется вывод русского текста на экран консоли.

Автор: chaos 28.12.2005, 13:58
Цитата(Exekutor @ 28.12.2005, 13:48)
все дело в том что в Windows и в Дос кодировки символов разные. Самый простой и легкий способ - это написать собственную функцию по переводу. Создай строку символов в которой будет содержаться текст, который ты желаешь вывести на экран. Создай функцию, которая будет получать строку и возвращать строку в качестве результата. В функции пропиши кодировки символов в винде и дос. Пусть функция меняет код каждого символа полученой строки (винда) на код символа возвращаемой строки строки (дос). Используй эту функцию во всех приложениях, в которых требуется вывод русского текста на экран консоли.

нафиг изобретать велосипед?

когда все уже есть
CharToOem OemToChar

Автор: Exekutor 28.12.2005, 14:13
использование каких-то шаблонов, особенно на этапе обучения, влечет к одному - незнанию, непониманию сути. Гораздо более интерестно и полезно - попробовать решить проблему самому. Конечно, если ты крутой профессионал, ты работаешь и твое время ограничено - изобретать велосипед не самое мудрое решение.

Автор: KARDAN 28.12.2005, 15:48
Спосибо большое что откликнулись. Попробую все ваши предложеные варианты.

И всётаки по средствам самой Visual Studio в настройках (на подобе Tools->Options->Format->Source Windows->Font) можно ли настроить, или надо использовать дополнительные програмки smile

Автор: byNet 28.12.2005, 15:51
Как сделать в консоли руский язык в Builder C++ 5

Автор: _hunter 28.12.2005, 16:16
точно так же

Автор: Alex007 29.12.2005, 23:30
Цитата
Хотелось бы чтоб MV C++ всё обрабатывал автоматом.

Поставь себе Visual Studio 2005 Pro smile smile smile smile smile smile smile smile smile

Автор: KARDAN 30.12.2005, 11:21
Там уже есть эта возможность?
А можно скачать по инету?

Автор: Alex007 30.12.2005, 12:18
Цитата
Там уже есть эта возможность?
А можно скачать по инету?

По иннету можно скачать только бесплатную версию - Express Edition(урезаная версия),
но спроси у кого-то может дадут пиратскую Professional smile smile smile smile

Автор: GOLD 30.12.2005, 22:52
Не знаю подойдет ли, но для печати по-русски в консольном приложении я написал такую функцию:
Код

void printRus(char str[])  //печать символов в кодировке windows
{
   int i, n=0;
   char *dest;
   while (str[n]!='\0')   //считаем количество символов в переданной строке
       n++;
   dest=(char *)malloc(n*sizeof(char));
   for (i=0; i<=n; i++)
      {
          dest[i]=str[i];
      }
   AnsiToOem(str,dest);
   printf(dest);
   free(dest);
}

а потом
Код

printRus("\nС новым годом!\n");

smile

Автор: Void 31.12.2005, 01:28
GOLD
Оставляя в стороне сам подход к решению: а почему не воспользоваться strlen и strcpy вместо самописных циклов? Они, как правило, очень хорошо оптимизированы на уровне маш. кодов, там далеко не банальный цикл.

Автор: Dov 31.12.2005, 01:52
Цитата(KARDAN @ 28.12.2005, 10:34)
Забыл написать, на машине установлена Win2k.

Может я чего-то не понял, тогда извинияюсь.
Код
#include <windows.h>
#include <stdio.h>

int main()
{
    SetConsoleOutputCP(1251);
    printf("\nС новым годом!\n");  

    return 0;
}

В окне вывода, в свойствах устанавливаешь шрифт Lucida Console. Всё.

Автор: GOLD 31.12.2005, 06:35
Void Да уж! Я когда сюда вставил код, сам испугался smile
Спасибо за замечание!

Работает даже так:
Код

void printRus(char str[])
{
   AnsiToOem(str,str);
   printf(str);
}

Автор: SectoR 25.2.2006, 02:37
IMHO проще всего так:
Код

#include <stdio.h>
#include <conio.h>

char *rus(char *st)
{
 unsigned char *p=st;
  while(*p)
  {
    if(*p>192)
      if (*p<=239)
        *p-=64;  // А,Б,В ... Я,а,б,в ... п
      else
        *p-=16; // р ... я
    p++;
  }
  return st;
}

int main()
{
 printf("%s",rus("Русский шрифт в консоли!"));
 getch();
}

Автор: AlexHHL 2.1.2007, 08:05
Приветствую!

Вот вы пишите
printf("%s",rus("Русский шрифт в консоли!"));

и ещё куча примеров как в консольном приложении буквы РФ были видны, так а если в самом редакторе пишется абра-кадабра, я не вижу, что я написал русскими буквами. Настройки облазил с верху до низу!!!

Автор: WERITAS 2.1.2007, 10:18
А я писал для себя вот такую функцию печати русских слов и до сих пор ей пользуюсь:
Код

void RusOut(char *Str)
{
unsigned char c;
for(int i=0;Str[i]!='\0';i++)
  {
  c=Str[i];
  if(c>127)
    {
    if(c<240)c-=64;
    else     c-=16;
    }
  cout<<c;
  }
}


Применение:
Код

RusOut("\nПривет Мир!");

Автор: jonie 3.1.2007, 01:09
peshite translitom 8).
Ну или что самое простое и надежное пишите в UNICODE (хотя можно и без него -- смотрите setlocale).
Код

int _tmain(int argc, _TCHAR* argv[])
{
    const wchar_t s[]=L"Привет!";
    setlocale(LC_ALL,"russian_russia.866"); //замена ASCII на юникод в сообщениях
    wcout<<s;
    return 0;
}

Автор: Kirill89 3.1.2007, 23:23
Я что - то путаю, или можно просто использовать CharToOem?

Автор: WERITAS 3.1.2007, 23:37
Вот тебе еще такой вариант с использованием MFC'шной строки (разумеется в Project Settings установишь Use MFC in Shared DLL):

Код

CString oem(char* s)
{
  CString str(s);
  str.AnsiToOem();

return str;
}


Применение:
Код

cout<<oem("Привет Мир!")<<endl;

Автор: DarthGuyver 15.11.2009, 01:05
Вот потратил несколько дней чтоб догнать как русский текст в консоль выводит!!!
Ниодин из способов выше не помог (CharToOem не пробовал)!!!
Видел тут 2 человека выкладывали собственные функции, но у меня они тоже почемуто не попёрли!
Вот написал свою функцию, кто буит пробовать. отпишитесь как она у вас пошла?

Код

#include <stdio.h>

void rus_print (char *s)
{
    char *p = s;

    while (*p)
    {
        if (*p >= 'А' && *p < ('п' + 1))
            printf ("%c", *p - 'А' - 128);
        else if (*p >= 'р' && *p < ('я' + 1))
            printf ("%c", *p - 'А' - 80);
        else
            printf ("%c", *p);
        p++;
    }
}


У меня заработала!!
Теперь буду ей пользоваться!!!

Автор: sdukshis 15.11.2009, 18:31
А разве подобное:
Код

#include <stdio.h>
#include <locale.h>

int main(){
    setlocale(LC_ALL, "");

    printf("Привет мир!\n");

    return 0;
}

В Windows не работает?

Автор: DarthGuyver 15.11.2009, 21:31
Неа!!!

Автор: chaos 15.11.2009, 21:46
DarthGuyver
Код

system("chcp 1251");

smile

Автор: DarthGuyver 15.11.2009, 23:53
Ну мне не помогло!!!

Автор: Dronchik 22.11.2009, 08:59
Лично я использовал всегда CharToOem. Имхо самое удобное для меня. Также естественно можно просто ставить юникод и спокойно писать русскими буквами))Способ в http://forum.vingrad.ru/index.php?showtopic=76084&view=findpost&p=601184 ихмо самый удобный) 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)