LINUX.ORG.RU

Крякозябры в записываемом файле из qt.

 , , ,


0

1

Нужно из одного файл (в ANSI кодировке файл) считать русский текст и записать в другой файл. Делаю так:

QFile * file_imit = new QFile(this);
    file_imit->setFileName("imitator.txt");
    if(!file_imit->open(QFile::ReadOnly))
    {
        qDebug() << "error" << file_imit->errorString();
    }
    QByteArray buffer2;
    buffer2 = file_imit->readLine();
    
    QTextCodec::ConverterState state;
    QTextCodec *codec = QTextCodec::codecForName("UTF-8");
    
    QString text = codec->toUnicode(buffer2.constData(), buffer2.size(), &state);
    
    qDebug() << "text" << text << "state.invalidChars" << state.invalidChars;
    
    if (state.invalidChars > 0) //если не угадали
    {
        text = QString::fromLatin1(buffer2);
        qDebug() << "fromLatin1" << text;
    }
    
    qDebug() << "manufactureNumber" << text;
    QString manufacture = text; 
    
    //QString manufacture = "A0404           ";  //это работает
    
    
    QString buffer;
    
    buffer.append("Заводской №:" + manufacture + "\r\n");
    
    
    QFile file;
    file.setFileName("info.txt");
    if(file.open(QFile::WriteOnly))
    {      
        file.write(buffer.toStdString().c_str(), buffer.toStdString().size());
        file.close();
    }
    

Вывод:

text "?0404           " state.invalidChars 1 
fromLatin1 "A0404           " 
manufactureNumber "A0404           "
В файле info.txt
Заводской №:À0404 

По выводу все нормально считал «A0404» текст из файла, но криво пишет в другой файл. Подскажите где ошибка ?

ANSI кодировке файл

Нет такой кодировки. Это псевдоним для однобайтных системных кодировок видимо в MS Windows.

EXL ★★★★★
()

Очевидно же, что в кодировках косяк.

Zhbert ★★★★★
()

Ты так и не сказал в какой исходной кодировке файл. ANSI - это не про национальные кодировки. Для русского текста у тебя может быть KOI-8R, CP1251, и тому подобное, если имеются в виду однобайтовые кодировки.

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

Как определить его кодировку исходного файла ? В бинарном виде посмотрел, все русские символы по 1 байту занимают.

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

погадай на кофейной гуще ;)

если других идей нет, то примерно так

iconv -f WINDOWS-1251 imitator.txt
iconv -f CP866 imitator.txt
iconv -f KOI8-R imitator.txt
...
все возможные варианты я тебе не назову — тут сам. Когда угадаешь кодировку можно будет прочитать текст

P.S. также можно «гадать» с помощью редактора или браузера. Неужели никогда не видел текстов в «неизвестной» кодировке?! А вот file на моей памяти ни разу не угадал :( однобайтную кодировку с кириллицей

anonymous
()
Ответ на: комментарий от user2132

Как определить его кодировку исходного файла ? В бинарном виде посмотрел, все русские символы по 1 байту занимают.

Онлайн-декодер кодировок

http://2cyr.com/decode/?lang=ru

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