![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
haiflive |
![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 37 Регистрация: 8.7.2010 Пользователь №: 1868 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
Здравствуйте. у меня возникла проблема с кодировками..
Подключился к базе MS Access, через ODBC драйвер, делаю запрос QSqlDatabase::tables(), и вывожу результат в QTextEdit и получаю кучу вопросиков в чёрных ромбиках.. Латиница отабражается нормально, а вот русские буквы(русские буквы в названиях таблиц и их полей не я накуралесил) отображаются тёмными ромбиками внутри которых вопросики, обычно это происходит когда cp-1251 отображают как utf-8, странно токуда вылезло cp-1251?. ODBC кажется кодирует в ASCII кодировке.. Вобщем, варианты типа этих не работаю QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));//UTF-8//ASCII, ANSI// CP-1251 FromUTF8 , toLocal8bit не помогают, уже весь иннет перерыл.. заставить базу в mySQL как бы просто, один sql SET NAMES cp1251, ну или посмотреть кодировки SHOW GLOBAL VARIABLES LIKE 'char%'; а в odbc почему-то выполнение этих запросов query.exec(); возвращает false; Как можно в приложении изменить кодировку, изменить кодировку соединения с базой?. ну или на крайняк изменить кодировку DSN драйвера?. OC windows 7, Qt SDK_1_1_1, QT4.7.3, mingw. ммм.. где здесь правка собственных постов?. извеняюсь за ошибки. |
|
|
![]() |
PAFOS |
![]()
Сообщение
#2
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 258 Регистрация: 27.12.2010 Из: Дмитров Пользователь №: 2309 Спасибо сказали: 29 раз(а) Репутация: ![]() ![]() ![]() |
Поиграйся с параметром строки подключения CharSet.
Например, CharSet=UTF8; |
|
|
haiflive |
![]()
Сообщение
#3
|
Студент ![]() Группа: Участник Сообщений: 37 Регистрация: 8.7.2010 Пользователь №: 1868 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
так чтоли..
db.setDatabaseName("DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};FIL={MS Access};DSN='';CharSet=UTF8;DBQ=C:/Qt/projects/connetDatabase/Workflow/Base/workbase.accdb"); не работает, вот код ещё, коменты не стал удалять:
как мне кажется правда кроется в этих сточка из документации, но о чём там говрится понять не могу Цитата ODBC Unicode Support
The QODBC Plugin will use the Unicode API if UNICODE is defined. On Windows NT based systems, this is the default. Note that the ODBC driver and the DBMS must also support Unicode. Some driver managers and drivers don't support UNICODE. To use the QODBC plugin with such drivers it has to be compiled with the Q_ODBC_VERSION_2 defined. For the Oracle 9 ODBC driver (Windows), it is neccessary to check "SQL_WCHAR support" in the ODBC driver manager otherwise Oracle will convert all Unicode strings to local 8-bit. |
|
|
Litkevich Yuriy |
![]()
Сообщение
#4
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
haiflive |
![]()
Сообщение
#5
|
Студент ![]() Группа: Участник Сообщений: 37 Регистрация: 8.7.2010 Пользователь №: 1868 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
может я не правильно делаю, но такой вариант выдаёт ошибку, как безопасно преобразовать в тип char*
QString::fromLocal8Bit( db.tables().at(i) ) Вот ещё строчку забыл, просто что она есть и слово "текст" отображается нормально: QTextCodec::setCodecForCStrings(QTextCodec::codecForName("cp1251")); |
|
|
Litkevich Yuriy |
![]()
Сообщение
#6
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
PAFOS |
![]()
Сообщение
#7
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 258 Регистрация: 27.12.2010 Из: Дмитров Пользователь №: 2309 Спасибо сказали: 29 раз(а) Репутация: ![]() ![]() ![]() |
Если ты в строке подключения указал UTF-8 то будь добр установи кодек в своей проге тоже на UTF-8
codecForCStrings. Если не поможет - покажи дамп QString, который возвращается, чтобы определись UTF16 это или UTF-8 или cp1251) Так же может быть момент, что порядок байтов не совпадает (но это уже последний случай) |
|
|
haiflive |
![]()
Сообщение
#8
|
Студент ![]() Группа: Участник Сообщений: 37 Регистрация: 8.7.2010 Пользователь №: 1868 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
вот собственно переписал прогармму
вывод, хотя думаю он испортится:
когда сменил кодировку приложения с UTF8 на cp1251 с помошью строки QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF8")); то получил что "Текст," превратился в похожий набор символов, если указать cp1251 то солов "Текст," отображатеся нормально. Дамп QString это как?. В приложении кусок базы
Прикрепленные файлы
|
|
|
haiflive |
![]()
Сообщение
#9
|
Студент ![]() Группа: Участник Сообщений: 37 Регистрация: 8.7.2010 Пользователь №: 1868 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
Ппц, весь гугл облазил.. теперь когда ищу постонно вылазиет эта тема, помогите пож.. будь он не ладен это мелкософт..
Странно, но ошибки ODBC, например ошибка коннекта, возвращает нормальным текстом, а вот данные нет..( может там можно как-то изменить кодировку файла?. Я бы с удовольствием конвертировал базу в другой формат, но в будующем нужно будет работать с xsl(Excel) файлами, драйвер тот же.. Может есть какие-то альтернативные драйверы?. Open office как-то открывает же эти файлы.. или это промо программа от мелкософта?. Сообщение отредактировал haiflive - 11.6.2011, 10:58 |
|
|
DenisKh001 |
![]()
Сообщение
#10
|
Новичок Группа: Новичок Сообщений: 7 Регистрация: 16.6.2011 Пользователь №: 2752 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
К *.accdb не подключался, но подключался к *.mdb. И особенность в том, что в win7 подключался не через 64х ODBC (а именно он в включается в администрировании), а через 32х ODBC который запрятан в папках windows. Завтра напишу точный путь где лежит. Может поможет.
|
|
|
haiflive |
![]()
Сообщение
#11
|
Студент ![]() Группа: Участник Сообщений: 37 Регистрация: 8.7.2010 Пользователь №: 1868 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
Угу, уже подумывал конвертировать базу в mdb, и подключиться через другую строку коннекта..
Меня больше интересует вопрос, не будет ли проблем с кодировкой, когда я подключусь в *.xsl (MS Excel), драйвер-то тот же.. Очень признателен за ответ.. жду пояснения. |
|
|
DenisKh001 |
![]()
Сообщение
#12
|
Новичок Группа: Новичок Сообщений: 7 Регистрация: 16.6.2011 Пользователь №: 2752 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
У меня лежит вот здесь: C:\Windows\SysWOW64\odbcad32.exe. Проверил, подключился к *.accdb и все работает.
#include <QApplication> #include <QTableView> #include <QSqlTableModel> int main(int argc, char *argv[]) { QApplication a(argc, argv); QSqlDatabase db = QSqlDatabase::addDatabase("QODBC"); db.setDatabaseName("TestMDB"); db.open(); QSqlTableModel model; model.setTable("town"); model.select(); QTableView *view1 = new QTableView; view1->setModel(&model); view1->show(); return a.exec(); } |
|
|
haiflive |
![]()
Сообщение
#13
|
Студент ![]() Группа: Участник Сообщений: 37 Регистрация: 8.7.2010 Пользователь №: 1868 Спасибо сказали: 1 раз(а) Репутация: ![]() ![]() ![]() |
У меня ОС х32 забыл сказать..
Открыл одну таблицу, у которой название на латинице.. и там всё нормально 0о все русские буквы в полном порядке.. Подправил кодек для строк
и нормально подключился к таблице с русским названием.. и полный код:
Почему-то db.tables() возвращает битые названия таблиц.. что же воспримем это как баг.. Чудеса.. Это именно тот случай, кода думаешь во вред себе.. Всем спасибо за ответы. Сообщение отредактировал haiflive - 18.6.2011, 11:23 |
|
|
PAFOS |
![]()
Сообщение
#14
|
Активный участник ![]() ![]() ![]() Группа: Участник Сообщений: 258 Регистрация: 27.12.2010 Из: Дмитров Пользователь №: 2309 Спасибо сказали: 29 раз(а) Репутация: ![]() ![]() ![]() |
Под дампом QString я имел ввиду содержание ее, т.е. массив unsigned char*. По этому массиву возможно понять какая кодировка.
Еще момент, хотя, я думаю, он не особо тут уместен - может быть несовместимый порядок байтов. Например у тебя прога работает с Big Endian, а драйвер возвращает тебе Little Endian. Такой подводный камень типичный для сетевых приложений, но чем мелкософт не шутит?) |
|
|
Max Payne |
![]()
Сообщение
#15
|
Студент ![]() Группа: Участник Сообщений: 24 Регистрация: 16.2.2012 Пользователь №: 3223 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
У меня такая же проблема , только список таблиц возвращается знаками вопросов, помогите кто решил проблему. Я подключаюсь к *.mdb созданой в Aссess 2003.
|
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 3.6.2025, 16:52 |