crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Проблема с кодировками, создание копии файла в UTF-16LE
XpycT
  опции профиля:
сообщение 17.11.2009, 11:57
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 43
Регистрация: 7.7.2009
Пользователь №: 883

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всем привет.
Есть у меня примерно 4000+ файлов в кодировке UCS-2 Little Endian (UTF-16LE). Суть задачи - сделать консольное приложение для автоматической обработки и пересохранения файла в такой же кодировке. Проблема в том что читаемая кодировка получается только в ANSI, а в UTF-16LE все в не читаемом виде. Нашел подобную тему на форуме, но все равно не выходит. :(

Код консольки:
#include <stdio.h>
#include <QtCore>
#include <QTextCodec>

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

    QCoreApplication app(argc, argv);

    if (argc==2)
        {
                QString rszFile=argv[1];
                ////////
                QFile fileRead( rszFile);
                if( !fileRead.open( QIODevice::ReadOnly))
                {
                    qCritical( "Can'not open file: %s for read", qPrintable( rszFile));
                    return false;
                }
                QTextCodec *pCodec = QTextCodec::codecForName("UTF-16LE");
                QTextCodec::setCodecForCStrings( pCodec);

                QString szData;
                QTextStream out( &fileRead);
                out.setCodec( pCodec);
                QString szLine;
                do
                {
                    szLine = out.readLine();
                    szData += szLine + "\r\n";
                }while( !szLine.isNull());

                fileRead.close();
                szData = szData.toLocal8Bit();
                qDebug()<<szData;
                // Здесь идет некая обработка данных...
                
                QTextCodec::setCodecForCStrings(pCodec);

                QFile fileWrite( rszFile+"111");
                if( !fileWrite.open( QIODevice::WriteOnly))
                {
                    qCritical( "Can'not open file: %s for read", qPrintable( rszFile));
                    return false;
                }
                QTextStream in( &fileWrite);
                in.setCodec( pCodec);
                in << szData;
                fileWrite.close();
                ////////

        }else
        {
                printf("Usage : tlrusencode file.dat\n");
        }

    return 1;
}


и тестовый файлик Прикрепленный файл  QUEST1.zip ( 1,45 килобайт ) Кол-во скачиваний: 162


Помогите разобраться :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.11.2009, 13:22
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(XpycT @ 17.11.2009, 14:57) *
QTextCodec::setCodecForCStrings( pCodec);
это ни к чему

Вот мой вариант:
Раскрывающийся текст
#include <QtCore>
#include <QTextCodec>

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

    QCoreApplication app(argc, argv);

    if (argc==2)
        {
                QString rszFile=argv[1];
                ////////
                QFile fileRead( rszFile);
                if( !fileRead.open( QIODevice::ReadOnly))
                {
                    qCritical( "Can'not open file: %s for read", qPrintable( rszFile));
                    return false;
                }
                QTextCodec *pCodec = QTextCodec::codecForName("UTF-16LE");

                QString szData;
                QTextStream in( &fileRead);
                in.setCodec( pCodec);
                QString szLine;
                int cnt = 0;
                while(!in.atEnd())
                {
                    szLine = in.readLine();
                    qDebug() << "Line#" << cnt++;
                    szData += szLine + "\r\n";
                }

                fileRead.close();
                qDebug()<<szData.toLocal8Bit();
                // Здесь идет некая обработка данных...
                
                QFile fileWrite( rszFile+"111");
                if( !fileWrite.open( QIODevice::WriteOnly))
                {
                    qCritical( "Can'not open file: %s for read", qPrintable( rszFile));
                    return false;
                }
                QTextStream out( &fileWrite);
                out.setCodec( pCodec);
                out << szData;
                fileWrite.close();
                ////////

        }else
        {
                printf("Usage : tlrusencode file.dat\n");
        }

    return 1;
}
но он даёт выходную кодировку без маркера (with out BOM)

Цитата(XpycT @ 17.11.2009, 14:57) *
szData = szData.toLocal8Bit();
эта строка всё портит
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
XpycT
  опции профиля:
сообщение 17.11.2009, 13:37
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 43
Регистрация: 7.7.2009
Пользователь №: 883

Спасибо сказали: 0 раз(а)




Репутация:   0  


Всеже лучше чем мой вариант, но все равно явно кодировка не совпадает...сейчас протестирую результат - может и прокатит :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.11.2009, 13:43
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(XpycT @ 17.11.2009, 16:37) *
но все равно явно кодировка не совпадает
полностью совпадает. Посто маркера в начале файла нет, как его добавить я пока не понял
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
XpycT
  опции профиля:
сообщение 17.11.2009, 13:57
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 43
Регистрация: 7.7.2009
Пользователь №: 883

Спасибо сказали: 0 раз(а)




Репутация:   0  


Все спасибо - и без БОМ переварило нормально :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.11.2009, 14:02
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Есть такой пример:
%QTDIR%\examples\tools\codecs
можно использовать как текстовый редактор с поддержкой множества кодировок, ну и исходники посмотреть.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
XpycT
  опции профиля:
сообщение 17.11.2009, 17:30
Сообщение #7


Студент
*

Группа: Участник
Сообщений: 43
Регистрация: 7.7.2009
Пользователь №: 883

Спасибо сказали: 0 раз(а)




Репутация:   0  


как текстовый редактор не вариант - такое у меня уже есть...но долго так работать...вот и надо было автоматизировать..
а под батником этот файлик прекрасно сам все конвертирует :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 1.12.2024, 13:30