我正在阅读有关字符串和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_t
与L
前缀字符串文字一起使用。在Windows wchar_t
下用UTF-16编码(它是硬编码的吗?无论我选择什么源字符集或执行字符集,L"abc"
总是具有相同的UTF-16代码单元)。
问题是:它如何wcout
UTF-16编码的字符串(“abc”),而我的源文件是utf-8,执行字符集是utf-8。该程序不应该能够识别UTF-16编码的东西,除非我将所有东西都设置为utf-16。
如果它能以某种方式打印UTF-16,那为什么不能打印é
?
答案 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模式(这需要未记录的系统调用)。