Как работают кодировки при компиляции
Компилирую этот код:
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 шт):
Наоборот, лучше стремиться везде использовать UTF-8. (Win1251 - только для кириллицы и латинницы, а UTF-8 - универсальная.)
Поэтому, исходный код сохранить в UTF-8, а в начало main дописать (вместо setlocale
)
#ifdef _WIN32
SetConsoleOutputCP(CP_UTF8);
#endif
чтобы на винде консоль печатала тоже UTF-8.