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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Проблема с кодировкой в PostgreSQL 7.0.2  (Прочитано 17863 раз)
Martiro
Гость
« : Июль 22, 2008, 15:25 »

Проблема с русскими кодировками уже порядком надоела...

Подробнее...

На компе стоит МСВС 3.0, QT 3.3.3, PostgreSQL 7.0.2.
БД создана в кодировке "KOI8"
При обращении к базе через консоль, а именно при добавлении записи с русскими символами, в базе сохраняются правильные "символы", т.е. русские буквы.
При обращении к базе через phpPgAdmin, тоже все нормально, в базе сохраняются правильные русские буквы.
Как только начинаю посылать команды из приложения, в поля вбиваются либо "? ? ? ? ? ? ?", либо "(с6)(f6)(c2)(b1)"...
Даже при обычном
Код:
 QSqlQuery qry(currentDB); 
 qry.exec("INSERT INTO R_CLASS (C_NUMB, C_TEMA) VALUES (1, 'наименование');");

не выходит...
Не помогает также qApp.setDefaultCodec(QTextCodec::setCodecName("***")) в main.cpp (где вместо *** я перепробовал все более-менее возможные кодировки).
Если делать через QCString, а именно устанавливать QTextCodec::setCodecForCStrings("***") - тоже эффекта никакого...

Что самое обидное, на соседней фирме все работает тип-топ! И наше приложение тоже! Только загвоздка в том, что у нас руки намного кривее... Смеющийся
Вобщем, помогите советом.
P.S. Спрашивать на соседней фирме не буду из принципа!  Смеющийся
Записан
Dodge
Гость
« Ответ #1 : Июль 22, 2008, 16:03 »

Жжете уважаемый ...

БД создана в кодировке "KOI8"
Не помогает также qApp.setDefaultCodec(QTextCodec::setCodecName("***")) в main.cpp (где вместо *** я перепробовал все более-менее возможные кодировки).
Если вам известна кодировка, нафига годать то? ...  Смеющийся

В main.cpp добавьте:
Код:
QTextCodec * myTextCodec = QTextCodec::codecForName("KOI8-R");

QTextCodec::setCodecForLocale( myTextCodec  )
QTextCodec::setCodecForTr( myTextCodec )
QTextCodec::setCodecForCStrings( myTextCodec )


Чисто для эстетики, после app.exec():
Код:
delete myTextCodec;

З.Ы. если честно, несовсем понимаю что есть в данном случае ваш KOI8... ибо если глянуть асистент, то можно узреть:
Цитировать
KOI8-R -- Russian
KOI8-U -- Ukrainian
сцылко
А в доках на Линтер:
Цитировать
KOI8 -- KOI8-R(U)

Надеюсь помог   Улыбающийся
« Последнее редактирование: Июль 22, 2008, 16:07 от Dodge » Записан
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #2 : Июль 22, 2008, 21:34 »

Попробуй делать в кодировке UTF8. Будет нормально всегда Показает язык
Записан

Как мало времени и как много нужно узнать
Martiro
Гость
« Ответ #3 : Июль 23, 2008, 08:13 »

tmikola, почему-то кодировку UTF8 у меня не поддерживает, зато есть (UNICODE).

Dodge, жжом как есть!  Улыбающийся
А что остаётся делать, если только учишься и нет рядом того, кто может грамотно подсказать? Подмигивающий

Вобщем, какого-то результата я достиг. Записи в базу через приложение сохраняются, если база в кодировке "UNICODE".
В приложении добавление полей реализуется через QSqlRecord::setValue(const QString & name, const QVariant & value).
А вот через INSERT записи нормально добавляться все равно не хотят.

Цитировать
В main.cpp добавьте:
Код:
QTextCodec * myTextCodec = QTextCodec::codecForName("UNICODE");

QTextCodec::setCodecForLocale( myTextCodec  )
QTextCodec::setCodecForTr( myTextCodec )
QTextCodec::setCodecForCStrings( myTextCodec )
Добавил, но результата ноль.
Через QSqlQuery::exec(const QString & query) не работает.
« Последнее редактирование: Июль 23, 2008, 08:21 от Martiro » Записан
BaltikS
Гость
« Ответ #4 : Июль 23, 2008, 09:44 »

Честное слова чудеса  Смеющийся...
Я пишу проги давненько и под Qt3 и под МСВС c линтером и подобных вещей не возникало!
Первым делом пишу в main.cpp
Код:
QTextCodec::setCodecForTr(QTextCodec::setCodecForName("CP1251"));
При использовании драйвера Qt QPSQL считывается всё просто:
Код:
label->setText(query->value(0).toString());
Записывается с QTextEdita, например, тоже просто
Код:
QSqlQuery query("INSERT INTO table(text) VALUE ('"+textEdit->text()+"')");
В случае текста, задаваемого в коде тоже ничего сложного:
Код:
QSqlQuery query("INSERT INTO table(text) VALUE ('"+tr("Запись текста")+"')");
При этом кодировка БД в Windows и МСВС одинаковая, KOI8R...

Кстати говоря, работа с кодировками в Postgres намного лучше чем MySQL или Interbase(Firebird)... Работает без всяких шаманств.
Удачи!  Подмигивающий
Записан
Tonal
Гость
« Ответ #5 : Июль 23, 2008, 10:14 »

А какие шаманства нужны в Firebird-е?
Записан
BaltikS
Гость
« Ответ #6 : Июль 23, 2008, 10:20 »

