Russian Qt Forum

Qt => Базы данных => Тема начата: Martiro от Июль 22, 2008, 15:25



Название: Проблема с кодировкой в PostgreSQL 7.0.2
Отправлено: 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("***") - тоже эффекта никакого...

Что самое обидное, на соседней фирме все работает тип-топ! И наше приложение тоже! Только загвоздка в том, что у нас руки намного кривее... ;D
Вобщем, помогите советом.
P.S. Спрашивать на соседней фирме не буду из принципа!  ;D


Название: Re: Проблема с кодировкой в PostgreSQL 7.0.2
Отправлено: Dodge от Июль 22, 2008, 16:03
Жжете уважаемый ...

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

В 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
сцылко (http://doc.trolltech.com/3.3/qtextcodec.html)
А в доках на Линтер:
Цитировать
KOI8 -- KOI8-R(U)

Надеюсь помог   :)


Название: Re: Проблема с кодировкой в PostgreSQL 7.0.2
Отправлено: Примерный ученик от Июль 22, 2008, 21:34
Попробуй делать в кодировке UTF8. Будет нормально всегда :P


Название: Re: Проблема с кодировкой в PostgreSQL 7.0.2
Отправлено: Martiro от Июль 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) не работает.


Название: Re: Проблема с кодировкой в PostgreSQL 7.0.2
Отправлено: BaltikS от Июль 23, 2008, 09:44
Честное слова чудеса  ;D...
Я пишу проги давненько и под 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)... Работает без всяких шаманств.
Удачи!  ;)


Название: Re: Проблема с кодировкой в PostgreSQL 7.0.2
Отправлено: Tonal от Июль 23, 2008, 10:14
А какие шаманства нужны в Firebird-е?


Название: Re: Проблема с кодировкой в PostgreSQL 7.0.2
Отправлено: BaltikS от Июль 23, 2008, 10:20
А какие шаманства нужны в Firebird-е?
То что под FireBird 1 и Interbase 5,6  нужно править драйвер Qt, потому как кодировка там по умолчанию Unicode. Либо под Юникод сразу писать, Что не всегда удобно. Собственно вопрос не про это! ;)


Название: Re: Проблема с кодировкой в PostgreSQL 7.0.2
Отправлено: Dodge от Июль 23, 2008, 11:18
Попробуй делать в кодировке UTF8. Будет нормально всегда :P
в мсвс юникод отсутствует как таковой... как следствие линтер тоже

ктото писал про cp1251... так вот это всеравно что написать соaт под винду, и запускать его под мсвс через эмулятор, wine например :D
этож виндовая кодировка, ее конечно все и все ;D поддерживают/ет, но мсвс создавалось с той целью, чтоб абстрагироватся от всего не своего или проприетарного. Я считаю это некорректнам  :)

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

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

З.Ы. есть замечательная утилита iconv, которая умеет перекодировать файлы и не только. man iconv


Название: Re: Проблема с кодировкой в PostgreSQL 7.0.2
Отправлено: BaltikS от Июль 23, 2008, 12:14
Цитировать
Хы... а исходные файлы в какой кодировке? 
Я подозреваю в этом то и дело.... На самом деле они могут быть хоть в Win кодировке, хоть в KOI8 кодировке.... Нужно указать в main.cpp ту кодировку, в которых исходные файлы!


Название: Re: Проблема с кодировкой в PostgreSQL 7.0.2
Отправлено: Dodge от Июль 23, 2008, 13:05
Нужно указать в main.cpp ту кодировку, в которых исходные файлы!
хех ... и что мы получим?

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

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

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

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

А вообще, по идее исп. нелатинские букавки в исходниках ненада. Нада юзать QObject::tr и Qt - лингвисд ;D


Название: Re: Проблема с кодировкой в PostgreSQL 7.0.2
Отправлено: Alex03 от Июль 23, 2008, 13:24
С UTF-8 порой тоже не всё так красиво как кажется.
Помнится были проблемы с FireBird заключающиеся в том что длина полей в одном месте указывается в символах, в другом устанавливается в байтах, а в третьем месте банальный пересчёт (для резервирования) 1символ -> 3 байта.
В результате в поле varchar(10) можно было записать 30 ASCII символов, 20 из кирилицы и т.д. что уже не есть корошо, и соответственно одни грабельки вылазили при коннекте клиента с кодировкой UTF-8, и другие грабли с клиентом отличном от UTF-8.


