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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Проблемы кодировки cp1251 (sqlite + QSqlTableModel + QTableView)  (Прочитано 19950 раз)
marbius
Гость
« : Май 11, 2011, 14:44 »

Доброго времени суток.

Имею базу данных sqlite3 в кодировке windows-1251. При попытке отображения данных в QTableView через QSqlTableModel на выходе получаю вопросы ����� для кириллических символов.

После редактирования данных непосредственно в QTableView кириллические символы отображаются корректно и в базу попадают в кодировке utf-8.

Установка кодеков мне не помогла:
Код
C++ (Qt)
QTextCodec *codec=QTextCodec::codecForName("windows-1251");
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForTr(codec);
 

Подскажите, как можно сохранить возможность отображения и сохранения кириллических символов в windows-1251.
Перекодировка всех данных базы в utf-8 вроде бы и решает проблему, но данные используются также и в другом ПО, поэтому хотелось бы обойтись без лишних перекодировок БД.

Спасибо.
« Последнее редактирование: Май 11, 2011, 14:49 от µarbius » Записан
blood_shadow
Гость
« Ответ #1 : Май 11, 2011, 15:21 »

Доброго времени суток.

Имею базу данных sqlite3 в кодировке windows-1251. При попытке отображения данных в QTableView через QSqlTableModel на выходе получаю вопросы ����� для кириллических символов.

После редактирования данных непосредственно в QTableView кириллические символы отображаются корректно и в базу попадают в кодировке utf-8.

Установка кодеков мне не помогла:
Код
C++ (Qt)
QTextCodec *codec=QTextCodec::codecForName("windows-1251");
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForTr(codec);
 

Подскажите, как можно сохранить возможность отображения и сохранения кириллических символов в windows-1251.
Перекодировка всех данных базы в utf-8 вроде бы и решает проблему, но данные используются также и в другом ПО, поэтому хотелось бы обойтись без лишних перекодировок БД.

Спасибо.
не внимательно документацию читаем..
QTextCodec *codec=QTextCodec::codecForName("Windows-1251");
Записан
marbius
Гость
« Ответ #2 : Май 11, 2011, 15:31 »

не внимательно документацию читаем..
QTextCodec *codec=QTextCodec::codecForName("Windows-1251");

Мои извинения, но это какой-то слишком тонкий юмор для меня  Грустный

В моей документации следующее:
Цитировать
QTextCodec * QTextCodec::codecForName ( const char * name ) [static]
Searches all installed QTextCodec objects and returns the one which best matches name; the match is case-insensitive. Returns 0 if no codec matching the name name could be found.
Записан
blood_shadow
Гость
« Ответ #3 : Май 11, 2011, 15:37 »

Мои извинения, но это какой-то слишком тонкий юмор для меня  Грустный

В моей документации следующее:
Цитировать
QTextCodec * QTextCodec::codecForName ( const char * name ) [static]
Searches all installed QTextCodec objects and returns the one which best matches name; the match is case-insensitive. Returns 0 if no codec matching the name name could be found.
правильно, ты имя кодека не правильно написал, ты написал:
QTextCodec::codecForName("windows-1251"); а надо:
QTextCodec::codecForName("Windows-1251");
посмотри в Detailed Description класса QTextCodec
Записан
marbius
Гость
« Ответ #4 : Май 11, 2011, 15:52 »

правильно, ты имя кодека не правильно написал, ты написал:
QTextCodec::codecForName("windows-1251"); а надо:
QTextCodec::codecForName("Windows-1251");
посмотри в Detailed Description класса QTextCodec

Убейте меня, если "the match is case-insensitive", не означает, что поиск РЕГИСТРОНЕЗАВИСИМЫЙ  Непонимающий

В любом случае, blood_shadow, я даже проверил Ваше утверждение - не помогло.
Записан
blood_shadow
Гость
« Ответ #5 : Май 11, 2011, 16:04 »

правильно, ты имя кодека не правильно написал, ты написал:
QTextCodec::codecForName("windows-1251"); а надо:
QTextCodec::codecForName("Windows-1251");
посмотри в Detailed Description класса QTextCodec

