Название: как определить кодировку строки? Отправлено: piton от Сентябрь 11, 2005, 16:02 есть переменная QString, в нее записана информация из файла.
кодировку файла я не знаю (т.е. программа не знает, а не я :)) возможны варианты - utf8, koi8-r, utf8 мне нужно перевести строку в юникод, для этого, разумеется, удобно использовать QTextCodec, но чтобы правильно перекодировать, я должен как-то узнать исходную кодировку строки...:) подскажите, можно-ли это как-нибудь сделать средствами QTextCodec, или иными? Название: как определить кодировку строки? Отправлено: DenKor от Сентябрь 11, 2005, 21:29 Можешь попробовать частотный анализ букв алфавита на больших текстах.
Я для своих нужд (ВЫБОР МЕЖДУ 866 ИЛИ 1251) пользовался следующим приемом: src - исходная строка 1. Перекодируем src из 866 в 1251 - src2 2. Перекодируем src2 из 1251 в 866 - src3 Если исходная строка src == src3, тогда кодировка действительно 866 иначе она была 1251 Название: как определить кодировку строки? Отправлено: DenKor от Сентябрь 11, 2005, 21:32 Т.е. в различных кодировках есть коды символы, которые отсутсвуют в других кодировках.
Но частотный анализ самый действенный метод при наличии мусора в тексте. Название: как определить кодировку строки? Отправлено: piton от Сентябрь 12, 2005, 19:48 Спасибо.
тока у меня теперь непонятка возникла как перевести текст из не-юникода в не-юникод? у QTextCodec только функции типа toUnicode, fromUnicode.. P.S. насчет частотного анализа - текст очень маленький, одно-два слова.. Название: как определить кодировку строки? Отправлено: DenKor от Сентябрь 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 от Сентябрь 13, 2005, 20:37 Гхм..=)
Вобщем, выше описанный тобою метод в принципе работает, но не может отличить KOI8-R от utf8 =) Название: Re: как определить кодировку строки? Отправлено: Hellenna от Сентябрь 13, 2005, 21:30 Цитата: "piton" есть переменная QString, в нее записана информация из файла. если не привязываться к QString, и читать из файла в char*, то кодировку замечательно определяет QTextCodec::codecForContent(...). Пример : $QTDIR/examples/qwerty Название: как определить кодировку строки? Отправлено: DenKor от Сентябрь 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 от Сентябрь 15, 2005, 10:23 когда мне надо было в программе определять кодировку файла, я прикручивала к ней консольную утилиту enca (это все для линукса, но для винды скорее всего тоже есть)...она вроде определяет кодировку нормально...
|