Название: Re: Проблема с кодировкой в PostgreSQL 7.0.2
Отправлено: BaltikS от Июль 23, 2008, 15:05
Цитировать
исходники в cp1251
БД в KOI8

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


Название: Re: Проблема с кодировкой в PostgreSQL 7.0.2
Отправлено: Примерный ученик от Октябрь 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 выражениях.
Мороки меньше.
Может кому пригодится ;D

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


Название: Re: Проблема с кодировкой в PostgreSQL 7.0.2
Отправлено: kolob от Ноябрь 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?


Название: Re: Проблема с кодировкой в PostgreSQL 7.0.2
Отправлено: BaltikS от Ноябрь 26, 2010, 11:44
Вероятно Вы используете БД PostgreSQL 8.3 > ...
Вам сюда http://sql.ru/forum/actualthread.aspx?tid=679075&hl=koi8


Название: Re: Проблема с кодировкой в PostgreSQL 7.0.2
Отправлено: kolob от Ноябрь 26, 2010, 12:27
Цитировать
C:\Program Files\PostgreSQL\8.3\bin>initdb -U postgres -E KOI8 -D /data
The files belonging to this database system will be owned by user "Admin".
This user must also own the server process.

The database cluster will be initialized with locale Russian_Russia.1251.
initdb: encoding mismatch
The encoding you selected (KOI8) and the encoding that the
selected locale uses (WIN1251) do not match.  This would lead to
misbehavior in various character string processing functions.
Rerun initdb and either do not specify an encoding explicitly,
or choose a matching combination.

что то не очень получается...


Название: Re: Проблема с кодировкой в PostgreSQL 7.0.2
Отправлено: BaltikS от Ноябрь 26, 2010, 15:48
Переведите, что в сообщении. В любом случае этот вопрос к Qt никакого отношения не имеет!


Название: Re: Проблема с кодировкой в PostgreSQL 7.0.2
Отправлено: kolob от Ноябрь 26, 2010, 17:00
У кого проблемы с английским воспользуйтесь переводчиком. Может конечно они и не имеет отношения к Qt, но имеет отношение к данной теме. И вообще в этой теме мало что относилось к Qt, обсуждались кодировки вообще то.
А моя проблема так же связана с кодировкой:
В приложении установлена кодировка cp 1251, в БД PSQL тоже win1251. Производиться анализ xml файла, из него считывается информация(кириллица). Файл в кодировке utf8, если это имеет значение?
Вся полученная информация заносится в базу. Через pgAdmin делаю запрос к базе, выводит нормальный читабельный результат. Через консоль psql делаю запрос получаются крокозябры. В чем проблема?


Название: Re: Проблема с кодировкой в PostgreSQL 7.0.2
Отправлено: BaltikS от Ноябрь 26, 2010, 19:38
Я не просил вас переводить мне то, что было выведено в консоль... Я хотел, чтобы вы попытались понять в чём проблема....
Цитировать
Через консоль psql делаю запрос получаются крокозябры. В чем проблема?
Проблем нет для вас. Проблема в консоли, она не понимает 1251. Точнее выдаёт не в 1251.


Название: Re: Проблема с кодировкой в PostgreSQL 7.0.2
Отправлено: kolob от Ноябрь 26, 2010, 21:21
Цитировать
Проблема в консоли, она не понимает 1251. Точнее выдаёт не в 1251.
Ну пусть будет так. Но а если я меняю кодировку командой
Код:
\encoding win1251
Что тогда?
Также пробовал поменять кодировку в виндовой консоли
Код:
chcp 1251
Но результат тот же.


Название: Re: Проблема с кодировкой в PostgreSQL 7.0.2
Отправлено: BaltikS от Ноябрь 26, 2010, 22:00
kolob, я не пойму, что вы привязались к консоли? В Админе правильно выдаёт? Если правильно, то всё нормуль. Для эксперимента в 3 QT в программе demo есть вкладка database подключитесь через неё к базе и проверьте результат... Так и не вкурил причём тут KOI8???


Название: Re: Проблема с кодировкой в PostgreSQL 7.0.2
Отправлено: kolob от Ноябрь 27, 2010, 17:53
Цитировать
kolob, я не пойму, что вы привязались к консоли? В Админе правильно выдаёт?
В Админе все нормально отображается. Я хотел разобраться, ну и настроить так чтобы и в консоли отображалось нормально.