Странное поведение QString (проблема с кодировкой)

122
18 февраля 2021, 23:10

Проблема заключается в том, что в разных местах программы функции, работающие со QString, ведут себя по-разному в отношении обработки кириллицы. Это касается и функции qDebug() в том числе.

Проиллюстрирую проблему вот таким, утрированным примером. Есть два класса, базовый:

ProcessObject(QString name, QObject *owner = Q_NULLPTR, ConfigurationCache* cache = Q_NULLPTR, QString desc = "")
    : DomainModel(name, DomainLevel::Object, owner, cache)      
    , m_description(desc)
    {
        qDebug() << "Это конструктор класса ProcessObject";
    }

и наследник

#include "ProcessObject.h"
InfoLabel(QString name, QString desc = "", QString vendor = "", QString swrev = "", QString cfgrev = "", QObject *owner = Q_NULLPTR, ConfigurationCache* cache = Q_NULLPTR)
    : ProcessObject(name, owner, cache, desc)
    , m_vendor(vendor)
    , m_softwareRev(swrev)
    , m_configRev(cfgrev)
    {
        qDebug() << "Это конструктор класса InfoLabel";
    }

При вызове конструктора класса наследника получаем следующий консольный вывод:

Это конструктор класса ProcessObject
��� ����������� ������ InfoLabel

Мне непонятна причина, по которой два идентичных вызова функции дают разный результат. Прошу сообщество помочь разобраться с этим вопросом.

Answer 1

Подобные проблемы с кодировкой могут быть связаны с тем, что исходники (*.cpp, *.c, .*h) в момент компиляции были в различной кодировке. Всё, что нужно, чтобы устранить данную проблему - единообразно перекодировать все исходники.

В данном случае исходный код класса ProcessObject находился в кодировке UTF-8, а InfoLabel - в кодировке, отличной от UTF-8. Это и вызвало разницу в интерпретации кириллического строкового литерала.

Вызвать такую неоднородность, могут самые разные факторы: к примеру, код писался несколькими программистами или в разных IDE. Visual Studio по умолчанию сохраняет файлы в кодировке, соответствующей региональным настройкам операционной системы (для России это CP-1251), в то время как Qt Creator позволяет установить кодировку, используемую по умолчанию.

READ ALSO
Вопрос по полиморфизму

Вопрос по полиморфизму

Как объекту класса kvadrat вызвать методы класса rectangle, а потом опять вызывать методы kvadrat??

108
Как вывести результат в POST контроллера?

Как вывести результат в POST контроллера?

Собственно создал представление

97
Ошибка преобразования типа IPoint в JSON

Ошибка преобразования типа IPoint в JSON

В таблице базы данных PostgreSQL есть столбец (nodeCoordinates) где хранятся координаты (тип geography)Данный столбец связан с моделью в приложении ASP

126