как может C ++ wcout utf-16 закодированный массив символов? - PullRequest
0 голосов
/ 31 мая 2018

Я читаю известный ответ о строке и 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, то почему он не может печатать é?

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Вам необходим нестандартный системный вызов 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.

Также обратите внимание, что файл исходного кода должен иметь спецификацию, в противном случае компилятор не распознает его как Unicode.

0 голосов
/ 31 мая 2018

Консоль Windows не поддерживает вывод UTF-16.Он поддерживает только 8-битный вывод и частично поддерживает 8-битные MBCS, такие как Big5 или UTF-8.

Для отображения символов Unicode на консоли вам необходимо выполнить преобразование в UTF-8.или другой MBCS в вашем коде, а также переведите консоль в режим UTF-8 (для которого требуется системный вызов без документов).

См. также этот ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...