如何C++ WCOUT UTF-16 编码的字符数组?

how can C++ wcout utf-16 encoded char array?

本文关键字:字符 数组 编码 C++ WCOUT UTF-16 如何      更新时间:2023-10-16

我正在阅读关于字符串和wstring的著名答案,并遇到了一些困惑。

源字符集和执行字符集均设置为UTF-8,Windows x64,VC++编译器,git bash控制台(可以打印Unicode字符(,系统默认代码页936(GB2312(。

我的专家代码:

#include <cstring>
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
wchar_t c[] = L"olé";
wchar_t d[] = L"abc";
wcout << c << endl;
wcout << d << endl;
return 0;
}
可以打印">

abc",但不能打印"é"。

我知道wchar_tL前缀字符串文字一起使用。在Windows下wchar_t用UTF-16编码(这是硬编码的吧?无论我选择什么源字符集或执行字符集,L"abc"总是具有相同的 UTF-16 代码单元(。

问题是:它怎么能wcout一个 UTF-16 编码的字符串("abc"(,而我的源文件是 utf-8,执行字符集是 utf-8。该程序应该无法识别 UTF-16 编码的内容,除非我将所有内容都设置为 utf-16。

如果它可以以某种方式打印 UTF-16,那么为什么它不能打印é

您需要非标准的 Windows 系统调用才能启用 UTF-16 输出。

#include <iostream>
#include <io.h>
#include <fcntl.h>
#include <stdio.h>
int main()
{
_setmode(_fileno(stdout), _O_U16TEXT); // <=== Windows madness
std::wcout << L"olén";
}

请注意,执行此操作后不能使用cout,只能使用wcout

另请注意,源代码文件必须具有 BOM,否则编译器将无法将其识别为 Unicode。

Windows 控制台不支持 UTF-16 输出。 它仅支持 8 位输出,并且部分支持 8 位 MBCS,例如 Big5 或 UTF-8。

要在控制台上显示 Unicode 字符,您需要在代码中转换为 UTF-8 或其他 MBCS,并将控制台置于 UTF-8 模式(这需要未记录的系统调用(。

另请参阅此答案