C ++如何使用utf-16编码的char数组?

时间:2018-05-31 04:23:48

标签: c++ encoding

我正在阅读有关字符串和wstring的着名answer,并且会出现一些混乱。

source charset和execution charset都设置为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,那为什么不能打印é

2 个答案:

答案 0 :(得分:2)

您需要非标准的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。

答案 1 :(得分:0)

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

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

另见this answer