Есть UTF-8 строка с русским текстом: "\xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82".
Надо вывести ее на консоль так, чтобы это работало на следующих трех платформах и компиляторах:
- Windows и VC++,
- Windows и MinGW,
- Linux и gcc.
Предполагается что шрифт консоли позволяет показать хотя бы русские буквы.
Следует обратить внимание на то, что в MinGW локали реализованы не полностью, и многие решения для VC++ не будут работать.
MinGW можно взять здесь.
Можно использовать #ifdef. Можно использовать сторонние библиотеки, например Boost.
Вот пример решения дня MinGW, но нужна поддержка всех трех платформ.
> type main.cpp
#include <Windows.h>
#include <string>
#include <codecvt>
#include <locale>
int main() {
std::wstring_convert<std::codecvt_utf8<wchar_t, 0x10ffff, std::little_endian>, wchar_t> conv;
std::wstring ws = conv.from_bytes("[test \xd1\x82\xd0\xb5\xd1\x81\xd1\x82 \xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88]\n");
DWORD _; ::WriteConsoleW(::GetStdHandle(STD_OUTPUT_HANDLE), ws.c_str(), ws.size(), &_, nullptr);
}
> g++ -std=c++14 -O2 -Wall -pedantic main.cpp && a
[test тест テスト]
#ifdef _MSCVER+ особый код для винды. – VladD Mar 30 '16 at 22:56wstring, можно воспользоваться кодом из вопроса по ссылке из первого комментария. Выводить просто черезwcout. (Интересно, а покатит ли то решение для MinGW?) – VladD Mar 30 '16 at 23:10wcout? – VladD Mar 30 '16 at 23:15_setmode(_fileno(stdout), _O_U16TEXT);? – VladD Mar 31 '16 at 00:36setlocale(LC_ALL, ""); std::wcout << L"\u0442\u0435\u043a\u0441\u0442";, если хочется локаль поддерживать, но это сломается если локаль не сконфигурирована (С). На *nix в большинстве случаев лучше просто utf-8 кодировку поддерживать. Посмотрите какBoost.NoWideбиблиотека реализована: на Винде WriteFile/WriteConsoleW используются, на других системах просто utf-8 строчки используйте:std::cout << "текст \u0442\u0435\u043a\u0441\u0442"– jfs May 21 '16 at 10:46