例如,如果我写:
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 ++控制台中编写俄语文本,同时正确读取俄语命令行参数。
答案 0 :(得分:7)
请参阅Michael Kaplan博客的这篇文章:
答案 1 :(得分:6)
您是否尝试过使用wcout
?它类似于cout
,但它接受“宽”字符,这应该允许正确的unicode编码。
这两个来自MSDN的article about localization和another都可能有用。
答案 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 进行打印。
// 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;
}