Russian Qt Forum

Qt => Базы данных => Тема начата: Andrey.D от Октябрь 07, 2010, 14:01



Название: кодировка QIBASE
Отправлено: Andrey.D от Октябрь 07, 2010, 14:01
Есть база данных, в ней содержаться записи на русском, при отображении их в QTableView получаю ���� вместо русских букв.
Кодировку прописывал:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));
QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));
Есть ли решение данной проблемы?


Название: Re: кодировка QIBASE
Отправлено: crossly от Октябрь 07, 2010, 14:27
в какой кодировке записи хранятся??


Название: Re: кодировка QIBASE
Отправлено: Andrey.D от Октябрь 07, 2010, 14:31
Базу создавал не я к сожалению, пишу только клиент, а как определить в какой кодировке содержимое базы?


Название: Re: кодировка QIBASE
Отправлено: crossly от Октябрь 07, 2010, 14:38
посмотри в rdb$database


Название: Re: кодировка QIBASE
Отправлено: Andrey.D от Октябрь 08, 2010, 06:52
В таблице rdb$database, в поле RDB$CHARACTER_SET_NAME стоит NONE. Т.е. значит что используется какая-то кодировка по умолчанию?


Название: Re: кодировка QIBASE
Отправлено: crossly от Октябрь 08, 2010, 09:24
я так полагаю юникод...


Название: Re: кодировка QIBASE
Отправлено: Andrey.D от Октябрь 08, 2010, 09:28
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf8")); прописал такой вариант, русские буквы не отображаются


Название: Re: кодировка QIBASE
Отправлено: Andrey.D от Октябрь 08, 2010, 10:58
Перепробовал все кодировки, и никак не получается вывести в нормальном виде записи на русском, может кто уже сталкивался с этим?


Название: Re: кодировка QIBASE
Отправлено: crossly от Октябрь 08, 2010, 11:01
база большая ??


Название: Re: кодировка QIBASE
Отправлено: Andrey.D от Октябрь 08, 2010, 11:02
Очень большая =(


Название: Re: кодировка QIBASE
Отправлено: Andrey.D от Октябрь 08, 2010, 12:04
Разобрался с одним моментом, данные читаются из бд в utf8 (скорее всего), и поэтому криво отображаются у меня, вопрос следующий как перекодировать строку из utf8 в Windows-1251?


Название: Re: кодировка QIBASE
Отправлено: crossly от Октябрь 08, 2010, 12:13
а зачем....  если данные в utf то и отображай их в utf


Название: Re: кодировка QIBASE
Отправлено: Andrey.D от Октябрь 08, 2010, 12:19
Я перебрал наверное все кодировки в QTextCodec::setCodecForCStrings(QTextCodec::codecForName, но данные так и не отображаются нормально... Как мне отобразить нормально utf?


Название: Re: кодировка QIBASE
Отправлено: crossly от Октябрь 08, 2010, 12:27
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));


Название: Re: кодировка QIBASE
Отправлено: Andrey.D от Октябрь 08, 2010, 12:31
Именно это уже пробовал, так же вижу ���� вместо русских букв.


Название: Re: кодировка QIBASE
Отправлено: crossly от Октябрь 08, 2010, 12:33
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf8")); прописал такой вариант, русские буквы не отображаются
если вы имеете в виду эту пробу... то не правильно... обратите внимание как правильно кодировка называется...


Название: Re: кодировка QIBASE
Отправлено: Andrey.D от Октябрь 08, 2010, 12:37
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")) вписал это, тоже самое, вижу ���� вместо русских букв.


Название: Re: кодировка QIBASE
Отправлено: crossly от Октябрь 08, 2010, 12:42
вы что то однозначно не правильно делаете если и вас на разных кодировках одно и тоже...


Название: Re: кодировка QIBASE
Отправлено: Andrey.D от Октябрь 08, 2010, 12:50
1. В базе данных строка DEFAULT CHARACTER SET NONE, т.е. была установлена кодировка по умолчанию.
2. Подключаюсь к базе данных без указания каких-либо setConnectOptions().
3. В main.cpp прописываю
Код:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
    QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
или
Код:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251"));
    QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));
и всегда получаю на выходе ���� вместо русских букв


Название: Re: кодировка QIBASE
Отправлено: lit-uriy от Октябрь 09, 2010, 18:36
>>1. В базе данных строка DEFAULT CHARACTER SET NONE, т.е. была установлена кодировка по умолчанию.
А какая кодировка по умолчанию?


