2010-02-14 19 views
13

Zum Beispiel zu schreiben, wenn ich schreibe:Wie kyrillischen Text in C++ Konsole

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

in der Konsole wäre es so etwas wie ╧ЁштхЄ! sein.

OK, ich weiß, dass wir verwenden können:

setlocale(LC_ALL, "Russian"); 

Aber danach, Befehlszeilenargumente in Russisch funktionieren nicht (wenn ich mein Programm durch eine BAT-Datei starten):

Starte .bat

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

So, nach setlocale kann das Programm nicht russische Argumente richtig lesen.

Dies passiert, weil die BAT-Datei in CP1251, aber die Konsole ist in CP866.

So gibt es eine Frage:

Wie kann ich russischen Text in der C++ Konsole schreiben und gleichzeitig haben russische Kommandozeilenargumente richtig lesen.

Antwort

7

Siehe diesen Eintrag von Michael Kaplan Blog:

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

+0

Dank, es funktioniert! Aber auf diese Weise kann ich nicht cout verwenden, nur wprintf – VextoR

+2

'wcout' ist das Äquivalent von' wprintf' genauso wie 'cout' ist das Äquivalent von' printf' - die letzten beiden werden nicht Unicode. – MSalters

6

Haben Sie versucht wcout mit? Es ähnelt cout, akzeptiert aber "breite" Zeichen, die die richtigen Unicode-Kodierungen ermöglichen sollten.

Diese article about localization und another, beide von MSDN können von Nutzen sein.

+0

leider funktioniert nicht auch. Ich benutze keinen Unicode – VextoR

+2

Wenn ich mich nicht völlig irre, wird Unicode eine Notwendigkeit für kyrillisch sein. Normales 8-Bit-ASCII enthält keine Glyphen für die meisten Zeichen im kyrillischen Alphabet. Die Konsolenausgabe Ihres Beispiels ('╧ЁштхЄ') besteht aus einigen exotischen 8-Bit-ASCII-Zeichen, da die richtigen Zeichen in dieser Codierung nicht verfügbar sind. –

+2

Hmm .. Windows kyrillisch ist 1251 (Windows-1251) Codepage. Aber DOS Cyrillic verwendet 866 Codepage. Also, "Привет!" in CP1251 = "╧ЁштхЄ!" in CP866. Dies ist, was passiert ist, schreibe ich in C++ als CP1251, aber die Konsole zeigt es als CP866. – VextoR

1

Haben Sie die Sprache für Nicht-Unicode-Programme im Bereich Regions- und Sprachoptionen der Systemsteuerung auf Russisch eingestellt?

(Ich habe keine Ahnung, was das übliche Setup für russischsprachigen Programmierer sein könnte, ich frage mich nur, ob es üblich ist, das von Englisch zu einer Art setzen übermäßig Pfarr Werkzeuge nicht zu verwirren.)

Es sei denn, Mein Speicher spielt Tricks, als ich mit Code von japanischen Entwicklern arbeitete, war es dieser Schritt, der die Konsole dazu brachte, nicht-Unicode japanischen Text (Shift-JIS-Kodierung) richtig anzuzeigen.

2

Sie können versuchen, die folgenden Funktionen setlocale() und SetConsoleOutputCP()

setlocale(LC_ALL, "Russian"); 
SetConsoleOutputCP(866); 
+0

Dieser hat mir sehr geholfen. Eine weitere müssen wir hinzufügen - Sie sollten '#include ' verwenden –

2

Console Satz in 1251 sein statt in 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]); 
    } 

Programm ist argument.exe und Ergebnis:

D: \ Debug> Argument Олег Пароль
Hallo Олег Пароль

0

WriteConsoleW kann UNICODE z. Kyrillische Buchstaben ohne Probleme.Wenn Sie die Formatierungsfunktionen von wcout nicht verpassen, können Sie den Standard wcout Stream-Puffer umleiten und es mit WriteConsoleW drucken.

A full example is shown here

// 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); 
0

Der richtige Weg ist mit wcout + std :: imbue.

Aber man sollte wissen, dass es einige Änderungen in der setlocale API gab, die in Windows Vista/7 geschahen. "Russisch" Gebietsschema Zeichenfolge wird nicht mehr als "cp866" mindestens in Visual C++ CRT erkannt.

Um cp866 Ausgabe zu erhalten, versuchen Sie diese stattdessen verwenden:

::setlocale(LC_ALL , "russian_russia.866"); 
0

Für mich ist das das Problem zu lösen scheint:

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

using namespace std; 

int main(void) { 
    _setmode(_fileno(stdout), _O_U16TEXT); 
    wcout << L"Огњен" << endl; 
    return 0; 
}