2

Windows 8 x64; Visual Studio 2012;

私は本で C++ を学びます。このフォーラムでは、C++ による Unicode 文字列の読み取り/書き込みに関する多くのテーマを見つけました。しかし、このテーマは解決済みとしてマークされていません(???)。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;
}

ただし、英語の文字のみで機能します... 画面:

ここに画像の説明を入力

C ++で問題を解決するにはどうすればよいですか?

4

4 に答える 4

2

これに対する回避策は実行中です

chcp 65001

プログラムを実行するcmd.exe前に(プログラムでそれを行う方法がわかりません)。65001 は UTF8 エンコーディングのマジック値です。で利用可能なその他のコード ページのリストは、 http chcp: //www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/chcp.mspx?mfr=trueです。その他の興味深い値は、キリル CP1251 の 855 です。

また、コンソールのフォントを Lucida に切り替えることを忘れないでください (デフォルトのフォントは UTf-8 では機能しません)。

于 2012-11-05T14:29:29.543 に答える
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;
}

多分それは私だけでなく面白いでしょう。

PSしかし... CMD.EXEでは機能しますが、POWERSHELL.EXEでは機能しません。

于 2012-11-05T15:02:54.557 に答える
0

私はより明確な決定を見つけてから、chcp次を使用してコマンドを実行しました。

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

どちらの場合も、読み取り可能な出力が得られます。

于 2015-10-07T13:55:39.160 に答える
-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コード以外の文字は表示できません

于 2012-11-05T14:28:47.907 に答える