Cout << "привет"; или без << L "привет";

Почему

cout<< "привет";

работает хорошо, а

wcout<< L"привет";

нет? (в Qt Creator для Linux)

Ответ 1

По умолчанию GCC и Clang обрабатывают исходный файл как UTF-8. Ваш Linux-терминал, скорее всего, также настроен на UTF-8. Таким образом, при cout<< "привет" есть строка UTF-8, которая печатается на терминале UTF-8, все хорошо.

wcout<< L"привет" зависит от конфигурации Locale, чтобы преобразовать широкие символы в кодировку символов терминала. Язык должен быть инициализирован для того, чтобы преобразование работало (default "classic" aka "C" locale не знает, как конвертировать широкие символы). Используйте std::locale::global (std::locale ("")), чтобы Locale соответствовала конфигурации среды или std::locale::global (std::locale ("en_US.UTF-8")), чтобы использовать определенный язык (подобный этому примеру C).

Здесь полный источник рабочей программы:

#include <iostream>
#include <locale>
using namespace std;
int main() {
  std::locale::global (std::locale ("en_US.UTF-8"));
  wcout << L"привет\n";
}

С g++ test.cc && ./a.out это печатает "привет" (на Debian Jessie).

См. также этот ответ об опасностях использования широких символов со стандартным выходом.