Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: antoshib от Октябрь 09, 2014, 15:45



Название: ломается кодировка в dll
Отправлено: antoshib от Октябрь 09, 2014, 15:45
Проблема в передаче кириллических строк из приложения (собрано в Delphi в кодировке CP1251)
в DLL-библиотеку (собрана в QT с кодировкой CP1251).

Принятую в длл строчку вывожу в лог-файл и вижу вместо кириллицы вопросики "???????".

Строчки кириллицы, созданные внутри самой длл, выводятся в лог корректно.

Проверил посимвольно принятую строчку - там правильные коды кириллических символов (а - 1072, б - 1073..).

Но почему-то в файл выводит вопросики.. помогите разобраться плиз.

Код:
// void* Request->Data;
// int     Request->DataSize;

QString ostr;
QString stringForLog = QString("\nSTR=%1\n").arg( ostr.setRawData((QChar*) Request->Data, Request->DataSize) );

logString( stringForLog );


PS:
Прошу прощения, тему можно закрыть, помогло:

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));



Название: Re: ломается кодировка в dll
Отправлено: gil9red от Октябрь 09, 2014, 17:23
Проверьте кодировку файла :)


Название: Re: ломается кодировка в dll
Отправлено: kai666_73 от Октябрь 09, 2014, 17:33
PS:
Прошу прощения, тему можно закрыть, помогло:

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));

В принципе сгодится, если есть уверенность что не понадобится переход на Qt5.
Универсальнее будет так:
Код:
    QTextCodec *codec = QTextCodec::codecForName("Windows-1251");
    QString stringForLog = codec->toUnicode((char *) Request->Data);


Название: Re: ломается кодировка в dll
Отправлено: antoshib от Октябрь 09, 2014, 17:43
 :) Спасибо! приму на заметку


Название: Re: ломается кодировка в dll
Отправлено: antoshib от Октябрь 17, 2014, 16:17
Дабы не плодить тем, спрошу тут.
Проблема в том, что при построчном считывании файла и передаче его для отправки через gSOAP
в строке теряется часть символов кириллицы. А при низкоуровневом чтении все проходит нормально.

вот этот код работает криво (но хочется чтоб работал прямо)) :

Код:
QString  fileName;
//...
QFile     file( fileName );
QStringList fStrings;

file.open(QIODevice::ReadOnly | QIODevice::Text);
fStrings = QTextStream(&file).readAll().split("\n");
file.close();
//...
QString uLine;
size_t r;

foreach( QString fLine, fStrings )
        if ( r = fLine.size() ){
            uLine = (fLine+"\n");

            soap_send_raw( soap, uLine.toUtf8().constData(), r+1 );   // в этом месте пропадает кусок строки, если в ней есть кириллица (utf-8)
        }
//...


а этот код работает правильно:

Код:
QString  fileName;
FILE *fd = fopen( fileName.toStdString().c_str(), "rb");

size_t r;

while(1){
      r = fread(soap->tmpbuf, 1, sizeof(soap->tmpbuf), fd);
      if (!r)
         break;

      if (soap_send_raw(soap, soap->tmpbuf, r))  // тут кириллица отправляется хорошо
         break;
}
fclose(fd);


Название: Re: ломается кодировка в dll
Отправлено: antoshib от Октябрь 21, 2014, 12:24
стало немного лучше, но передается utf-16, вместо ожидаемого utf-8  :-\
Код:
           soap_send_raw( soap, (char*) uLine.toStdWString().c_str(), 2*(r+1) );


Название: Re: ломается кодировка в dll
Отправлено: antoshib от Октябрь 24, 2014, 12:15
ну знатокиии... где вы  ???


Название: Re: ломается кодировка в dll
Отправлено: Авварон от Ноябрь 06, 2014, 12:26
QFile::read


Название: Re: ломается кодировка в dll
Отправлено: antoshib от Ноябрь 07, 2014, 14:48
QFile::read

Спасибо, заработало!