5

Мне приходится писать английскими буквами русские слова в консольных приложениях. Сама программа русская (У мне Visual Studio 2010 express). Подскажите, что нужно сделать для возможности выводить русские буквы? Заранее спасибо.

Нашел ответ(если кому надо)

#include<locale.h>  
int main()
{  
setlocale(LC_ALL,"RUS");
GALIAF95
  • 159
  • 3
    <a href=http://hashcode.ru/questions/42373/%D0%BA%D0%B0%D0%BA-%D0%B2%D1%8B%D0%B2%D0%B5%D1%81%D1%82%D0%B8-%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B5-%D0%B1%D1%83%D0%BA%D0%B2%D1%8B-%D0%B2-%D0%BA%D0%BE%D0%BD%D1%81%D0%BE%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B8?%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D0%B0=1#42550 target=_blank>Ссылка – чипик Oct 16 '11 at 18:30
  • Вот именно. Один и тот же вопрос задавать по 100 000 раз... Как-то нехорошо... – 3JIoi_Hy6 Oct 17 '11 at 17:44
  • setlocale(LC_ALL,"RUS"); (проверял в Windows 7, а в XP помнится у меня не работадо) обеспечивает корректный вывод кириллицы из программы (константы) как на консоль, так и в файл (перенаправлял stdout, осталось cp1251 !!!).

    Ввод не перекодируется (все равно надо делать руками).

    – avp Nov 06 '11 at 14:59

6 Answers6

3

Способ 1: используй wcout:

#include <iostream>
using namespace std;

void main() { wcout.imbue(locale(".866")); wcout << L"Привет, Мир!"; }

Еще как вариант, можно подключить <windows.h> и использовать SetConsoleOutputCP(1251)
Но у меня в 7ке почему-то этот способ не заработал, влом было разбираться. Но вроде для него надо было еще в настройках проекта какую-то галочку переключить, в общем, используй wcout, он и лучше, и работает не только в винде.


Способ 2:
Вспомнил еще один способ, пожалуй самый простой:

setlocale(LC_ALL, "Russian");    
cout << "Привет, Мир!" << endl;
ArtFeel
  • 1,935
2

Ничего не надо устанавливать. В идентификаторах разрешена только латиница. А в юникодных строках можно писать любые символы, включая китайские иероглифы.

Пример.

#include <stdio.h>

int main() { wprintf(_T("Привет, мир\n"));

return 0;

}

То, что пишется в строках: "Привет, мир" и т.п., должно помещаться внутрь макроса _T() для юникодных строк, а все остальное должно быть латиницей (за исключением комментариев).

stanislav
  • 34,518
  • 27
  • 98
  • 214
0

Попробуйте этот вариант.

<windows.h>

ostream & operator<<(ostream & out,char* s) { char buf[512],p=buf; CharToOem(s,buf); while(p) out<<*p++; return out; }

  • 3
    Перегружать глобальный оператор<< для ostream - это зло. – M. Williams Oct 16 '11 at 19:37
  • Какими могут быть последствия? – OpenGLprogrammer Oct 16 '11 at 19:58
  • Это реальный метод для вывода в нужной кодировке в Винде.

    CharToOem(from,to) переписывает char [] буфер в кодировке cp-1251 (она же ANSI в ней Вы пишете в редакторе и она в файлах винды) в char [] буфер преобразуя кодировку в cp-866 (она же ДОС), которая применяется в консоли.

    Обратное преобразование делает функция OemToChar(from,to). У этих функций есть синонимы, которые лично мне проще запомнить (в смысле что во что перекодируется): AnsiToOem и OemToAnsi.

    Но с консолью есть одна тонкость - аргументы командой строки, набранные в консоли передаются программе в cp1251!

    – avp Oct 16 '11 at 20:59
  • 3
    @OpenGLProgrammer

    Потому что глобальные операторы на то и глобальные, что распространяются на все объекты типа std::ostream.

    Т.е такой код, например, будет пропускать весь текст, идущий в файл, через CharToOem:

    std::ofstream f("file.out");

    f << "Text";

    – M. Williams Oct 16 '11 at 21:19
0

Не знаю, сработает ли, но можно попробовать, например, если есть вариант в чар массиве на английском в ASCII таблице найти и заменить на русские, ну, например, (это только пример) английская буква А имеет цифру 20, а русская 60. Вы делаете функцию, которой, если дать массив, она заменит 20 цифру на 60, и программа покажет русскую а, но это с оператором cin не провернуть, наверное, не знаю.

Nicolas Chabanovsky
  • 51,426
  • 87
  • 267
  • 507
arman_pap
  • 205
0

Компилируя консольные приложения на славном языке программирования C++ постоянно сталкиваешься с проблемой кодировок. Русские буквы выводятся каракулями, а с английскими все в порядке. Дело в кодировках. В консоли Windows используется кодировка OEM. А в самой ОС Windows - ANSI кодировка.

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

Функция CharToOem преобразует строку в набор символов ОЕМ. Эта функция противоположна функции AnsiToOem. Думаю вопрос закрыт :)

  • 1

    CharToOem ... противоположна функции AnsiToOem

    Да ладно?)

    – Sh4dow Oct 17 '11 at 00:24
  • 1
    AnsiToOem и CharToOem это синонимы
    #define AnsiToOem CharToOemA  
    #define CharToOem CharToOemA
    
    

    это из winuser.h, обычно подключается из windows.h

    – avp Oct 17 '11 at 07:45
  • Компилируя консольные приложения на славном языке программирования C++ постоянно сталкиваешься с проблемой кодировок.

    Вы забыли дописать " компилируя и запуская в виндовс. Я когда учил с++, перешел на линукс (где конечно настроил UTF-8), и никаких проблем с кодировками (конечно, некоторый софт все равно творил свои каракули, но консоль, редактор, компилятор, которые есть, работали красиво и слажено). Поэтому, всем, кто спрашивает меня, какая лучшая IDE для изучения с/с++ - я отвечаю - линукс.

    – KoVadim Oct 17 '11 at 07:57
  • Реально проблема (многими не осознаваемая) в том, что константы в программе в одной кодировке, а данные в консоли или файлах в другой. – avp Oct 17 '11 at 08:08
  • @KoVadim, форточник и дельфист в лице меня апплодирует последней фразе и полностью соглашается)

    Простите, не удержался)

    – Sh4dow Oct 17 '11 at 15:04
0

Ещё как вариант можно использовать _cwprintf, но она есть только в Visual C++.

devoln
  • 5,441