2012-11-05 53 views
2

Windows 8 x64; Visual Studio 2012;Unicode字符在控制台通过C++

我通过本书学习C++。在这个论坛上,我发现了many themes关于读\写Unicode字符串通过C++。但是这个主题没有被标记为解决(???)。在C++中它真的是个大问题吗?我曾尝试不同的变体 - 他们不工作对我说:

#include<iostream> 
#include<Windows.h> 
#include <io.h> 
#include <fcntl.h> 
using namespace std; 

int main() { 
    // variant 1: 
    wcout << L"Hello World!" << endl; // displayed 
    wcout << L"Привет Мир!" << endl;// not displayed 

    //********************************************** 

    // variant 2: 
    SetConsoleOutputCP(CP_UTF8); 
    wchar_t s[] = L"Hello World (2)!"; 
    int bufferSize = WideCharToMultiByte(CP_UTF8, 0, 
     s, -1, NULL, 0, NULL, NULL); 
    char* m = new char[bufferSize]; 
    WideCharToMultiByte(CP_UTF8, 0, s, -1, m, 
     bufferSize, NULL, NULL); 

    wprintf(L"%S", m); // valid output 
    wcout << endl; 
    printf("%s", m); // valid output 
    wcout << endl; 

    wchar_t s2[] = L"Привет мир (2)!"; 
    int bufferSize2 = WideCharToMultiByte(CP_UTF8, 0, 
     s2, -1, NULL, 0, NULL, NULL); 
    char* m2 = new char[bufferSize2]; 
    WideCharToMultiByte(CP_UTF8, 0, s2, -1, m2, 
     bufferSize2, NULL, NULL); 

    wprintf(L"%S", m2); // invalid output 
    wcout << endl; 
    printf("%s", m2); // invalid output 
    wcout << endl; 
    //********************************************** 

    // variant 3 (not working): 
    _setmode(_fileno(stdout), _O_U16TEXT); 
    wcout << L"Testing unicode -- English -- Ελληνικά" 
     << "-- Español." << endl; 

    return 0; 
} 

但它为英文字符只有... 屏幕:

enter image description here

我怎样才能解决这个问题到C++的问题?

+0

偏离主题,但你怎么能让Windows 8的窗口拐角曲线那样 –

回答

0

我找到了更清晰的decission然后使用chcp命令:

// Getting the readable Cyrillic chars in the console window... 
setlocale(LC_ALL, "Russian"); 
wcout << endl << L"Добро "; // UNICODE 
cout << "пожаловать!" << endl; // ANSI 

对于这两种情况下,我得到了可读的输出。

-1

哦~~请原谅我,下面是C.

在C++中,你可以这样做:

#include <iostream> 
#include <locale> 
using namespace std; 
int main(int argc, char *argv[]) 
{ 
    locale::global(std::locale("")); 
    wcout << L"Привет Мир!" << endl; 
    return 0; 
} 

#include <locale.h> 

setlocale(LC_ALL,NULL); 

默认设置为(LC_ALL, “C”)。所以你不能显示

+0

谢谢。我将它添加到我的CPP文件中,重建它,但结果相同。 :(((如何解决那些不会说英语的人的问题 –

+0

它可以在gnome-console下运行 – hbprotoss

+0

也许在cmd.exe中显示unicode字符时会出现一些问题,因为cmd并不完全支持unicode – hbprotoss

2

这种情况的解决方法是执行程序(执行之前在cmd.exe

CHCP 65001

比ASCII码的其他字符,我不知道该怎么办这是编程)。 65001对于UTF8编码来说是一个神奇的价值。可用于chcp的其他代码页的列表在此处:http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/chcp.mspx?mfr=true。西里尔CP1251的其他有趣价值是855。

并且不要忘记将控制台字体切换到Lucida(默认字体不适用于UTf-8)。

+0

谢谢。我试了一下,然后运行我的EXE文件,但结果是一样的。:((( –

+1

@Bush我忘了说你需要使用'cmd.exe'属性将控制台字体切换到Lucida)。我很乐意听听这是否有窍门。 –

+0

不要忘了将你的控制台字体切换到Lucide 是的,现在它的工作原理!谢谢! –

2

我发现更简单的变体(无代码页的变化,和字体):

#include<iostream> 
#include<windows.h> 

using namespace std; 
int main() 
{ 
    cout<<"Привет мир (1)!" << endl; // invalid output 

    SetConsoleCP(GetACP()); 
    SetConsoleOutputCP(GetACP()); 

    cout<<"Привет мир (2)!" << endl; // valid output! 

    return 0; 
} 

也许会有趣,对我来说唯一的。

P.S.但是...它在CMD.EXE中有效,但在POWERSHELL.EXE中不起作用。