在C++控制台中打印出韩文

8
我很困扰如何打印韩文。我尝试了各种方法,但都没有成功。我已经尝试过:

1.

    cout << "한글" << endl;

2.

    wcout << "한글" << endl;

3.

    wprintf(L"한글\n");

4.

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

还有更多。但是所有这些都打印出“한글”。我正在使用MinGW编译器,我的操作系统是Windows 7。

P.S 奇怪的是Java可以正常打印出韩文。

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

工作。


2
控制台可能没有使用正确的代码页。FWIW... - chris
我认为 "setlocale" 函数可以通过传入 "korean" (或 "ko_KR") 参数来改变代码页和字符串格式为韩文。这样做是正确的吗? - user3879095
我注意到您使用了clang++编译器。也许问题出在不同的MingGW编译器上? - user3879095
这是由于编码的原因。 - WannaBeCoder
你解决了这个问题吗?我非常好奇,因为我也试图将复杂的脚本打印到控制台。除非我修改系统区域设置或使用像ConEmu这样的包装程序,让我可以指定字体以及编码方式,否则我无法看到这样的字符,即使是使用Java或C#,而前者显然对你有效。 :-( - user539810
哇..这是Windows的问题。Qt现在可以正常打印韩语了。 所以我做的是在Windows的区域和语言设置中,将系统区域设置更改为“韩国”,现在运作得很好.. 感谢大家的帮助! - user3879095
3个回答

2

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

::SetConsoleOutputCP(65001)

在使用cout之前用它,但输出结果却是“한글”。 - user3879095
1
在打印之前尝试使用_setmode(_fileno(stdout), _O_U16TEXT); - dvasanth
_setmode方法是来自Visual Basic API吗?因为我没有使用Visual Basic API。 - user3879095

0

由于您正在使用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

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


0

问题在于有很多地方可能会出现问题。

这里是我之前发布的答案(涵盖韩语)。答案适用于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"});

最后,您需要指示流使用哪种编码方式。因此,对于 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个可能出错的地方,这就是人们遇到问题的原因,因此互联网上充满了“黑客”解决方案。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接