Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с кодировками (BDE) [D4, dBase, FoxPro]


YuN ©   (2003-05-28 15:59:00) 

Имеются dbf с полями в досовской кодировке. Если они созданы без явного указания кодировке в заголовке файла (по смещению 1Dh - 0), то программы, работающие через BDE, кушают их на ура (в реестре и конфиге прописано, что драйвер для DBF соотв. 866 кодовой странице). Но если в заголовке тип кодировки прописан явно - имеем вместо текста крякозябры. Как бороться? Открыть файл как бинарный и вручную обнулить байт по 1Dh я, конечно, могу, но это неизящно :(


autootvetchik   (2003-05-30 14:16:00) [1]

Никогда не было проблемм. Ставишь для драйвера FOXPRO LangDriver "dBASE RUS cp866" (лучше динамически) и все! А какая там в таблице прописана CP по-барабану... (D5-D7, BDE 5.01)


Anatoly Podgoretsky   (2003-05-30 09:24:00) [2]

YuN (30.05.03 08:46)
65h это cp-866


Reindeer Moss Eater   (2003-05-30 09:00:00) [3]

Он как раз означает ANSI


YuN   (2003-05-30 08:46:00) [4]

Нет, в моем случае файлы экспортированы из Visual FoxPro, и вроде как в заголовке все указано правильно (по крайней мере, сам FoxPro их отображает корректно). Соотв. байт в заголовке - 65h (не знаю, действительно ли он означает 866 страницу). Досовский dbviewer их смотреть отказывается, что происходит с BDEшными прогами, рассказал. Обнуление байта решает все проблемы.


Reindeer Moss Eater   (2003-05-29 09:06:00) [5]

Это глюк несомненно, но это глюк не BDE.
Такие файлы формирует, например, всем известная 1С. Данные в cp866, а в заголовке указано, что в ANSI.


YuN   (2003-05-29 08:07:00) [6]

М-да... Т.е. получается, что это - глюк в чистом виде? Я думал, нужно просто задать правильное значение какого-нибудь property. А с глюком, действительно, не зазорно бороться "хакерскими" методами.


Reindeer Moss Eater   (2003-05-28 17:12:00) [7]

Изящество получится очень изящное


Reindeer Moss Eater   (2003-05-28 17:11:00) [8]

Тогда боюсь, что к данным в таблице (а они в cp866) будет применена операция ANSI -> OEM.


Anatoly Podgoretsky   (2003-05-28 17:03:00) [9]

Зпаголовку верит, данным нет


Reindeer Moss Eater   (2003-05-28 16:58:00) [10]

Остается проверить, "верит" ли BDE заголовку Dbase"а при выполнении DbiDoRestructure.

Проблема в том, что данные и так уже в cp866.


Mike Kouzmine   (2003-05-28 16:46:00) [11]

Солиднее


Reindeer Moss Eater   (2003-05-28 16:37:00) [12]

Перелопатить всю таблицу - это конечно изящнее, чем изменить один байт.


Stas   (2003-05-28 16:10:00) [13]

Вот код:
aDBHnd - TDatabase.Handle;
aTblType - "PARADOX"/"DBASE"/"FOXPRO"
aLangDriver - "ancyrr".

procedure ChangeLangDriver( aDBHnd: HDBIDB; aTable: TTable; const aTblType, aLangDriver: String);
var
TblExt: string;
TblDesc: CRTblDesc;
OptDesc: FLDDesc;
OptData: array [0..250] of Char;
Cur: hDBICur;
Rec: CFGDesc;
begin
FillChar( OptDesc, SizeOf( OptDesc ), #0);
FillChar( TblDesc, SizeOf( TblDesc ), #0);
StrCopy( OptDesc.szName, "LANGDRIVER");
OptDesc.iLen := Length(aLangDriver) + 1;
with TblDesc do
begin
StrPCopy( szTblName, aTable.TableName);
StrCopy( szTblType, PChar(aTblType));
iOptParams := 1;
pfldOptParams := @OptDesc;
pOptData := @OptData;
end;
StrPCopy( OptData, aLangDriver);
Check( DbiDoRestructure( aDBHnd, 1, @TblDesc, nil, nil, nil, False ) );
end


Наверх

Титульная страница Поиск, карта сайта Написать письмо