通过C ++在控制台中使用Unicode字符

时间:2012-11-05 14:21:49

标签: c++ unicode console

Windows 8 x64; Visual Studio 2012;

我按书学习C ++。在这个论坛上,我通过C ++找到了关于read \ write Unicode字符串的many themes。但是这个主题没有标记为已解决(???)。这是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 ++解决问题?

4 个答案:

答案 0 :(得分:2)

解决方法是执行

  

chcp 65001

在执行程序之前在cmd.exe

(我不知道如何以编程方式执行此操作)。 65001是UTF8编码的神奇值。可用于chcp的其他代码页列表如下:http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/chcp.mspx?mfr=true。其他有趣的值是西里尔CP1251的855。

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

答案 1 :(得分: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。

答案 2 :(得分:0)

我找到了更明确的决定,然后chcp命令使用:

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

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

答案 3 :(得分:-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”)。因此,您无法显示ASCII码以外的字符