crossplatform.ru

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

> Кодировки, кодировки...
Rocky
  опции профиля:
сообщение 26.2.2010, 18:57
Сообщение #1


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

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




Репутация:   7  


Всем привет!

Подскажите плиз с таким моментом. Беру текстовый файл, открываю, прогоняю его через QTextStream с заданной кодировкой, сохраняю... Все ок. Если 2-й раз сделать тоже самое - вместо русских букв кракозябры... Это нормально? ) Просто как-то непонятно... Помогите разобраться плиз )

Т.е. изначально у файла win1251. Прогнал сохранил в utf-8. На этом моменте все ок.. Потом опять его беру и прогоняю в utf-8 - вместо русских комментов - чушь... ( Ощущение что это как-то связано с юникодом...
Вот функция:
void CFileDecoder::DecodeFile(const QString& sSourceFile, const QString& sWantedCodec) 
{
    QFile oSourceFile(sSourceFile);
    if (!oSourceFile.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        //...
        return;
    }
    
    QTextStream oInStream(&oSourceFile);
    const QString sCurCodec = oInStream.codec()->name();
    if (!sCurCodec.compare(sWantedCodec, Qt::CaseInsensitive)) return;

    const QString sTargetFile = ...;
    QFile oTargetFile(sTargetFile);
    if (!oTargetFile.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate))
    {
        //...
        return;
    }
    
    QTextStream oOutStream(&oTargetFile);
    oOutStream.setCodec(QTextCodec::codecForName(sWantedCodec.toStdString().c_str()));
    oOutStream << oInStream.readAll();


Вот в этом месте я так поинмаю что name() возвращает не кодировку файла, а кодировку которую я выставил для всего приложения (вызовом статической функции)
QTextStream oInStream(&oSourceFile);
const QString sCurCodec = oInStream.codec()->name();

так ведь?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
SABROG
  опции профиля:
сообщение 26.2.2010, 21:30
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

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




Репутация:   34  


Цитата(Rocky @ 26.2.2010, 20:21) *
не позволяет определить автоматически кодировку


Qt умеет определять только UTF16/32 по BOM'у. Так что на него не полагайся. Твоя задача сводится к реализации своего варианта программы "Штирлиц", но даже она ошибается. Поэтому проси пользователя, чтобы жестко задавал исходную и желаемую кодировки, если автоматически определить не удалось. Думаю в интернете должны быть статьи как по частотному анализу букв определить кодировку файла. В разных языках частота встречаемости тоже разная Может быть даже готовые библиотеки есть какие-нибудь.

Простой алгоритм заключает в том, чтобы последовательно предполагать кодировки файлов и пытаться конвертировать другую, затем подсчитывать встречаемость букв. Но этот алгоритм будет работать только на более менее больших файлах, где русский и английский текст не миксуются 50/50.

Сообщение отредактировал SABROG - 26.2.2010, 21:32
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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




RSS Текстовая версия Сейчас: 28.12.2024, 8:22