LINUX.ORG.RU

[Qt] Вопрос по кодировкам

 


0

0

Привет всем! Не могу никак понять, в чем проблема. Если конструкцию

    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForLocale(codec);
    QTextCodec::setCodecForCStrings(codec);
закомментировать, то обе строки отображаются нормально, зато неправильно отображаются нулевые символы. Если оставить, то строка получаемая из dict.cpp, отображается кракозябрами. Системная кодировка - юникод.

main.cpp

#include <main.h>

int main(int argc, char *argv[])
{
    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    QTextCodec::setCodecForLocale(codec);
    QTextCodec::setCodecForCStrings(codec);

    qDebug() << str;

    QString str2("ТЕСТ");
    qDebug() << str2;

    qDebug() << str[0];
    qDebug() << str2[0];

    return 0;
}

main.h

#ifndef MAIN_H
#define MAIN_H
#include <dict.h>
#include <QString>
#include <QDebug>
#include <QTextCodec>

#endif // MAIN_H

dict.cpp

#include "dict.h"
QString str = "ТЕСТ";

dict.h

#ifndef DICT_H
#define DICT_H
#include <QString>
extern QString str;
#endif // DICT_H

Ответ на: комментарий от nu11

Не, не в этом дело.
Как оказалось, дело не в использовании нескольких файлов, а в том, что кодировка ломается при объявлении переменной в начале программы, вне функций. Если эту же строку возвратит функция - все в порядке.

Все равно спасибо.

robert_foster ★★
() автор топика
Ответ на: комментарий от nu11
    QTextCodec *codec = QTextCodec::codecForName("UTF-8"); 
    QTextCodec::setCodecForLocale(codec); 
    QTextCodec::setCodecForTr(codec); 
 
    qDebug() << str; 
 
    QString str2=tr("ТЕСТ"); 

Попробуй так.

Zhbert ★★★★★
()
Ответ на: комментарий от robert_foster

Как оказалось, дело не в использовании нескольких файлов, а в том, что кодировка ломается при объявлении переменной в начале программы, вне функций. Если эту же строку возвратит функция - все в порядке.

Эхх, описано конечно коряво. Глобальные переменные инициализируются до начала выполнения функции main - соответственно все настройки кодека ещё не выполнены, поэтому правильно инициализировать

QString str = QString::fromUtf8("ТЕСТ"); 
Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

Какое простое объяснение. И почему я сам не понял, очевидно же. Надо, надо матчасть учить. Спасибо огромное.

А таким образом инициализировать проблематично в моем случае. Я показывал проблему на простом примере, но в основной программе у меня массив структур из нескольких строк, каждую так инициализировать напряжно будет.

robert_foster ★★
() автор топика
Ответ на: комментарий от robert_foster

А таким образом инициализировать проблематично в моем случае. Я показывал проблему на простом примере, но в основной программе у меня массив структур из нескольких строк, каждую так инициализировать напряжно будет.

Вообще глобальные переменные инициализируются в порядке их объявления в единице трансляции, так что код задания кодеков можно вынести в коструктор переменной, которая будет инициализироваться до массива структур со строками. Что-то типа:

struct CodecInit
{
  CodecInit() 
  {
    ... тут код задания кодеков ...
  }
};

static CodecInit codecInit;

QString a = "ыыы";

Но надо отметить, что порядок инициализации глобальных переменных в разных единицах трансляции не определён.

Begemoth ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.