"???" вместо русских букв (база данных FB, WIN1251)
Модератор: Модераторы
"???" вместо русских букв (база данных FB, WIN1251)
вроде долго искал на форуме но прямого пути так и не нашел, решил задать вопрос чтобы развеять сомнения...
итак, при работе с БД Firebird, чей чарсет - WIN1251, все компоненты которые работают с БД (DBGrid, DbText, DBEdit) отображают русские символы как ???
хотя свойство Charset компонента TIBConnection выставлено в WIN1251
в Lazarus-е я новичок совсем, да и на Delphi давно уж не программировал, но там такой проблемы даже не возникало. подскажите кто что сможет...
функций перекодировки нашел на форуме много, но куда и как их применить для данной задачи - пока что-то не пойму..
итак, при работе с БД Firebird, чей чарсет - WIN1251, все компоненты которые работают с БД (DBGrid, DbText, DBEdit) отображают русские символы как ???
хотя свойство Charset компонента TIBConnection выставлено в WIN1251
в Lazarus-е я новичок совсем, да и на Delphi давно уж не программировал, но там такой проблемы даже не возникало. подскажите кто что сможет...
функций перекодировки нашел на форуме много, но куда и как их применить для данной задачи - пока что-то не пойму..
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
Выставьте Charset у TIBConnection в UTF8
теперь исключение происходит (см. вложение)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
По идее должно быть UTF-8
ровно тоже самое
У вас нет необходимых прав для просмотра вложений в этом сообщении.
62mkv
Тогда попробуйте поставить в свойстве CharSet то, что Вы поставили при создании БД. Если Вы там не ставили ничего, значит FB, видимо, не может правильно определить кодировку и её нужно задать (в самой БД, при создании) напрямую.
Тогда попробуйте поставить в свойстве CharSet то, что Вы поставили при создании БД. Если Вы там не ставили ничего, значит FB, видимо, не может правильно определить кодировку и её нужно задать (в самой БД, при создании) напрямую.
вот как выглядит дамп 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 изначально, и именно такое значение и приводит к ??? вместо русских (только русских) символов ! цифры и латиница отображаются нормально.
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 изначально, и именно такое значение и приводит к ??? вместо русских (только русских) символов ! цифры и латиница отображаются нормально.
62mkv
А какая у Вас версия FireBird?
Попробуйте ещё такой вариант: после соединения с БД, но перед открытием таблиц сделать:
А какая у Вас версия FireBird?
Попробуйте ещё такой вариант: после соединения с БД, но перед открытием таблиц сделать:
Код: Выделить всё
IBConnection.ExecuteDirect('SET NAMES UTF8');теперь такая ошибка (см. вложение)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
- dunin
- энтузиаст
- Сообщения: 634
- Зарегистрирован: 02.05.2007 13:18:11
- Откуда: Тољя††и
- Контактная информация:
62mkv, c IBExpert работали?
Если "да", то тогда пошагово:
- Цепляем БД в IBExpert;
- Выгоняем метаданные + просто данные в скрипт;
- Правим скрипт, меняя чарсет (DEFAULT CHARACTER SET UTF8);
- Правим в скрипте имя файла базы данных;
- Жмакаем "выполнить";
- открываем вновь созданную БД в своем приложении в lazarus. Все должно заработать. Даже чарсет в инспекторе объектов ставить не придется (вроде... могу ошибаться... перевел все свое на UIB компоненты).
Одно "но". До нажатии в IBExpert кнопки "выполнить" (скрипт) надо правильно поставить кодировку. То ли ANSI, то ли UTF8. По логике UTF8, а по памяти, вроде ANSI. Ну... можно и так и так попробовать - как-нибудь да получится.
Смысл всех манипуляций - перевести БД и ВСЕ данные в оной на правильную кодировку. Тогда все как надо заработает. И в Lazarus и где угодно.
Грабли: во вновь создаваемой БД длину текстовых полей надо увеличить ровно в два раза (опять же предварительно подправить скрипт). Например если было поле VARCHAR 16, то сделать VARCHAR 32.
Добавлено спустя 11 минут 13 секунд:
Ага, значит работали. Ну я спокоен - все получится. Удачи.
Если "да", то тогда пошагово:
- Цепляем БД в IBExpert;
- Выгоняем метаданные + просто данные в скрипт;
- Правим скрипт, меняя чарсет (DEFAULT CHARACTER SET UTF8);
- Правим в скрипте имя файла базы данных;
- Жмакаем "выполнить";
- открываем вновь созданную БД в своем приложении в lazarus. Все должно заработать. Даже чарсет в инспекторе объектов ставить не придется (вроде... могу ошибаться... перевел все свое на UIB компоненты).
Одно "но". До нажатии в IBExpert кнопки "выполнить" (скрипт) надо правильно поставить кодировку. То ли ANSI, то ли UTF8. По логике UTF8, а по памяти, вроде ANSI. Ну... можно и так и так попробовать - как-нибудь да получится.
Смысл всех манипуляций - перевести БД и ВСЕ данные в оной на правильную кодировку. Тогда все как надо заработает. И в Lazarus и где угодно.
Грабли: во вновь создаваемой БД длину текстовых полей надо увеличить ровно в два раза (опять же предварительно подправить скрипт). Например если было поле VARCHAR 16, то сделать VARCHAR 32.
Добавлено спустя 11 минут 13 секунд:
62mkv писал(а):вот как выглядит дамп Extract Metadata в IBExpert:
....
Ага, значит работали. Ну я спокоен - все получится. Удачи.
62mkv
Vadim писал(а):А какая у Вас версия FireBird?
FB 1.0.3
переводить БД в UNICODE не могу - с ней же куча других приложений работает, я их не могу модифицировать.
Добавлено спустя 5 минут 45 секунд:
собственно одна из задач проекта - оценить перспективность Лазаруса как среды в сторону которой стоит двигаться от устаревающего Delphi 7...
пока весы склоняются совсем не в пользу Лазаруса ;((
задача выглядит элекментарной, тем не менее ни одного толкового совета так и не получил (отконвертировать базу это не решение проблемы, это уход от нее. согласен, могло бы и прокатить но не в этом случае увы)
переводить БД в UNICODE не могу - с ней же куча других приложений работает, я их не могу модифицировать.
Добавлено спустя 5 минут 45 секунд:
собственно одна из задач проекта - оценить перспективность Лазаруса как среды в сторону которой стоит двигаться от устаревающего Delphi 7...
пока весы склоняются совсем не в пользу Лазаруса ;((
задача выглядит элекментарной, тем не менее ни одного толкового совета так и не получил (отконвертировать базу это не решение проблемы, это уход от нее. согласен, могло бы и прокатить но не в этом случае увы)
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
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 не поддерживается. Так что глобальней и надёжней будет обновиться ^_^
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
- Откуда: Тољя††и
- Контактная информация:
62mkv писал(а):FB 1.0.3
переводить БД в UNICODE не могу - с ней же куча других приложений работает, я их не могу модифицировать.
...
Понятно. Тогда поиском по форуму на предмет "как-то убрать UTF8" или вроде того... Не спешите сразу "убивать UTF8" - дочитайте ветку до конца.
62mkv писал(а):...отконвертировать базу это не решение проблемы, это уход от нее....
Ну... Хозяин-барин... По мне, так отказ от конвертации как раз и есть уход от проблемы, а не решение. Как уже слегка обмолвился Brainenjii, именно юникод и есть родной формат для FB. Помню времена, когда в статьях про программирование совершенно серьезные дядьки совершенно серьезно писали что-то вроде "и для чего придумали эту 1251, есть же 866"? Где теперь 866?
-
Padre_Mortius
- энтузиаст
- Сообщения: 1265
- Зарегистрирован: 29.05.2007 17:38:07
- Откуда: Спб
Полностью согласен с Brainenjii. Для начала стоит обновить ядро базы до 1.5. Обновление делается через создание резервной копии на старой версии и восстановления базы уже на новой.
