0

我使用代码页在 Visual Studio 2019 上工作:

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

int main()
{
    UINT oldcp = GetConsoleOutputCP();  
    SetConsoleOutputCP(932);      //932 = Japanese. 
                                  //1200 for little-, 1201 big-, endian UTF-16     

    DWORD used;
    WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE),L"私の犬\n", 4,&used, 0);

    std::cout << "Hit enter to end."; std::cin.get();
    SetConsoleOutputCP(oldcp); 
    return 0;
}

但我从 Microsoft 看到,除了与遗留代码交互外,我不应该使用代码页——改用 UTF-16。我可以找到 UTF-16(小端或大端)的代码页,但使用它们不起作用它仍在使用代码页。

那么我可以使用什么来完成我的程序的功能,但它是最新的?

4

2 回答 2

1

在 Windows 中将 stdin 和 stdout 设置为宽模式并使用wcoutwcin字符串。您需要切换到控制台字体以支持字符,并使用 IME 来键入它们,这可以通过安装适当的语言支持来完成。您可以通过设置代码页自动获得该开关,但即使在“错误”代码页中,字符也会正确输出。如果您选择支持字符的字体,它将起作用。

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

int main()
{
    _setmode(_fileno(stdout), _O_U16TEXT);
    _setmode(_fileno(stdin), _O_WTEXT);

    std::wcout << L"私の犬&quot; << std::endl;
    std::wstring a;
    std::wcout << L"Type a string: ";
    std::getline(std::wcin, a);
    std::wcout << a << std::endl;
    getwchar();
}

输出(终端使用代码页 437 但 NSimSun 字体):

私の犬
Type a string: 马克
马克
于 2022-03-02T21:24:49.350 回答
0

从技术上讲,每个字符编码都是一个代码页。要使用 UTF-16,您仍然必须指定 UTF-16“代码页”。但你也需要_setmode

_setmode(_fileno(stdout), _O_U16TEXT);
std::cout << L"私の犬\n";

它是最新的吗?不!!!打印 Unicode 最合理的方法是使用 UTF-8 代码页,这将使您的应用程序跨平台并且更易于维护。请参阅en_US.UTF-8 语言环境的 Windows 等效项是什么?有关这方面的详细信息。基本上只是

  • 以 Windows SDK v17134 或更新版本为目标,或使用静态链接在较旧的 Windows 版本上工作
  • 将代码页更改为 UTF-8
  • 如果您直接调用它们,则使用-AWin32 API 而不是那些( MS 推荐用于可移植性,因为其他人几十年来一直在使用 UTF-8)-W
  • 在编译时设置/execution-charset:utf-8和/或/utf-8标志
std::setlocale(LC_ALL, ".UTF8");
std::cout << "私の犬\n";

另请参阅是否可以将 Windows 应用程序的“语言环境”设置为 UTF-8?

于 2022-03-03T01:11:06.610 回答