его такое странное поведение или нет. Допустим есть файл в кодировке UTF-8 with signature (BOM) codepage 65001. На двух разных компах установлена Windows 10 и VisualStudio 2019 которая и там, и там отображает файл в правильной кодировке UTF-8 with BOM.
В этом файле допустим хардкод строки на кириллице, выглядит это так:
QTextCodec* textCodec = QTextCodec::codecForName("Windows-1251");
textCodec->toUnicode("Русский язык");
Это осталось в сурсах случайно после перевода их всех на UTF-8, легаси проект.
Что самое удивительное, на одном компе с той же системой и студией после компиляции мы конечно увидим белеберду. Насколько я понял потому что QTextCodec пытается воспринять текст в UTF-8 (исходник же в UTF-8) как cp1251 а потом отобразить это в юникод. Если изменить кодек или просто его убрать всё работает.
Но на другом компе где студия тоже открывает этот файл в UTF-8 with BOM кодек работает нормально и возвращает ожидаемый результат. При этом если его убрать, то вместо текста мы увидим белеберду, будто исходник всё-таки в cp1251. То есть поведение прямо противоположное.
Но если попытаться открыть его в cp1251 то русский текст превратится в крякозябры, то есть файл всё-таки действительно в UTF-8 with BOM. Как такое поведение вообще можно объяснить и что в данном случае делать? Ведь исправление ошибки на одном компе ломает проект на другом и наоборот. Хотя поведение в первом случае более логичное, когда кодек становится причиной ошибки.
На всякий случай напишу здесь ответ. Проблемы были в регионе. Не зависимо от кодировки файла MSVC без специальных флагов интерпретирует файл в кодировке локали. В отличии от GCC, который обращается к локали только после неудачной попытки интерпретировать как UTF-8. В MSVC подобное поведение насколько я понял пока недопилено. Но я теперь понял что MSVC лучше всегда юзать с флагом /utf-8
Обсуждают сегодня