"???" вместо русских букв (база данных FB, WIN1251)

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

62mkv
новенький
Сообщения: 10
Зарегистрирован: 27.03.2010 13:41:16
Откуда: Барнаул

"???" вместо русских букв (база данных FB, WIN1251)

Сообщение 62mkv »

вроде долго искал на форуме но прямого пути так и не нашел, решил задать вопрос чтобы развеять сомнения...

итак, при работе с БД Firebird, чей чарсет - WIN1251, все компоненты которые работают с БД (DBGrid, DbText, DBEdit) отображают русские символы как ???
хотя свойство Charset компонента TIBConnection выставлено в WIN1251

в Lazarus-е я новичок совсем, да и на Delphi давно уж не программировал, но там такой проблемы даже не возникало. подскажите кто что сможет...

функций перекодировки нашел на форуме много, но куда и как их применить для данной задачи - пока что-то не пойму..
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

Выставьте Charset у TIBConnection в UTF8
62mkv
новенький
Сообщения: 10
Зарегистрирован: 27.03.2010 13:41:16
Откуда: Барнаул

Сообщение 62mkv »

теперь исключение происходит (см. вложение)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
eevee
новенький
Сообщения: 63
Зарегистрирован: 29.12.2009 16:52:44
Откуда: Саратов

Сообщение eevee »

По идее должно быть UTF-8
62mkv
новенький
Сообщения: 10
Зарегистрирован: 27.03.2010 13:41:16
Откуда: Барнаул

Сообщение 62mkv »

ровно тоже самое
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

62mkv
Тогда попробуйте поставить в свойстве CharSet то, что Вы поставили при создании БД. Если Вы там не ставили ничего, значит FB, видимо, не может правильно определить кодировку и её нужно задать (в самой БД, при создании) напрямую.
62mkv
новенький
Сообщения: 10
Зарегистрирован: 27.03.2010 13:41:16
Откуда: Барнаул

Сообщение 62mkv »

вот как выглядит дамп Extract Metadata в IBExpert:

SET SQL DIALECT 3;

SET NAMES WIN1251;

CREATE DATABASE 'YMKM:C:\Develop\ezTask\Db\ezt1.fdb'
USER 'SYSDBA' PASSWORD 'masterkey'
PAGE_SIZE 16384
DEFAULT CHARACTER SET WIN1251;

как раз WIN1251 я и задавал в поле CharSet изначально, и именно такое значение и приводит к ??? вместо русских (только русских) символов ! цифры и латиница отображаются нормально.
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

62mkv
А какая у Вас версия FireBird?
Попробуйте ещё такой вариант: после соединения с БД, но перед открытием таблиц сделать:

Код: Выделить всё

IBConnection.ExecuteDirect('SET NAMES UTF8');
62mkv
новенький
Сообщения: 10
Зарегистрирован: 27.03.2010 13:41:16
Откуда: Барнаул

Сообщение 62mkv »

теперь такая ошибка (см. вложение)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
dunin
энтузиаст
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и
Контактная информация:

Сообщение dunin »

62mkv, c IBExpert работали?

Если "да", то тогда пошагово:
- Цепляем БД в IBExpert;
- Выгоняем метаданные + просто данные в скрипт;
- Правим скрипт, меняя чарсет (DEFAULT CHARACTER SET UTF8);
- Правим в скрипте имя файла базы данных;
- Жмакаем "выполнить";
- открываем вновь созданную БД в своем приложении в lazarus. Все должно заработать. Даже чарсет в инспекторе объектов ставить не придется (вроде... могу ошибаться... перевел все свое на UIB компоненты).

Одно "но". До нажатии в IBExpert кнопки "выполнить" (скрипт) надо правильно поставить кодировку. То ли ANSI, то ли UTF8. По логике UTF8, а по памяти, вроде ANSI. Ну... можно и так и так попробовать - как-нибудь да получится. :?

Смысл всех манипуляций - перевести БД и ВСЕ данные в оной на правильную кодировку. Тогда все как надо заработает. И в Lazarus и где угодно.

Грабли: во вновь создаваемой БД длину текстовых полей надо увеличить ровно в два раза (опять же предварительно подправить скрипт). Например если было поле VARCHAR 16, то сделать VARCHAR 32.

Добавлено спустя 11 минут 13 секунд:
62mkv писал(а):вот как выглядит дамп Extract Metadata в IBExpert:
....

Ага, значит работали. Ну я спокоен - все получится. Удачи. 8)
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

62mkv
Vadim писал(а):А какая у Вас версия FireBird?
62mkv
новенький
Сообщения: 10
Зарегистрирован: 27.03.2010 13:41:16
Откуда: Барнаул

Сообщение 62mkv »

FB 1.0.3

переводить БД в UNICODE не могу - с ней же куча других приложений работает, я их не могу модифицировать.

Добавлено спустя 5 минут 45 секунд:
собственно одна из задач проекта - оценить перспективность Лазаруса как среды в сторону которой стоит двигаться от устаревающего Delphi 7...

пока весы склоняются совсем не в пользу Лазаруса ;((

задача выглядит элекментарной, тем не менее ни одного толкового совета так и не получил (отконвертировать базу это не решение проблемы, это уход от нее. согласен, могло бы и прокатить но не в этом случае увы)
Аватара пользователя
Brainenjii
энтузиаст
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Сообщение Brainenjii »

1.0.3 0.o Ого ^_^ Попробуйте UNICODE_FSS или UNICODE-FSS... А лучше всего - обновите базу... А дальше как уже было предложено - UTF8/UTF-8

P.S. Просто Lazarus достаточно быстро развивается... И некоторые другие продукты смежные, как ни печально, остаются за бортом... Вот IE6 взять, к примеру - когда-то был на вершине олимпа, сейчас какая-нибудь ExtJS его не поддерживает практически... Вина ли это ExtJS? ^_^

P.P.S. - после обновления FP хотя бы до 1.5 переписывать другие приложения не потребуется. Просто сама база будет знать об UTF8 и сама на лету будет конвертировать данные из формата в формат (блобы не считаются ^_^)

P.P.P.S. Кроме того, даже на http://www.firebirdsql.org/ предупреждают, что firebird 1.0.3 не поддерживается. Так что глобальней и надёжней будет обновиться ^_^
Аватара пользователя
dunin
энтузиаст
Сообщения: 634
Зарегистрирован: 02.05.2007 13:18:11
Откуда: Тољя††и
Контактная информация:

Сообщение dunin »

62mkv писал(а):FB 1.0.3

переводить БД в UNICODE не могу - с ней же куча других приложений работает, я их не могу модифицировать.
...

Понятно. Тогда поиском по форуму на предмет "как-то убрать UTF8" или вроде того... Не спешите сразу "убивать UTF8" - дочитайте ветку до конца.

62mkv писал(а):...отконвертировать базу это не решение проблемы, это уход от нее....

Ну... Хозяин-барин... По мне, так отказ от конвертации как раз и есть уход от проблемы, а не решение. Как уже слегка обмолвился Brainenjii, именно юникод и есть родной формат для FB. Помню времена, когда в статьях про программирование совершенно серьезные дядьки совершенно серьезно писали что-то вроде "и для чего придумали эту 1251, есть же 866"? Где теперь 866?
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

Полностью согласен с Brainenjii. Для начала стоит обновить ядро базы до 1.5. Обновление делается через создание резервной копии на старой версии и восстановления базы уже на новой.
Ответить