Russian Qt Forum
Ноябрь 22, 2024, 20:59
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Интернационализация, локализация
>
как определить кодировку строки?
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: как определить кодировку строки? (Прочитано 16822 раз)
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
Гость
Re: как определить кодировку строки?
«
Ответ #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
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...