А какие шаманства нужны в Firebird-е?
То что под FireBird 1 и Interbase 5,6  нужно править драйвер Qt, потому как кодировка там по умолчанию Unicode. Либо под Юникод сразу писать, Что не всегда удобно. Собственно вопрос не про это! Подмигивающий
Записан
Dodge
Гость
« Ответ #7 : Июль 23, 2008, 11:18 »

Попробуй делать в кодировке UTF8. Будет нормально всегда Показает язык
в мсвс юникод отсутствует как таковой... как следствие линтер тоже

ктото писал про cp1251... так вот это всеравно что написать соaт под винду, и запускать его под мсвс через эмулятор, wine например Веселый
этож виндовая кодировка, ее конечно все и все Смеющийся поддерживают/ет, но мсвс создавалось с той целью, чтоб абстрагироватся от всего не своего или проприетарного. Я считаю это некорректнам  Улыбающийся

Вобщем, какого-то результата я достиг. Записи в базу через приложение сохраняются, если база в кодировке "UNICODE".
Вообще странно, судя по докам
Цитировать
UNICODE   Unicode(UTF-8)
UNICODE и UTF-8 это одна фигня

Через QSqlQuery::exec(const QString & query) не работает.
Хы... а исходные файлы в какой кодировке?  Смеющийся

З.Ы. есть замечательная утилита iconv, которая умеет перекодировать файлы и не только. man iconv
« Последнее редактирование: Июль 23, 2008, 11:22 от Dodge » Записан
BaltikS
Гость
« Ответ #8 : Июль 23, 2008, 12:14 »

Цитировать
Хы... а исходные файлы в какой кодировке? 
Я подозреваю в этом то и дело.... На самом деле они могут быть хоть в Win кодировке, хоть в KOI8 кодировке.... Нужно указать в main.cpp ту кодировку, в которых исходные файлы!
Записан
Dodge
Гость
« Ответ #9 : Июль 23, 2008, 13:05 »

Нужно указать в main.cpp ту кодировку, в которых исходные файлы!
хех ... и что мы получим?

исходники в cp1251
БД в KOI8

чушь... нада чтобы все было в одной кодировке.

в идеале это конечно UTF-8, но так как наши уважаемые соотечественники из все знаем какой конторы неудосужелись воткнуть UTF-8 в "свою" систему. То приходится замарачиватся на всякую чушь, типа cp1251 и KOI8-R.

В редакторе, которым вы пользуетесь при редактировании исходников, установите кодировку по умолчанию чтонить типа KOI8-R, и везде где можно тыкайте этой кодировкой  Улыбающийся

А вообще, по идее исп. нелатинские букавки в исходниках ненада. Нада юзать QObject::tr и Qt - лингвисд Смеющийся
Записан
Alex03
Гость
« Ответ #10 : Июль 23, 2008, 13:24 »

С UTF-8 порой тоже не всё так красиво как кажется.
Помнится были проблемы с FireBird заключающиеся в том что длина полей в одном месте указывается в символах, в другом устанавливается в байтах, а в третьем месте банальный пересчёт (для резервирования) 1символ -> 3 байта.
В результате в поле varchar(10) можно было записать 30 ASCII символов, 20 из кирилицы и т.д. что уже не есть корошо, и соответственно одни грабельки вылазили при коннекте клиента с кодировкой UTF-8, и другие грабли с клиентом отличном от UTF-8.
Записан
BaltikS
Гость
« Ответ #11 : Июль 23, 2008, 15:05 »

Цитировать
исходники в cp1251
БД в KOI8

чушь... нада чтобы все было в одной кодировке.
Не чушь и это работает! МОжешь сам проверить. Чушь каждый раз использовать лингвист... Подмигивающий
Тема считаю закрытой.
Записан
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #12 : Октябрь 20, 2008, 23:06 »

Работать в winde мне гораздо комфортнее, значит кодировка в main.cpp

Код:
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("Windows-1251")); 

В базе и в winde и в МСВС кодировка koi8-r

Коррекции и добавления данных провожу с использованием QSqlCursor

Код:
QSqlCursor cStation("test");
QSqlRecord *buffer = cStation.primeUpdate();  // запись для коррекции
buffer->setValue("name","Вася");
buffer->setValue("title","Пупкин");
cStation.update();

Работает даже без tr() в обеих системах.
Я сторонник QSqlCursor, так как проще отслеживать поля, чем в длинных SQL выражениях.
Мороки меньше.
Может кому пригодится Смеющийся

P.S. Забыл уточнить, МСВС 3.0 - 13, ЛИНТЕР ВС 6.0 (PostgreSQL 7.4.1).
База размещена на машине под управлением МСВС.
Обращаюсь к ней по сети с машины под управлением XP c PostgreSQL 8.1 и машины МСВС Линтер ВС.
Фурычит нормально
« Последнее редактирование: Октябрь 20, 2008, 23:12 от Примерный ученик » Записан

Как мало времени и как много нужно узнать
kolob
Частый гость
***
Offline Offline

Сообщений: 296



Просмотр профиля
« Ответ #13 : Ноябрь 26, 2010, 11:35 »

Не могу создать базу с кодировкой KOI8-R
Цитировать
ERROR:  encoding KOI8 does not match server's locale Russian_Russia.1251
DETAIL:  The server's LC_CTYPE setting requires encoding WIN1251.

Там же вроде при установке надо это устанавливать. Т.е. теперь мне надо переустановить PostgreSql?
Записан

Qt 5.11.0, Win, MinGW
BaltikS
Гость
« Ответ #14 : Ноябрь 26, 2010, 11:44 »

Вероятно Вы используете БД PostgreSQL 8.3 > ...
Вам сюда http://sql.ru/forum/actualthread.aspx?tid=679075&hl=koi8
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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