Проблемма с кодировками в TDBF

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

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

Проблемма с кодировками в TDBF

Сообщение qivi » 22.03.2009 19:00:09

Страшные вещи творяться... при записи рускоязычных строк в DBF файл в поля типа стринг сокращаеться длина строки, обрезается почти в 2 раза короче заявленного поля. Я так понимаю дело в кодировании руских символов, можно ли это как то обойти? Может перед записью в таблицы менять кодировку на какую то другую, а при возврате в поля ввода вывода обратно? Есть такие алгоритмы?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Проблемма с кодировками в TDBF

Сообщение Ichthyander » 23.03.2009 00:28:35

Перед записью в базу данных преобразуйте строку при помощи функции UTF8ToAnsi или UTF8ToSys. И, наоборот, для отображения на форме используйте обратное преобразование AnsiToUTF8 или SysToUTF8.
Аватара пользователя
Ichthyander
энтузиаст
 
Сообщения: 698
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Проблемма с кодировками в TDBF

Сообщение qivi » 23.03.2009 01:21:48

Да редактирование базы работает... забыл предусмотреть и сказать...
А с DBMemo и DBGridom что делать?

DBMemo путём извращенских манипуляций можно заменить на обычный, но грид не восполнимая потеря...
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Проблемма с кодировками в TDBF

Сообщение Vadim » 23.03.2009 09:42:26

qivi
Для русского языка в кодировке UTF-8 предусмотрено 2 байта, а не 1. Имейте это в виду, когда проектируете строковые поля своей таблицы и будет Вам счастье.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Проблемма с кодировками в TDBF

Сообщение qivi » 23.03.2009 12:15:26

Vadim писал(а):qivi
Для русского языка в кодировке UTF-8 предусмотрено 2 байта, а не 1. Имейте это в виду, когда проектируете строковые поля своей таблицы и будет Вам счастье.

Это я знаю... дак вопрос решается заложением удвоеного размера полей?

Я изменил кодировку как это обсуждено выше по теме, и редактирование осуществляемое в формах с простыми эдитами зарабоьало, но на главной форме информация частично выводится в дбгрид и дбмемо... а эти теперь вообще ничего не показывают... Можно как то это обстоятельство поправить?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Проблемма с кодировками в TDBF

Сообщение Vadim » 23.03.2009 12:44:06

qivi писал(а):дак вопрос решается заложением удвоеного размера полей?

Верно. В DBF'ах, по умолчанию, считается один символ - один байт, т.к. формат DBF создавался задолго до эпохи юникода. Для UTF Вам нужно в размер вносить поправку *2, если символы в строке будут русские.
qivi писал(а): а эти теперь вообще ничего не показывают...

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

Re: Проблемма с кодировками в TDBF

Сообщение qivi » 23.03.2009 12:55:24

Vadim писал(а):Значит эти компоненты хотят UTF-8.

А средства и инструменты управления их хотелкой существуют или уже не как их не убедить что в данном случае для всех будет лучше если они отобразят ANSI кодировку?
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Проблемма с кодировками в TDBF

Сообщение Mr.Smart » 23.03.2009 13:29:59

qivi писал(а):
Vadim писал(а):Значит эти компоненты хотят UTF-8.

А средства и инструменты управления их хотелкой существуют или уже не как их не убедить что в данном случае для всех будет лучше если они отобразят ANSI кодировку?

Для DBF управление хотелкой непредусмотрено :wink:
Делай всё руками
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Проблемма с кодировками в TDBF

Сообщение Vadim » 23.03.2009 13:51:12

qivi писал(а):А средства и инструменты управления их хотелкой существуют

Главная фишка Lazarus - кроссплатформенность. ANSI(ASCII и т.п.) не являются кроссплатформенными кодировками. Следовательно
qivi писал(а):для всех будет лучше если они отобразят ANSI кодировку

явная неправда. Для Вас - может быть и лучше, но Вы ведь не являетесь идеологом разработки Lazarus? ;) Вдобавок Вы программируете только под Windows и что лучше для кроссплатформенной разработки приложений знать не можете.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Проблемма с кодировками в TDBF

Сообщение qivi » 23.03.2009 13:57:21

Ну ладно, ладно пристыдили... :oops:
Буду изощряться с удвоенного размера полями... будут проблеммы вернусь в тему.
Аватара пользователя
qivi
энтузиаст
 
Сообщения: 703
Зарегистрирован: 19.01.2009 13:45:54
Откуда: Россия

Re: Проблемма с кодировками в TDBF

Сообщение Vadim » 23.03.2009 14:23:51

qivi
По-моему удвоить размер поля это намного проще, чем переделывать кодировку DBGrid'а... :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Проблемма с кодировками в TDBF

Сообщение s1n » 01.03.2012 09:52:57

Как я понял DBGrid, TDBF и dbf(с досовской кодировкой) связать нельзя?
s1n
незнакомец
 
Сообщения: 3
Зарегистрирован: 09.12.2009 17:06:38

Re: Проблемма с кодировками в TDBF

Сообщение alexs » 01.03.2012 20:13:11

Можно.
Перекодировать тексты на лету.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Проблемма с кодировками в TDBF

Сообщение s1n » 02.03.2012 07:31:17

alexs, а можно на простенький пример с одной формой, одним dbgrid'ом и одной dbf'ой, пожалуйста. Я понимаю когда вручную читать данные и запихивать в обычный Grid, а вот с DBGrid'ом не могу понять.
s1n
незнакомец
 
Сообщения: 3
Зарегистрирован: 09.12.2009 17:06:38

Re: Проблемма с кодировками в TDBF

Сообщение alexs » 02.03.2012 23:16:38

Вот:
http://w7site.ru/fpc/tdbf/demo_29_dbf.tar.bz2
Из пояснений:
В обработчике
TForm1.Dbf1Translate(
Я использвал iconv для перекодировки между UTF8 и CP866
Можешь для себя использовать другие механизмы - благо вариантов масса.
Код: Выделить всё
{  for i:=0 to Dbf1.Fields.Count - 1 do
    if Dbf1.Fields[i] is TStringField then
      TStringField(Dbf1.Fields[i]).Transliterate:=true;}
  (Dbf1.FieldByName('NNP') as TStringField).Transliterate:=true;

Я тут оставил перкодировку только одного поля. Но можешь разкоментировать цикл и перекодировать все поля.
На самом деле - если кто-то возьмётся доделать механизм перекодировок в TDbf - это будет хороший человек :-).
Там практически всё готово. Только автор жёстко в процедуре определения системной кодовой страницы вписал кодировку 1250 (редиска).
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 238

Рейтинг@Mail.ru