Russian Qt Forum

Qt => Базы данных => Тема начата: MVG-V70 от Март 05, 2012, 15:45



Название: ODBC и Oracle 10g: неверная кодировка
Отправлено: MVG-V70 от Март 05, 2012, 15:45
Подключаюсь к БД Oracle 10.0.2 через ODBC. Не могу разобраться: в переменную val возвращается вместо русских букв знаки вопроса в ромбиках.

Код:
QString val;
QSqlDatabase *db = new QSqlDatabase;
*db = QSqlDatabase::addDatabase("QODBC");

db->setDatabaseName("database");
db->setUserName("username");
db->setPassword("password");

if (db->open())
{
  QSqlQuery *query = new QSqlQuery(*db);
  if (query->exec("select column from table"))
  while (query->next())
  {
    val = query->value(0).toString();
  }
}

кодировка в Oracle CL8ISO885P5. В настройках драйвера ODBC пробовал включать/выключать опцию Force SQL_WCHAR support - не помогает.


Название: Re: ODBC и Oracle 10g: неверная кодировка
Отправлено: alexandros от Март 05, 2012, 21:31
ну то что получаешь из базы - конвертируй, QTextCodec помоему называется класс


Название: Re: ODBC и Oracle 10g: неверная кодировка
Отправлено: MVG-V70 от Март 06, 2012, 08:14
ну то что получаешь из базы - конвертируй, QTextCodec помоему называется класс
Искал поиском, пробовал - не получилось. Возможно делал что-то не так. Как правильно?


Название: Re: ODBC и Oracle 10g: неверная кодировка
Отправлено: alexandros от Март 08, 2012, 20:43
http://qt-project.org/doc/qt-4.8/qtextcodec.html

Код
C++ (Qt)
QByteArray encodedString = "...";//получаемая строка
QTextCodec *codec = QTextCodec::codecForName("KOI8-R");
QString string = codec->toUnicode(encodedString);//конвертированая
 

"KOI8-R" - вот это название кодировки может она и подойдет - если не подойдет то перебирай кодировки в документации написано

Код
C++ (Qt)
посмотри в классе QString - там тоже есть конвертация
val = query->value(0).toString().[вылезут варианты];
 
QByteArray toAscii () const
QString toCaseFolded () const
QByteArray toLatin1 () const
QByteArray toLocal8Bit () const
 

перебирай, пробуй)))


Название: Re: ODBC и Oracle 10g: неверная кодировка
Отправлено: alexandros от Март 08, 2012, 20:48
в QTextCodec есть еще функции
Код
C++ (Qt)
QString toUnicode ( const QByteArray & a ) const
QString toUnicode ( const char * input, int size, ConverterState * state = 0 ) const
QString toUnicode ( const char * chars ) const
 


Название: Re: ODBC и Oracle 10g: неверная кодировка
Отправлено: MVG-V70 от Март 11, 2012, 14:17
Спасибо за ответ, но дело по-видимому не в кодеках.
Даже при преобразовании значения из запроса с QByteArray в отладчике видно, что там находятся только символы '?'  :-[


Название: Re: ODBC и Oracle 10g: неверная кодировка
Отправлено: Bepec от Март 11, 2012, 14:20
Если ты видишь ???? это кодеки :)


Название: Re: ODBC и Oracle 10g: неверная кодировка
Отправлено: alexandros от Март 11, 2012, 22:05
гугл сказал что если знаки вопроса то нужно конвертировать в юникод


Название: Re: ODBC и Oracle 10g: неверная кодировка
Отправлено: MVG-V70 от Март 12, 2012, 08:04
Строка из четырех русских символов видна в QByteArray как четыре '?' с одним и тем же кодом. Конвертировать пробовал - не получается. Да и не должно получиться ИМХО.
Думаю, что дело в чем-то другом. Воспользовался прямым драйвером Oracle QOCI - там все в порядке.


Название: Re: ODBC и Oracle 10g: неверная кодировка
Отправлено: Bepec от Март 12, 2012, 08:27
Уважаемый. Не тупите пожалуйста...

У вас приходят 4 символа. Вы их видите. Вы с ними работать можете. Вы просто не можете их представить в понятном для себя виде.

А представление в понятном для вас виде, происходит с помощью кодека.

И вам уже человек 5 пишет - кодек. Вы - не, не в них дело. Это всё плохой драйвер.

PS возможно ты при приёме портишь знаки каким то своим кодеком. И в результате у тебя появляются ???? с одинаковым кодом.