在控制台C++中打印朝鲜语

Printing out Korean in console C++

本文关键字:打印 朝鲜语 C++ 控制台      更新时间:2023-10-16

我在打印韩语时遇到问题。我试过各种方法都没有用。我试过

1.

    cout << "한글" << endl;

2.

    wcout << "한글" << endl;

3.

    wprintf(L"한글n");

4.

    setlocale(LC_ALL, "korean");
    wprintf("한글");

等等。但所有这些印刷品都是"错误的"。我使用的是MinGW编译器,操作系统是Windows7。

p.S奇怪的Java打印出韩国罚款,

    String kor = "한글";
    System.out.println(kor);

工作。

在打印文本之前,将控制台代码页设置为utf-8

::SetConsoleOutputCP(65001)

由于您使用的是Windows 7,因此可以使用WriteConsoleW,它是Windows API的一部分。#include <windows.h>并尝试以下代码:

DWORD numCharsToWrite = str.length();
LPDWORD numCharsWritten = NULL;
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), str.c_str(), numCharsToWrite, numCharsWritten, NULL);

其中str是std::wstring

有关WriteConsoleW的更多信息:https://msdn.microsoft.com/en-us/library/windows/desktop/ms687401%28v=vs.85%29.aspx

在尝试了其他方法后,这对我有效。

问题是,在很多地方这可能会被破坏。

这是我不久前发布的答案(包括韩语(。Answear适用于MSVC,但同样适用于MinGW(编译器开关不同,区域设置名称可能不同(。

这里有5个陷阱使这很难:

  • 源代码编码。源必须使用支持所有必需字符的编码。现在建议使用UTF-8。最好确保您的编辑器(IDE(配置正确,以强制执行源代码编码
  • 您必须通知编译器源文件的编码是什么。对于gcc,它是:-finput-charset=utf-8(默认值(
  • 可执行文件使用的编码。您必须定义在最终可执行文件中应该对哪种编码字符串文字进行编码。此编码还应包含必需的字符。其中UTF-8也是最好的。Gcc选项为-fexec-charset=utf-8
  • 当您运行应用程序时,您必须通知标准库在哪种编码中定义了字符串文字,或者在程序逻辑中使用了什么编码。因此,在代码执行之初的某个地方,您需要这样的东西(这里强制使用UTF-8(:
std::locale::global(std::locale{".utf-8"});
  • 最后,您必须指示stream应该使用什么样的编码。因此,对于std::coutstd::cin,您应该设置系统默认的区域设置:
    auto streamLocale = std::locale{""}; 
    // this impacts date/time/floating point formats, so you may want tweak it just to use sepecyfic encoding and use C-loclae for formating
    std::cout.imbue(streamLocale);
    std::cin.imbue(streamLocale);

在这之后,一切都应该按照需要工作,而不需要显式进行转换的代码
由于有5个地方可以犯错,这就是人们对它感到困扰的原因,互联网上充斥着"错误";破解";解决方案。

请注意,如果系统未配置为支持所有需要的字符(例如设置了错误的代码页(,则无法转换的thsi配置字符将被问号替换。