如何在C ++控制台中编写西里尔文本

时间:2010-02-14 15:03:45

标签: c++ encoding character-encoding

例如,如果我写:

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

在控制台中,它会像╧ЁштхЄ!

好的,我知道我们可以使用:

setlocale(LC_ALL, "Russian");

但在那之后,俄语中的命令行参数不起作用(如果我通过BAT文件启动我的程序):

StartProgram.bat

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

因此,在setlocale之后,该程序无法正确阅读俄语论据。

这是因为CP1251中的BAT文件,但控制台位于CP866中。

所以,有一个问题:

如何在C ++控制台中编写俄语文本,同时正确读取俄语命令行参数。

8 个答案:

答案 0 :(得分:7)

请参阅Michael Kaplan博客的这篇文章:

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

答案 1 :(得分:6)

您是否尝试过使用wcout?它类似于cout,但它接受“宽”字符,这应该允许正确的unicode编码。

这两个来自MSDN的article about localizationanother都可能有用。

答案 2 :(得分:2)

控制台设置为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]);
    } 

程序是argument.exe和结果:

D:\ Debug&gt;参数ОлегПароль
你好ОлегПароль

答案 3 :(得分:1)

您是否在控制面板的“区域和语言选项”部分中将非unicode程序的语言设置为俄语?

(我不知道俄语程序员的常规设置是什么;我只是想知道将这种设置为某种英语是否常见,以避免混淆过度狭隘的工具。)

除非我的记忆在玩弄,当我使用日本开发人员的一些代码时,正是这一步让控制台正确显示非Unicode日文文本(Shift-JIS编码)。

答案 4 :(得分:1)

您可以尝试使用以下功能setlocale()SetConsoleOutputCP()

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

答案 5 :(得分:0)

WriteConsoleW 可以处理UNICODE,例如西里尔字母没有问题。如果您不会错过 wcout 的格式设置功能,则可以重定向标准的 wcout 流缓冲区,并使用 WriteConsoleW 进行打印。

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

答案 6 :(得分:0)

最正确的方法是使用wcout + std :: imbue。

但是应该知道在Windows Vista / 7中发生了setlocale API的一些变化。 &#34;俄罗斯&#34;区域字符串不被识别为&#34; cp866&#34;至少在Visual C ++ CRT中。

要获得cp866输出,请尝试使用此代码:

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

答案 7 :(得分:0)

对我来说,这似乎解决了这个问题:

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

using namespace std;

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