LINUX.ORG.RU

После QRegExp знаки вопроса вместо русских букв.

 ,


0

1

Парсю из строки русские символы.

Qstring str = file.readline();

 rx.setPattern("(ИД-\\d+)");
 if (rx.indexIn(str) != -1) {
     QString name = rx.cap(1);

 }
Файлы сохранены были в разных текстовых редакторах. В одних файлах нормально, в других name после парсинга вместо ИД идут ?? знаки. Подскажите как пофиксить, думаю дело в кодировках.

Ответ на: комментарий от ox55ff

А это юзеры, они могут в любой кодировке, пользуются разными текстовыми редакторами: notepad++ и pspad. Как сделать, принудительно пересохранить перед парсингом в utf8 самое простое ?

user2132
() автор топика
Ответ на: комментарий от user2132

Можешь перед вывзовом обрабатывать все файлы enconv'ом. Пакет enca.

Ну т.е. для своей проги делаешь скритп-обёртку, где сперва всё прогоняешь через enconv, потом вызываешь саму прогу.

Ivan_qrt ★★★★★
()
Ответ на: комментарий от ox55ff

Вот на не utf файлах fromLatin1 прокатывает, а на utf она не работает, но работает fromUtf8. Как бы мне просто перезаписать эти файлы в utf-8. Придется просто считать и записать в другой файл из qt или можно как-то исходному в qt поправить кодировку перед считыванием ?

QByteArray line = file.readLine();
qDebug() << "line_lat" << QString::fromLatin1(line);
qDebug() << "line_utf" << QString::fromUtf8(line);

user2132
() автор топика
Ответ на: комментарий от xaizek

В Qt для работы с кодировками есть QTextCodec. Работает, есть не просит.

Вот насчёт автоопределения — затрудняюсь. Можно посмотреть, как это сделано в той же enca. Если задачи полной автоматизации не стоит, а нужна только гибкая настройка, можно дать пользователю комбобокс, и пусть сам нужную кодировку указывает.

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

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

user2132
() автор топика
Ответ на: комментарий от user2132

Тут всё упирается в определении исходной кодировки файла. Я не знаю, как это эффективно сделать. Я всегда в utf8 сохраняю и не знаю проблем. Но раз у тебя различные пользователи, то придётся что-то придумывать.

А в тексте есть какие-то характерные слова на русском, которые всегда присутствуют в тексте, чтобы по ним определять кодировку? Читаешь файл, ищешь слово и если не находишь, то пробуешь другую кодировку.

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

Да в тексте есть конкретные слова на русском, по ним и смотрю. Я просто думал, что можно как-то определить через QTextStream какие-нибудь свойства в какой кодировке файл.

user2132
() автор топика

С кодировками не все так просто. Как уже написали выше: в случае с Qt нужно использовать utf-8. Поэтому, для начала, нужно все конвертировать в utf-8. А для этого необходимо определить исходную кодировку.
Лучший результат, который я видел, выдавала библиотека от разработчика из Google. Если постараешься, то найдешь (лицензирована под Apache). Уже не помню названия. Два года назад было. Но эта библиотека более или менее верно угадывала, если в тексте было не менее пяти разных символов (желательно подряд), специфичных для данной кодировки.
То есть, ты не сможешь точно определить кодировку из строки вида: «Ах-ах-ах».
Обычно задаются язык и кодировка (fallback_language и fallback_encoding), которые наиболее распространены в регионе использования твоего продукта.
Тогда, первым делом, с помощью fallback_language ты пытаешься определить какая кодировка используется. Есть библиотеки которым, в качестве подсказки, можно указать предполагаемые язык и кодировку. Библиотека, которую я упомянул вначале, такое умеет.
Если сработало, то конвертируешь из полученной кодировки в utf-8.
Если нет, то просто пытаешься конвертировать, то что у тебя есть, из fallback_encoding в utf-8.
А дальше уже работаешь средствами Qt.

baldman88
()
Ответ на: комментарий от user2132

Ну вообще ты можешь просто проверить, валидный ли utf8 в считанном файле. В qt пишут про какое-то недокументированное состояние https://stackoverflow.com/questions/18227530/check-if-utf-8-string-is-valid-i... .

Но лично я бы предпочёл скормить qbytearray вот этой либе http://utfcpp.sourceforge.net/#validfile

Ivan_qrt ★★★★★
()
Ответ на: комментарий от xaizek

Тогда логичнее использовать libenca в приложении для определения кодировки.

Можно и так. Просто у меня сложилось впечатление, что прога сугубо для личного использования. Тогда по трудозатратам скрипт, конвертящий файлы вне конкуренции.

А если нет, то можно и заставить выбирать кодировку пользователя в диалоге открытия и т.п.

Ivan_qrt ★★★★★
()
Ответ на: комментарий от baldman88

Как уже написали выше: в случае с Qt нужно использовать utf-8.

Вообще-то, не совсем. Надо определять, что такое «нужно использовать».

QString внутри себя работает с юникодом. Каким именно, зависит от платформы (16 или 32), но не utf-8.

Кодировка для считываемых в программе файлов определяется применяемым кодеком. В частности, у QTextStream есть метод setCodec().

Вот при написании исходников — таки да, рекомендуется применять utf-8 (а ещё лучше голый ASCII и всю нелатиницу загонять в файлы переводов). Но к задаче ТСа это отношения не имеет.

hobbit ★★★★★
()

По теме: таки рекомендую сделать ручной выбор кодировки при открытии файла.

По-моему, наименее геморройный вариант. Для упрощения жизни под комбобоксом можно будет сделать предпросмотр, как будет выглядеть засосанный в программу текст для выбранной в комбобоксе кодировки (что-то подобное делается в диалоге импорта CSV-файлов в электронных таблицах).

hobbit ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.