LINUX.ORG.RU

Подскажите как перекодировать строку в Qt5

 ,


0

1

Подскажите как перекодировать строку в Qt5

Исходная кодировка ibm866 Отображается как Windows-1252 Перекодировать нужно в Unicode

вот сам текст

Ž¯¥à æšš ¯« â¥Š¥© ¯® äšà¬¥ ”-‹ ‘Žƒ€‡ ‚ --------------------------------------------------------------------------------------------------------------------------------------------------------- |”šà¬  |’¥à¬š­ «|®¬¥à ª àâë |‘㬬  |Š®¬šáášï|„ â  ®¯¥à æšš |„ â  à áç¥â®¢ |„®¯. € ­­ë¥ |‘áë«/­®¬¥à | --------------------------------------------------------------------------------------------------------------------------------------------------------- | |60075600|956381******7561 |-15000 | 0 |12.02.2015 10:31:09 |13-02-2015 | |003467775584| --------------------------------------------------------------------------------------------------------------------------------------------------------- ˆâ®£® | 100.00 |-822.52 ª ¢®§¬¥é¥­šî |-722.52 |

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

QTextCodec *codec = QTextCodec::codecForName(«IBM 866»); QString line = codec->toUnicode(stream.readLine().toLocal8Bit());

QTextCodec *codec2 = QTextCodec::codecForName(«Windows-1252»); QString line2 = codec2->fromUnicode(line.toLocal8Bit());

QTextCodec *codec3 = QTextCodec::codecForName(«Windows-1252»); QString line3 = codec3->toUnicode(line2.toLocal8Bit());

Есть подозрение, что я делаю что то не так.

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

Выставь правильный кодек для stream. Либо через QTextStream::setCodec, либо глобально через QTextCodec::setCodecForLocale. По умолчанию QTextStream интерпретирует содержимое файла как UTF-8 при конвертировании в QString. Отсюда все проблемы.

archie
()
Ответ на: комментарий от UVV

А что вместо него теперь?

Теперь - только явная конвертация. В Qt 5 предполагается, что все строки вида char *str будут всегда в UTF-8. Например, конструктор QString::QString(const char * str) теперь всегда конвертирует переданную строку из UTF-8 в свое 16-битное представление и это поведение больше изменить нельзя.

В доке показано, как правильно конвертировать строки из QByteArray в QString:

QByteArray encodedString = "...";
QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
QString string = codec->toUnicode(encodedString);
archie
()
Ответ на: комментарий от archie

Что то у меня ни как не выходит

    QTextStream stream(&mFile);
    stream.setCodec("IBM 866");

    QTextCodec *codec = QTextCodec::codecForName("Windows-1252");
    QTextDecoder *decoder = codec->makeDecoder();

    QString string;
    while (!stream.atEnd()) {
        QByteArray chunk = stream.readLine().toLocal8Bit();
        QString tmp =  decoder->toUnicode(chunk);
        
        QTextCodec *codec = QTextCodec::codecForName("UTF-8");
        QByteArray encodedString = codec->fromUnicode(tmp);
        string += encodedString;
    }
    delete decoder;

    qDebug() << string;
    mFile.close();

на выходе

Операции платежей по фирме Ф-Л СОГАЗ В ---------------------------------------------------------------------------------------------------------------------------------------------------------|Фирма  |Терминал|Номер карты        |Сумма         |Комиссия|Дата операции       |Дата расчетов       |Доп. данные                        |Ссыл/номер  |---------------------------------------------------------------------------------------------------------------------------------------------------------|       |60075600|956381******7561   |-15000        | 0      |12.02.2015 10:31:09 |13-02-2015          |                                   |003467775584|---------------------------------------------------------------------------------------------------------------------------------------------------------Итого                                | 100.00       |-822.52  к возмещению |-722.52     |

теперь пишет что исходная кодировка Windows-1252 отображается как UTF-8

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

Так как мне утилита сказала, что текст в исходной кодировке ibm866, но отображается как Windows-1252 И внизу в окошке раскодированный текст.

jeka_sharapov
() автор топика

Другой декодер определил кодировку след. образом:

ISO 8859-15 ------> cp866

окай,

    QTextStream stream(&mFile);
    stream.setCodec("ISO 8859-15");

    QTextCodec *codec = QTextCodec::codecForName("IBM 866");
    QTextDecoder *decoder = codec->makeDecoder();

    QString string;
    while (!stream.atEnd()) {
        QByteArray chunk = stream.readLine().toLocal8Bit();
        QString tmp =  decoder->toUnicode(chunk);
        string += tmp;
    }
    delete decoder;

    qDebug() << string;
    
    mFile.close();

На выходе уже что то появилось

┬О┬п┬е├а┬а├ж┼б┼б ┬п┬л┬а├в┬е┼а┬е┬й ┬п┬о ├д┼б├а┬м┬е ┬Ф-┬Л ┬С┬О┬Г┬А┬З ┬В ---------------------------------------------------------------------------------------------------------------------------------------------------------|┬Ф┼б├а┬м┬а  |┬Т┬е├а┬м┼б┬н┬а┬л|┬Н┬о┬м┬е├а ┬к┬а├а├в├л        |┬С├г┬м┬м┬а         |┬К┬о┬м┼б├б├б┼б├п|┬Д┬а├в┬а ┬о┬п┬е├а┬а├ж┼б┼б       |┬Д┬а├в┬а ├а┬а├б├з┬е├в┬о┬в       |┬Д┬о┬п. тВм┬а┬н┬н├л┬е                        |┬С├б├л┬л/┬н┬о┬м┬е├а  |---------------------------------------------------------------------------------------------------------------------------------------------------------|       |60075600|956381******7561   |-15000        | 0      |12.02.2015 10:31:09 |13-02-2015          |                                   |003467775584|---------------------------------------------------------------------------------------------------------------------------------------------------------┬И├в┬о┬г┬о                                | 100.00       |-822.52  ┬к ┬в┬о┬з┬м┬е├й┬е┬н┼б├о |-722.52     |
jeka_sharapov
() автор топика
Ответ на: комментарий от jeka_sharapov

Так ты возьми в руки iconv, и разберись методом тыка. Ты же не знаешь, в какой кодировке изначально текст.

И что за танцы с windows 1252, мало ли что оно там показывает. Если бы показывало правильно, то был бы верный текст. И работай с исходником, а не то что там тебе какая-то там программа портит.

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