Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: roginovicci от Апрель 21, 2009, 19:18



Название: перевод из одной кодовой страницы в другую
Отправлено: roginovicci от Апрель 21, 2009, 19:18
Помогите разобраться как переводить текст из одной кодовой страницы в другую. Например из кои8 в утф8 и обратно, или из кои8 в цп1251.
Работа с строками не из main() так что QTextCodec не подходит, почему то он только из тела main работает. Не до конца понимаю почему. Пока что единственное, что приходит в голову - создание дочернего класса на базе QTextCodec...


Название: Re: перевод из одной кодовой страницы в другую
Отправлено: Rcus от Апрель 21, 2009, 19:30
/*потерял на мгновение да речи*/
...!!!

что значит не из main? из WinMain? Или ваша система настолько необычна, что исполняемые модули имеют другую точку входа?

у меня QTextCodec работают нормально, давайте вы покажете нам пример в котором его использование ведет к неожиданные недокументированным результатам. И нет, для использования таких распространенных кодировок как windows-1251, koi-8 и utf8 потомки QTextCodec не нужны


Название: Re: перевод из одной кодовой страницы в другую
Отправлено: lit-uriy от Апрель 21, 2009, 19:30
>>Работа с строками не из main() так что QTextCodec не подходит,
никакой привязки кодека к функции main не существует


Название: Re: перевод из одной кодовой страницы в другую
Отправлено: roginovicci от Апрель 22, 2009, 15:40
Я имел ввиду, что действия связанные с кодеком производятся не в теле main(). Вот что у меня происходит:
Код:
#include "maindialog.h"

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);

 //   QTextCodec * myTextCodec = QTextCodec::codecForName("KOI8-R");
 //   QTextCodec::setCodecForCStrings (myTextCodec);
    MainFrame win;
    win.show();

    app.exec();

}

если раскоментировать строки начинающиеся с QTextCodec то ошибки не происходит при компиляции. А вот если тоже самое проделать в классе MainFrame:
Код:
class MainFrame : public QDialog, private Ui::MainDialog
{
    Q_OBJECT
public:
    MainFrame(QWidget *parent = 0);
public slots:
// нажали на кнопку
    void load_pressed();
};
MainFrame::MainFrame(QWidget *parent): QDialog(parent)
{
    setupUi(this);
    connect(Load_butn, SIGNAL(clicked()),this, SLOT(load_pressed()));
}
void MainFrame::load_pressed()
{
    QTextCodec * myTextCodec = QTextCodec::codecForName("KOI8-R");
    QTextCodec::setCodecForCStrings (myTextCodec);
    delete myTextCodec;
}
то происходит ошибка компиляции:
maindlg.cpp|22|error: incomplete type `QTextCodec' used in nested name specifier|


Название: Re: перевод из одной кодовой страницы в другую
Отправлено: pastor от Апрель 22, 2009, 15:51
#include <QTextCodec>

?


Название: Re: перевод из одной кодовой страницы в другую
Отправлено: roginovicci от Апрель 22, 2009, 15:55
Оппа... стыдно мне :-[...
А удалять надо объект?
Код:
 delete myTextCodec;
Я что то не понимаю. Создается объект или нет?


Название: Re: перевод из одной кодовой страницы в другую
Отправлено: spirit от Апрель 22, 2009, 16:09
не нужно его удалять таким образом,
Qt сама его убьет.
если конечно ты его сам руками не создаешь,
а получал через метод QTextCodec::codecForName и ему подобные.


Название: Re: перевод из одной кодовой страницы в другую
Отправлено: roginovicci от Апрель 22, 2009, 16:15
Да, получаю при помощи codecForName. т.е. таким образом я получаю указатель на объект созданный самой куте, да? Ведь я же не могу сам создать объект виртуального класса, верно?


Название: Re: перевод из одной кодовой страницы в другую
Отправлено: spirit от Апрель 22, 2009, 16:16
ага, Qt сама его создаетб, сама и удаляет.


Название: Re: перевод из одной кодовой страницы в другую
Отправлено: roginovicci от Апрель 22, 2009, 16:26
понял. Спасибо!