Проблемма с кодировками в TDBF
Модератор: Модераторы
Проблемма с кодировками в TDBF
Страшные вещи творяться... при записи рускоязычных строк в DBF файл в поля типа стринг сокращаеться длина строки, обрезается почти в 2 раза короче заявленного поля. Я так понимаю дело в кодировании руских символов, можно ли это как то обойти? Может перед записью в таблицы менять кодировку на какую то другую, а при возврате в поля ввода вывода обратно? Есть такие алгоритмы?
- Ichthyander
- энтузиаст
- Сообщения: 701
- Зарегистрирован: 04.04.2007 08:32:43
- Откуда: Астрахань
- Контактная информация:
Перед записью в базу данных преобразуйте строку при помощи функции UTF8ToAnsi или UTF8ToSys. И, наоборот, для отображения на форме используйте обратное преобразование AnsiToUTF8 или SysToUTF8.
Да редактирование базы работает... забыл предусмотреть и сказать...
А с DBMemo и DBGridom что делать?
DBMemo путём извращенских манипуляций можно заменить на обычный, но грид не восполнимая потеря...
А с DBMemo и DBGridom что делать?
DBMemo путём извращенских манипуляций можно заменить на обычный, но грид не восполнимая потеря...
qivi
Для русского языка в кодировке UTF-8 предусмотрено 2 байта, а не 1. Имейте это в виду, когда проектируете строковые поля своей таблицы и будет Вам счастье.
Для русского языка в кодировке UTF-8 предусмотрено 2 байта, а не 1. Имейте это в виду, когда проектируете строковые поля своей таблицы и будет Вам счастье.
Vadim писал(а):qivi
Для русского языка в кодировке UTF-8 предусмотрено 2 байта, а не 1. Имейте это в виду, когда проектируете строковые поля своей таблицы и будет Вам счастье.
Это я знаю... дак вопрос решается заложением удвоеного размера полей?
Я изменил кодировку как это обсуждено выше по теме, и редактирование осуществляемое в формах с простыми эдитами зарабоьало, но на главной форме информация частично выводится в дбгрид и дбмемо... а эти теперь вообще ничего не показывают... Можно как то это обстоятельство поправить?
qivi писал(а):дак вопрос решается заложением удвоеного размера полей?
Верно. В DBF'ах, по умолчанию, считается один символ - один байт, т.к. формат DBF создавался задолго до эпохи юникода. Для UTF Вам нужно в размер вносить поправку *2, если символы в строке будут русские.
qivi писал(а): а эти теперь вообще ничего не показывают...
Значит эти компоненты хотят UTF-8.
Vadim писал(а):Значит эти компоненты хотят UTF-8.
А средства и инструменты управления их хотелкой существуют или уже не как их не убедить что в данном случае для всех будет лучше если они отобразят ANSI кодировку?
qivi писал(а):Vadim писал(а):Значит эти компоненты хотят UTF-8.
А средства и инструменты управления их хотелкой существуют или уже не как их не убедить что в данном случае для всех будет лучше если они отобразят ANSI кодировку?
Для DBF управление хотелкой непредусмотрено
Делай всё руками
qivi писал(а):А средства и инструменты управления их хотелкой существуют
Главная фишка Lazarus - кроссплатформенность. ANSI(ASCII и т.п.) не являются кроссплатформенными кодировками. Следовательно
qivi писал(а):для всех будет лучше если они отобразят ANSI кодировку
явная неправда. Для Вас - может быть и лучше, но Вы ведь не являетесь идеологом разработки Lazarus?
Ну ладно, ладно пристыдили... 
Буду изощряться с удвоенного размера полями... будут проблеммы вернусь в тему.
Буду изощряться с удвоенного размера полями... будут проблеммы вернусь в тему.
qivi
По-моему удвоить размер поля это намного проще, чем переделывать кодировку DBGrid'а...
По-моему удвоить размер поля это намного проще, чем переделывать кодировку DBGrid'а...
Как я понял DBGrid, TDBF и dbf(с досовской кодировкой) связать нельзя?
alexs, а можно на простенький пример с одной формой, одним dbgrid'ом и одной dbf'ой, пожалуйста. Я понимаю когда вручную читать данные и запихивать в обычный Grid, а вот с DBGrid'ом не могу понять.
- alexs
- долгожитель
- Сообщения: 4069
- Зарегистрирован: 15.05.2005 23:17:07
- Откуда: г.Ставрополь
- Контактная информация:
Вот:
http://w7site.ru/fpc/tdbf/demo_29_dbf.tar.bz2
Из пояснений:
В обработчике
TForm1.Dbf1Translate(
Я использвал iconv для перекодировки между UTF8 и CP866
Можешь для себя использовать другие механизмы - благо вариантов масса.
Я тут оставил перкодировку только одного поля. Но можешь разкоментировать цикл и перекодировать все поля.
На самом деле - если кто-то возьмётся доделать механизм перекодировок в TDbf - это будет хороший человек
.
Там практически всё готово. Только автор жёстко в процедуре определения системной кодовой страницы вписал кодировку 1250 (редиска).
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 (редиска).
