Я читаю известный ответ о строке и wstring, и возникла путаница.
исходная кодировка и кодировка выполнения установлены как utf-8, Windows x64, компилятор VC ++, консоль git bash (может печатать символы Юникода), системная кодовая страница по умолчанию 936 (GB2312).
Myкод эксперимента:
#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, то почему он не может печатать é
?