1.0.3 автоматически не перекодирует данные при запросе, в отличие от более новых версий. В этом у Вас и проблема. Так что советую сменить движок.
"???" вместо русских букв (база данных FB, WIN1251)
Модератор: Модераторы
62mkv
1.0.3 автоматически не перекодирует данные при запросе, в отличие от более новых версий. В этом у Вас и проблема. Так что советую сменить движок.
1.0.3 автоматически не перекодирует данные при запросе, в отличие от более новых версий. В этом у Вас и проблема. Так что советую сменить движок.
- bloodlines
- постоялец
- Сообщения: 100
- Зарегистрирован: 05.11.2008 10:26:19
У меня как раз возникла такая же проблема при переносе старой программы с Delphi 5 на Lazarus. Проблему я решил так:
Написал для Firebird собственную UDF позволяющую выполнять перекодировку текстовых данных прямо в запросе. Подключил UDF к базе и теперь когда выполняю запрос на выборку данных то пишу что то вроде
WINTOUTF как раз выполняет преобразование из WIN1251 в UTF8. В самой базе ничего не меняется.
А для UPDATE и INSERT операций использую UTFTOWIN ( опять же из своей UDF ). И проблем с базой нет вообще! UDF не влияет на работу других программ подключающихся к данной базе.
Если интересно - то могу поделиться исходником UDF ( изначально писалась на C, но теперь переписана на FPC ).
Написал для Firebird собственную UDF позволяющую выполнять перекодировку текстовых данных прямо в запросе. Подключил UDF к базе и теперь когда выполняю запрос на выборку данных то пишу что то вроде
Код: Выделить всё
select
ID_PARTNER,
WINTOUTF( NAME ) as Name
FROM PARTNER
WINTOUTF как раз выполняет преобразование из WIN1251 в UTF8. В самой базе ничего не меняется.
А для UPDATE и INSERT операций использую UTFTOWIN ( опять же из своей UDF ). И проблем с базой нет вообще! UDF не влияет на работу других программ подключающихся к данной базе.
Если интересно - то могу поделиться исходником UDF ( изначально писалась на C, но теперь переписана на FPC ).
- dunin
- энтузиаст
- Сообщения: 634
- Зарегистрирован: 02.05.2007 13:18:11
- Откуда: Тољя††и
- Контактная информация:
bloodlines писал(а):У меня как раз возникла такая же проблема при переносе старой программы с Delphi 5 на Lazarus. Проблему я решил так:
Написал для Firebird собственную UDF позволяющую выполнять перекодировку текстовых данных прямо в запросе.
...
Продолжительные аплодисменты!
Все гениальное просто. Хорошо, что не прочитал это сообщение пару месяцев назад - так и сидел бы на win1251...
- bloodlines
- постоялец
- Сообщения: 100
- Зарегистрирован: 05.11.2008 10:26:19
Все гениальное просто. Хорошо, что не прочитал это сообщение пару месяцев назад - так и сидел бы на win1251...
Извините, но я не говорю, что WIN1251 это гуд, я всеми конечностями за Unicode и UTF8. Просто суть в моего вопроса (и как я понял вопроса автора темы) в том, что необходимо именно найти способ конвертации данных в UTF8 не меняя самой базы. В моём случае БД использовали кроме моей и сторонние проги, для которых WIN1251 - родная, потому UDF и писал. Никого сидеть на WIN1251 я не призываю.
- dunin
- энтузиаст
- Сообщения: 634
- Зарегистрирован: 02.05.2007 13:18:11
- Откуда: Тољя††и
- Контактная информация:
bloodlines писал(а):Извините, но я не говорю, что WIN1251 это гуд, я всеми конечностями за Unicode и UTF8. Просто суть в моего вопроса (и как я понял вопроса автора темы) в том, что необходимо именно найти способ конвертации данных в UTF8 не меняя самой базы. В моём случае БД использовали кроме моей и сторонние проги, для которых WIN1251 - родная, потому UDF и писал. Никого сидеть на WIN1251 я не призываю.
Приношу извинения за пост, основанный на всплеске эмоций - они, как правило, двояко воспринимаются...
Никакого сарказма. Искренне восхищен простотой и очевидностью решения. Когда, в свое время, столкнулся с тем же - разрулить ситуацию при помощи UDF даже в голову ни пришло - ни смог придумать ничего лучше, как "рубануть кардинально" - изменить кодировку БД. В данный момент ушел от win1251 окончательно и возвращаться не собираюсь.
- bloodlines
- постоялец
- Сообщения: 100
- Зарегистрирован: 05.11.2008 10:26:19
В данный момент ушел от win1251 окончательно и возвращаться не собираюсь.
Вот это правильно! Долой ущербные кодировки! На мой взгляд, если есть возможность то всегда следует использовать UNICODE.
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
А кто-нибудь подскажет код для получения инициалов от имени и отчества для UTF-8 без всяких там Utf8Decode и подобного? Имя (ну и отчество) может как на буржуинском, так и на русском ^_^
ну можно так:
Код: Выделить всё
uses ...,LCLProc,...;
....
I:=UTF8Copy(str,1,1);
....
- Brainenjii
- энтузиаст
- Сообщения: 1351
- Зарегистрирован: 10.05.2007 00:04:46
Спасибо ^_^ Правда, посмотрев как оно сделано, стало страшновато ^_^ Кстати, к вопросу о базах в cp1251 когда-то делали так - viewtopic.php?p=13945#p13945
62mkv писал(а):теперь исключение происходит (см. вложение)
Попробуй поменять localhost на другой. IP например. Только не 127.0.0.1
мда. примерно понятно. конвертация БД это конечно очень хорошо.. однако с этой БД работает приложение которое мы не в силах пока пересобрать. а изменения вносить придется явно, потому что FB 1.5 (насколько я помню, но сейчас уже не уверен) несколько "капризнее" к запросам... в общем совместимость с приложением, которое написано для 1.0.3, никем не гарантируется, а ловить грабли в приложении которое ежедневно используют по 20 человек постоянно, и которое не можешь пересобрать - как то не хочется
) тем более ради экспериментального проекта.
так что я уж пока как нибудь так. если будут другие варианты - прошу делиться !!
PS: UDF заценил, но "в КАЖДОМ ЗАПРОСЕ"
) че то лениво. проще один раз добиться и выяснить где и как этого (того же самого) можно добиться исправив FCL (зря что ли они OpenSource) и [пока] работать так..
так что я уж пока как нибудь так. если будут другие варианты - прошу делиться !!
PS: UDF заценил, но "в КАЖДОМ ЗАПРОСЕ"
...навесить на таблицу VIEW, в котором вызывать эти UDF абсолютно прозрачно для приложения.62mkv писал(а):PS: UDF заценил, но "в КАЖДОМ ЗАПРОСЕ" ;)) че то лениво. проще один раз
Может уже устарело...
Но:
FB 2.1 Lazarus 0.9.30.2 - win32
в инспекторе объектов на IBConnection ставим CharSet utf-8 в коде :
В рантайме - норма, в дизайне - ???.
Сам обыскался в И-нете. "Всё руками, всё руками..."
Но:
FB 2.1 Lazarus 0.9.30.2 - win32
в инспекторе объектов на IBConnection ставим CharSet utf-8 в коде :
Код: Выделить всё
procedure TForm1.FormShow(Sender: TObject);
begin
IBConnection1.Charset:='win1251';
SQLQuery1.Open;
end;В рантайме - норма, в дизайне - ???.
Сам обыскался в И-нете. "Всё руками, всё руками..."
Не трогая БД, проще всего перекодировать текстовые поля непосредственно перед отображением.
Для этого надо:
1. Подключить модуль "lconvencoding".
2. Написать для полей отображаемого Датасета обработчик события onGetText.
Примерно такой:
Привязывать этот обработчик к полям Датасета надо в обработчике события Датасета onAfterOpen:
Для этого надо:
1. Подключить модуль "lconvencoding".
2. Написать для полей отображаемого Датасета обработчик события onGetText.
Примерно такой:
Код: Выделить всё
procedure TForm1.AllText(Sender: TField; var AText: string; DisplayText: Boolean);
begin
if Sender.DataType=ftString then AText:=CP1251ToUTF8(Sender.AsString)
else
AText:=Sender.AsString;
end;
Привязывать этот обработчик к полям Датасета надо в обработчике события Датасета onAfterOpen:
Код: Выделить всё
procedure TForm1.DataSet1AfterOpen(DataSet: TDataSet);
var i:integer;
begin
With DataSet do
begin
for i := 0 to Pred(FieldCount) do
begin
Fields[i].OnGetText:=AllText;
end;
end;
end;
Код: Выделить всё
procedure TForm1.FldGetText(Sender: TField; var AText: string; DisplayText: Boolean);
begin
AText:=CP1251ToUTF8(Sender.AsString);
end;
procedure TForm1.FldSetText(Sender: TField; const AText: string);
begin
Sender.AsString:=UTF8ToCP1251(AText);
end;
procedure TForm1.DataSet1AfterOpen(DataSet: TDataSet);
var i:integer;
begin
With DataSet do
begin
for i := 0 to Pred(FieldCount) do
if Fields[i].DataType in [ftString, ftMemo] then
begin
Fields[i].OnGetText:=@FldGetText;
Fields[i].OnSetText:=@FldSetText;
end;
end;
end;