Russian Qt Forum
Ноябрь 23, 2024, 02:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: как определить кодировку строки?  (Прочитано 16832 раз)
piton
Гость
« : Сентябрь 11, 2005, 16:02 »

есть переменная QString, в нее записана информация из файла.
кодировку файла я не знаю (т.е. программа не знает, а не я Улыбающийся)
возможны варианты - utf8, koi8-r, utf8
мне нужно перевести строку в юникод, для этого, разумеется, удобно использовать QTextCodec, но чтобы правильно перекодировать, я должен как-то узнать исходную кодировку строки...Улыбающийся
подскажите, можно-ли это как-нибудь сделать средствами QTextCodec, или иными?
Записан
DenKor
Гость
« Ответ #1 : Сентябрь 11, 2005, 21:29 »

Можешь попробовать частотный анализ букв алфавита на больших текстах.

Я для своих нужд (ВЫБОР МЕЖДУ 866 ИЛИ 1251) пользовался следующим приемом:

src - исходная строка
1. Перекодируем src из 866 в 1251 - src2
2. Перекодируем src2 из 1251 в 866 - src3
Если исходная строка src == src3, тогда кодировка действительно
866 иначе она была 1251
Записан
DenKor
Гость
« Ответ #2 : Сентябрь 11, 2005, 21:32 »

Т.е. в различных кодировках есть коды символы, которые отсутсвуют в других кодировках.
Но частотный анализ самый действенный метод при наличии мусора в тексте.
Записан
piton
Гость
« Ответ #3 : Сентябрь 12, 2005, 19:48 »

Спасибо.
тока у меня теперь непонятка возникла
как перевести текст из не-юникода в не-юникод?
у QTextCodec только функции типа toUnicode, fromUnicode..

P.S. насчет частотного анализа - текст очень маленький, одно-два слова..
Записан
DenKor
Гость
« Ответ #4 : Сентябрь 12, 2005, 21:13 »

Например инициализацией 2 переменных

QByteArray encodedString = "...";
QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
QString string = codec->toUnicode(encodedString);
codec = QTextCodec::codecForName("IBM 866");
QByteArray encodedString2 = codec->fromUnicode(string);

Имхо если у тебя несколько слов, то нефакт что тебе такое преобразование поможет. Смотри саму идею нахождения кодировки.

Она заключается в том, в тектсе ищутся коды символов однозначно определяющих кодировку (например если в тестовом файле есть код '0', то это скорее всего уникод).
Возьми таблицы определения кодировок из qtextcodec.cpp и посмотри  уникальные диапазоны символов руского алфавита.

Соответсвенно если у тебя в тексте такие символы отсутвуют, то тебе поможет только словарь слов или искуственный интелект :lol:
Записан
piton
Гость
« Ответ #5 : Сентябрь 13, 2005, 20:37 »

Гхм..=)
Вобщем, выше описанный тобою метод в принципе работает, но не может отличить KOI8-R от utf8 =)
Записан
Hellenna
Гость
« Ответ #6 : Сентябрь 13, 2005, 21:30 »

Цитата: "piton"
есть переменная QString, в нее записана информация из файла.


если не привязываться к QString, и читать из файла в char*, то кодировку замечательно определяет QTextCodec::codecForContent(...).

Пример : $QTDIR/examples/qwerty
Записан
DenKor
Гость
« Ответ #7 : Сентябрь 14, 2005, 21:15 »

Вот реализация класса qt (3.3.4)

int QWindowsLocalCodec::heuristicContentMatch(const char* chars, int len) const
{
    // ### Not a bad default implementation?
    QString t = toUnicode(chars,len);
    int l = t.length();
    QCString mb = fromUnicode(t,l);
    int i=0;
    while ( i < len ) {
   if ( chars == mb )
       i++;
       else
      break;
    }
    return i;
}
QTextCodec* QTextCodec::codecForContent(const char* chars, int len)
{
    setup();
    QValueList<QTextCodec*>::ConstIterator i;
    QTextCodec* result = 0;
    int best=0;
    QTextCodec* cursor;
    for ( i = all->begin(); i != all->end(); ++i ) {
   cursor = *i;
   int s = cursor->heuristicContentMatch(chars,len);
   if ( s > best ) {
       best = s;
       result = cursor;
   }
    }
    return result;
}

Имхо какой задал второй вопрос про кодеки такой и получил ответ
 :lol:

А так они используют ту же идею, что я предложил.
Как говорилось ранее не факт, что таким способом ты определишь кодировку.
В их реализации они переводят не всю строку, а по символьно и выбирают кодек с наименьшей погрешностью.
Для твоего текста это будет первый в списке, если все символы будут из диапазона двух кодеков.
Например ты сможешь определить в какой кодировке текст
"user" -Latin1,Koi8-r,866,1251 ?
Записан
Hellenna
Гость
« Ответ #8 : Сентябрь 15, 2005, 10:23 »

когда мне надо было в программе определять кодировку файла, я прикручивала к ней консольную утилиту enca (это все для линукса, но для винды скорее всего тоже есть)...она вроде определяет кодировку нормально...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 21.