Как работают кодировки при компиляции

Компилирую этот код:

setlocale(LC_ALL, "");
string mystr = "русские символы";
cout << mystr << endl;

И возникает проблема с разными компиляторами и разными ОС.

Самый удачный случай с компилятором MSVC - в консоли символы отображаются правильно, не важно какая кодировка файла.

Проблема начинается с компиляторами G++ и Clang. В случае Windows для правильной компиляции и отображения символов им требуется кодировка файла в Windows 1251 (т.е. кодировка моей системы). Если я, например, поставлю кодировку cpp файла в UTF-8, то откомпилированный .exe файл буде выводить в консоль

"С?С?С?С?РєРёРч С?РёР?Р?Р?Р>С<"

вместо

"русские символы"

Аналогичная ситуация с G++ и Clang в Linux, только наоборот. Кодировка в Linux UTF-8. Если кодировка файла будет иная, то будет выводиться это

??????? ???????

С чем это связано? Почему компилятор MSVC работает корректно, а другие нет. И можно ли как то это исправить и правильно компилировать при помощи G++ и Clang?


Ответы (1 шт):

Автор решения: HolyBlackCat

Наоборот, лучше стремиться везде использовать UTF-8. (Win1251 - только для кириллицы и латинницы, а UTF-8 - универсальная.)

Поэтому, исходный код сохранить в UTF-8, а в начало main дописать (вместо setlocale)

#ifdef _WIN32
SetConsoleOutputCP(CP_UTF8);
#endif

чтобы на винде консоль печатала тоже UTF-8.

→ Ссылка