【问题标题】:Printing out Korean in console C++在控制台 C++ 中打印出韩语
【发布时间】:2014-07-26 05:37:25
【问题描述】:

我在打印韩文时遇到问题。 我尝试了各种方法都无济于事。 我试过了

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);

有效。

【问题讨论】:

  • 控制台可能没有使用正确的code pageFWIW...
  • 我的东西“setlocale”用“korean”(或“ko_KR”)参数将代码页和字符串格式更改为韩文。这是正确的做法吗?
  • 我还注意到您使用了 clang++ 编译器。也许不同的是MingGW编译器问题?
  • 编码原因
  • 你发现了吗?我很好奇,因为我还试图将复杂的脚本打印到控制台。除非我更改我的系统区域设置或使用 ConEmu 等允许我指定字体和编码的包装程序,否则我看不到这样的字符,即使使用 Java 或 C#,前者显然对你有用。 :-(

标签: c++


【解决方案1】:

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

::SetConsoleOutputCP(65001)

【讨论】:

  • 在 cout 之前使用它,但 "한글" 输出相同。
  • 打印前试试这个 _setmode(_fileno(stdout), _O_U16TEXT);
  • 是 Visual Basic API 中的 _setmode 方法吗?因为我没有使用 Visual Basic API。
【解决方案2】:

由于您使用的是 Windows 7,因此您可以使用 Windows API 中的 WriteConsoleW。 #include &lt;windows.h&gt; 并尝试以下代码:

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

在尝试了其他对我有用的方法之后。

【讨论】:

    【解决方案3】:

    问题是有很多地方可以打破这一点。

    这里是answer 我前段时间发布的(涵盖韩语)。 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"});
    
    • 最后你必须告诉流它应该使用什么样的编码。所以对于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 配置字符将替换为问号。

    【讨论】:

      猜你喜欢
      • 2021-11-24
      • 1970-01-01
      • 2013-06-15
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2018-05-04
      • 2022-01-25
      相关资源
      最近更新 更多