Название: Re: кодировка QIBASE
Отправлено: Andrey.D от Октябрь 09, 2010, 21:25
В том то и дело что не знаю какая кодировка там по умолчанию если NONE


Название: Re: кодировка QIBASE
Отправлено: z11t3 от Октябрь 11, 2010, 10:25
Какая кодировка в базе - можно посмотреть в самой базе.
если разговор например о MySQL, то поможет такой запрос, который настроит кодировку на стороне СУБД для данной сессии
Цитировать
sqlQuery.prepare("SET NAMES 'utf8'");
ну или вездесущий 'cp1251'


Название: Re: кодировка QIBASE
Отправлено: crossly от Октябрь 11, 2010, 17:41
какая версия firebird ??


Название: Re: кодировка QIBASE
Отправлено: Andrey.D от Октябрь 14, 2010, 11:50
firebird версии 2.1, проблема была решена, использованием драйвера QFIREBIRD


Название: Re: кодировка QIBASE
Отправлено: Andrey.D от Февраль 06, 2012, 08:59
Вернулся к проблеме с кодировкой в QIBASE.
В настройках подключения прописал ibase.setConnectOptions("ISC_DPB_LC_CTYPE=Latin1"); (кодировка базы NONE)
Если считывать данные из базы в файл, при этом выполняя перекодировку QString с помощью toStdString(), то русские буквы читаются замечательно.
Но если выводить в TableView, то все русские буквы искажаются до неузнаваемости.
Изменять кодировку базы не представляется возможным.
Может кто подскажет вариант, как побороть эту проблему?
P/S работаю под windows


Название: Re: кодировка QIBASE
Отправлено: Tonal от Февраль 06, 2012, 11:53
Кодировка NONE указывает Firebird-у что клиент сам будет заниматься конвертацией.
Соответственно с сервера приходят строки именно в том виде как хранятся.
На клиенте, оно должно конвертироватся в кодировку указанную параметром ISC_DPB_LC_CTYPE или из utf8 если не задано.
И тут - облом: русская виндовая кодировка в Qt4 называется windows-1251, а на сервере win1251.
Т. е. если укажешь Qt-шную - сервер отфутболит, а ежели серверную - Qt возмутится...

А вот при указании Latin1 сервер перекодировки не производит, а клиент, похоже, производит только примитивное расширение каждого символа, поэтому после toStdString у нас получается std::string с символами в виндово-русской кодировке.
Т. е. для использования этой строки далее как QString её нужно конвертнуть стандартным кодеком QTextCodec::codecForName("Windows-1251")->toUnicode.

Для этого можно переопределить метод модели или ещё кого - решай сам по месту.

П. С. А что не устроило с QFIREBIRD?


Название: Re: кодировка QIBASE
Отправлено: Andrey.D от Февраль 06, 2012, 12:06
Спасибо за полный ответ =)
QFIREBIRD не получается пока одцепить почему-то, копирую скачанные драйвера с http://code.google.com/p/qtfirebirdibppsqldriver/ (http://code.google.com/p/qtfirebirdibppsqldriver/) в директорию QtSDK\Desktop\Qt\4.8.0\mingw\plugins\sqldrivers\, но драйвер так и не подключается.


Название: Re: кодировка QIBASE
Отправлено: Виктор от Март 09, 2012, 04:30
Кодировка NONE указывает Firebird-у что клиент сам будет заниматься конвертацией.
Соответственно с сервера приходят строки именно в том виде как хранятся.
На клиенте, оно должно конвертироватся в кодировку указанную параметром ISC_DPB_LC_CTYPE или из utf8 если не задано.
И тут - облом: русская виндовая кодировка в Qt4 называется windows-1251, а на сервере win1251.
Т. е. если укажешь Qt-шную - сервер отфутболит, а ежели серверную - Qt возмутится...

А вот при указании Latin1 сервер перекодировки не производит, а клиент, похоже, производит только примитивное расширение каждого символа, поэтому после toStdString у нас получается std::string с символами в виндово-русской кодировке.
Т. е. для использования этой строки далее как QString её нужно конвертнуть стандартным кодеком QTextCodec::codecForName("Windows-1251")->toUnicode.

QTextCodec::codecForName("Latin1") использовать?
 


Название: Re: кодировка QIBASE
Отправлено: Виктор от Март 09, 2012, 14:13
все,решил.сразу не понял.спасибо за информацию.