Убейте меня, если "the match is case-insensitive", не означает, что поиск РЕГИСТРОНЕЗАВИСИМЫЙ  Непонимающий

В любом случае, blood_shadow, я даже проверил Ваше утверждение - не помогло.
а где делаете установку кодеков? я думаю что сама проблема в конвертации строк именно между
QSqlTableModel и базой данных,
QTextCodec *codec=QTextCodec::codecForName("windows-1251");
QTextCodec::setCodecForCStrings(codec);
надо сделать либо в конструкторе подкласса QSqlTableModel(если он есть)либо до создания модели,
например в меин ф-ции, а вообще QString - это utf-16
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #6 : Май 11, 2011, 16:06 »

Имею базу данных sqlite3 в кодировке windows-1251.
Ложь и провокация. Смеющийся
SQLite поддерживает только utf кодировки:
http://www.sqlite.org/pragma.html#pragma_encoding
Собственно в этой кодировке QSqlTableModel вам текст и отображает.
Никакой «базы данных sqlite3 в кодировке windows-1251» существовать не может в принципе, но может быть «база данных sqlite3 в кодировке utf-8, в которую криворукий программист нечитающий документацию записал текст в кодировке windows-1251».

Собственно в чём проблема писать в БД в utf-8? Или эту же самую базу использует другое ПО, считающее, что там данные в CP1251? Тогда придётся отказываться от QSqlTableModel и читать/писать самому через QSqlQuery.
« Последнее редактирование: Май 11, 2011, 16:09 от LisandreL » Записан
marbius
Гость
« Ответ #7 : Май 11, 2011, 16:13 »

Код тестового приложения:
Код
C++ (Qt)
int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
 
   QTextCodec *codec=QTextCodec::codecForName("Windows-1251");
   QTextCodec::setCodecForCStrings(codec);
 
   QSqlDatabase db=QSqlDatabase::addDatabase("QSQLITE");
   db.setDatabaseName(qApp->applicationDirPath()+QDir::separator()+"database.s3db");
   QSqlTableModel model;
   model.setTable("instr");
   model.select();
 
   QTableView view;
   view.setModel(&model);
   view.show();
   return a.exec();
 
}
 
Записан
marbius
Гость
« Ответ #8 : Май 11, 2011, 16:18 »

Собственно в этой кодировке QSqlTableModel вам текст и отображает.
Никакой «базы данных sqlite3 в кодировке windows-1251» существовать не может в принципе, но может быть «база данных sqlite3 в кодировке utf-8, в которую криворукий программист нечитающий документацию записал текст в кодировке windows-1251».

В принципе, да, это больше похоже на правду ))
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #9 : Май 11, 2011, 17:28 »

Так всё же в чём проблема писать в БД в utf-8? Или эту же самую базу использует другое ПО, считающее, что там данные в CP1251?
Записан
marbius
Гость
« Ответ #10 : Май 12, 2011, 03:18 »

Так всё же в чём проблема писать в БД в utf-8? Или эту же самую базу использует другое ПО, считающее, что там данные в CP1251?
Да, именно так. База уже наполнена данными и "другое ПО" оперирует ими только в win1251. "Другое ПО" уже не переделать, если не переписать с нуля: исходников как всегда нет; да, и написано оно, похоже, на Delphi, ну или Builder'е.
« Последнее редактирование: Май 12, 2011, 03:20 от µarbius » Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #11 : Май 12, 2011, 06:17 »

Если дадите небольшой пример своей базы, то могу опробовать одну идею... Много записей не надо, но обязательно с такой кириллицей.
« Последнее редактирование: Май 12, 2011, 06:19 от LisandreL » Записан
AlphaGh0St
Гость
« Ответ #12 : Май 12, 2011, 10:20 »

...хм...может малость не в тему, но всё-же попробуй вот этот код

QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #13 : Май 12, 2011, 17:29 »

AlphaGh0St, вы правы - это абсолютно не в тему.
Записан
marbius
Гость
« Ответ #14 : Май 13, 2011, 13:52 »

Если дадите небольшой пример своей базы, то могу опробовать одну идею... Много записей не надо, но обязательно с такой кириллицей.

Да, пожалуйста. Первые 10 записей одной из таблиц.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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