Как написать кириллицу в консоли C ++ - PullRequest
14 голосов
/ 14 февраля 2010

Например, если я напишу:

cout << "Привет!" << endl; //it's hello in Russian

В консоли это будет что-то вроде ╧ЁштхЄ!.

ОК, я знаю, что мы можем использовать:

setlocale(LC_ALL, "Russian");

Но после этого аргументы командной строки на русском языке не работают (если я запускаю свою программу через BAT-файл):

StartProgram.bat

chcp 1251
MyProgram.exe -user=Олег -password=Пароль

Итак, после setlocale программа не может правильно прочитать русские аргументы.

Это происходит потому, что BAT-файл в CP1251, но консоль в CP866.

Итак, возникает вопрос:

Как написать русский текст в консоли C ++ и в то же время правильно прочитать аргументы командной строки на русском языке.

Ответы [ 8 ]

7 голосов
/ 14 февраля 2010

Смотрите эту запись из блога Майкла Каплана:

http://www.siao2.com/2008/03/18/8306597.aspx

6 голосов
/ 14 февраля 2010

Вы пробовали использовать wcout? Он похож на cout, но принимает «широкие» символы, что должно разрешать правильное кодирование Unicode.

Эта статья о локализации , и другая , обе из MSDN могут быть полезны.

2 голосов
/ 29 сентября 2013

Консоль установлена ​​в 1251 вместо 866:

 //Save As Windows 1251
    #include<stdio.h>
    #include<windows.h>
    int main(int argc, char **argv){ 
        SetConsoleOutputCP(1251);
        SetConsoleCP(1251);
        if(argc<2)return 0;
        else printf("Hello %s %s\n",argv[1],argv[2]);
    } 

Программа - это аргумент.exe и результат:

D: \ Debug> аргумент Олег Пароль
Привет Олег Пароль

1 голос
/ 17 июня 2012

Вы можете попробовать использовать следующие функции setlocale() и SetConsoleOutputCP()

setlocale(LC_ALL, "Russian");
SetConsoleOutputCP(866);
1 голос
/ 15 февраля 2010

Вы установили язык для программ, не поддерживающих Юникод, на русский, в разделе "Язык и региональные стандарты" панели управления?

(Понятия не имею, какой может быть обычная установка для русскоязычных программистов; просто интересно, распространено ли это на какой-то английский, чтобы не путать чрезмерно-приходские инструменты.)

Если моя память не разыгрывает трюки, когда я работал с некоторым кодом от японских разработчиков, именно на этом шаге консоль правильно отображала японский текст не в Юникоде (кодировка Shift-JIS).

0 голосов
/ 30 марта 2016

Для меня это, кажется, решить проблему:

#include <fcntl.h>
#include <io.h>
#include <iostream>

using namespace std;

int main(void) {
    _setmode(_fileno(stdout), _O_U16TEXT);
    wcout << L"Огњен" << endl;
    return 0;
}
0 голосов
/ 24 ноября 2014

Самый правильный способ - использовать wcout + std :: imbue.

Но следует знать, что в API setlocale произошли некоторые изменения, произошедшие в Windows Vista / 7. «Русская» строка локали больше не распознается как «cp866», по крайней мере в Visual C ++ CRT.

Чтобы получить вывод cp866, попробуйте использовать это вместо:

::setlocale( LC_ALL , "russian_russia.866" );
0 голосов
/ 24 ноября 2014

WriteConsoleW может обрабатывать UNICODE, например Буквы кириллицы без проблем. Если вы не пропустите функции форматирования wcout , вы можете перенаправить стандартный потоковый буфер wcout и распечатать его с помощью WriteConsoleW .

Полный пример показан здесь

// save and redirect cout buffer
wostringstream  newCoutBuffer;
wstreambuf*     oldCoutBuffer = wcout.rdbuf(newCoutBuffer.rdbuf());    

// do your wcout stuff here
// do your wcout stuff here

DWORD dwWritten;
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), newCoutBuffer.str().c_str(),newCoutBuffer.tellp(),&dwWritten,NULL);  

// restore cout buffer
wcout.rdbuf(oldCoutBuffer);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...