Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2012.04.15;
Скачать: [xml.tar.bz2];

Вниз

Проблема с кодировкой DBF при подключении через ADO   Найти похожие ветки 

 
avn72 ©   (2009-07-31 16:13) [0]

Всем доброго всемени суток. Доступ к таблице DBase через ADO. Проблема с
правильным отображением русских букв таблицы (открыватся-то открывается,
но "буковки нерусские")
Строка подключения:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\Work-TD\;Extended
Properties=DBASE III;Persist Security Info=False;
Если в dbf-файле кодовую страницу ппроставлять принудительно, то все нормально срабатывает. НО!!! DBF может быть с нулевым
29-ым байтом и с CP866 и c CP1251! А открывать их в режиме чтения только можно, для различных выборок (сами понимаете, что байтик)
Кроме Jet.OLEDB.4.0 пробовал еще VFPOLEDB.1 У этого провайдера и явный параметр есть на code page, но при нулевом байте не работает даже явное казание CP
Как решить проблему? Или этот косяк никак не обойти?


 
Anatoly Podgoretsky ©   (2009-07-31 16:22) [1]

DBASE III в принципе не поддерживает языка таблиц. У него только один язык MACHINE


 
sniknik ©   (2009-07-31 19:08) [2]

у jet-а (вернее у его dBase исама) есть настройка в реестре как он будет открывать таблицы. в дос или вин кодировке. байтик в таблице в принципе влиять не должен... тем более в 3 дибесе его вообще быть не должно (как и такой таблицы с виндовой кодировкой... они устарели задолго до появления виндовс.).


 
avn72 ©   (2009-07-31 21:07) [3]


> DBASE III в принципе не поддерживает языка таблиц. У него
> только один язык MACHINE


И что это значит??? Для особо одаренных пожалуйста!


> у jet-а (вернее у его dBase исама) есть настройка в реестре
> как он будет открывать таблицы. в дос или вин кодировке.
>  байтик в таблице в принципе влиять не должен.


Но влияет именно байтик CP!
Смотрим ISAM здесь:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\ISAM Formats\dBase III
Ничего про CP, только есть Engine
Смотрим Engine:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Xbase
Вроде должно быть нормально, по умолчанию, в ключе DataCodePage=OEM! (кстати пробовал и ANSI, как кто-то советовал, но результат нулевой) НО-Но-НО!!! Правильное отображение только и только тогда, когда проставлен байтик в таблице! Вот в чем и дело-то! А именно его я менять не могу т.к. базы shared! А если 0-ой байт CP то перкодируется вообще непонятно как. И символы в гриде всякие-есть (есть и до 127 кода), хотя я специально сделал табличку, из одного поля, в которой только русский алфавит. То есть я вообще не понимаю, как перекодируется, ведь если CP866<->CP1251, то коды символов должны быть > 127 (Dec) ???
Где собака порылась?


 
sniknik ©   (2009-07-31 21:21) [4]

> И что это значит??? Для особо одаренных пожалуйста!
нету в DBASE III байтика... вообще указания кодовой страницы нет, т.к. когда разрабатывался был только дос без винды.

раз у тебя есть то это НЕ дибейс три. и работать с ним скорее всего нужно по другим правилам. кстати о работе исамов, jet может работать через установленный BDE (там у тебя какие настройки?), а может через "встроенную" (и ограниченную в чем то) версию BDE.


 
avn72 ©   (2009-08-03 09:08) [5]


> нету в DBASE III байтика... вообще указания кодовой страницы
> нет, т.к. когда разрабатывался был только дос без винды.

Это понятно, но другие проги, которые цепляются к этой базе, проставляют. И отследить трудно.

Поэкспереремнтировал на чистой машине и с на машине с установленной BDE. Тоже по разному ведут себя таблички с проставленной CP, и без него.
Причем правильно в обоих случаях (для DOS таблицы) только с проставленной CP

Вобщем, как бы не хотелось, а придется сначала проверять байтик! И ставить его!
Спасибо всем! Тему можно закрывать!


 
sniknik ©   (2009-08-03 09:20) [6]

блин, да даже если то что пишешь правда (когда то проверял, когда работал, и что помню расходится с твоими словами - никакой разницы у движка у которого жестко проставлено в какой кодировке открывать. если не вмешивается другая настройка конечно... а они так цепочкой друг друга используют, запутаться легко ),
ладно пусть что то с тех пор изменилось, и счас не так, но что мешает найти какой нибудь старый встраиваемый в программу движок, который попросту не знает об этом байте?


 
Anatoly Podgoretsky ©   (2009-08-03 10:28) [7]

> avn72  (03.08.2009 09:08:05)  [5]

Это неправильные программы, они портят файл, хорошо что другие программы на это не обращают внимание и не пользуются этим байтиком. А вот которые пользуются те неправильные, они пользуются тем, чего нет и быть не должно.

А может быть ты лапшу нам насчет DBASE III вешает, может не DBASE III они ждут а другое.


 
sniknik ©   (2009-08-03 11:22) [8]

вообще легко проверить, выложи 2 файла, один с "правильным"  байтом другой с неправильным, открою сам и посмотрю. только вечером, счас работы много.


 
Anatoly Podgoretsky ©   (2009-08-03 12:07) [9]

> sniknik  (03.08.2009 11:22:08)  [8]

Можно не тратить время, dBase III по определению не поддерживает это поле, по спецификации. Поддержка языка таблицы, а это именно это поле, появилась начиная с dBase for Windows, кроме того для русского только 866 кодовая таблица.


 
sniknik ©   (2009-08-03 15:21) [10]

Anatoly Podgoretsky ©   (03.08.09 12:07) [9]
я это знаю, но как предполагал ранее у него скорее всего не dbase III, и даже в этом случае при указании движку (jet) кодировки он не обращает внимание на байт в файле, ну, насколько помню, вот с парадоксом было обратное.


 
Anatoly Podgoretsky ©   (2009-08-03 16:35) [11]

> sniknik  (03.08.2009 15:21:10)  [10]

Поскольку jet работает с dBase III - dBase IV поэтому кодировка не актуально, в отличии от Борланда они не стали делать извращения, а отнеслись более лояльно к формату, единственно, что они позволили себе так это перекодировку OEM/ANSI


 
avn72 ©   (2009-08-18 08:20) [12]

Не думал, что тема продолжилась!


> вообще легко проверить, выложи 2 файла, один с "правильным"
>  байтом другой с неправильным, открою сам и посмотрю. только
> вечером, счас работы много.


Если найдешь время проверить, могу выслать и базки и програмульку и исходник, потому что результаты мои что-то уж сильно расходятся с вашими, хотя тестил на двух машинках - w2k3 c BDE и на девственно чистой w2k


 
sniknik ©   (2009-08-18 09:18) [13]

> Если найдешь время проверить
только вечером. и не надо лишнего, исходников и всей базы, просто 2 файла "правильный" и "неправильный", с указанием кто из них кто.

> w2k3 c BDE и на девственно чистой w2k
сразу можно сказать результат может быть разный, при использовании jet-ом установленного BDE одни настройки (использование его ты наверняка не отключал) , без установки другие.


 
avn72 ©   (2009-08-18 10:08) [14]


> сразу можно сказать результат может быть разный, при использовании
> jet-ом


Так в том то и дело! О чем я и говорил. Результаты разные! Поэтому я и решил байт проверять, потому что проверять на разных машинах настройки Jet и BDE и менять их - это нехорошо. Я решил в данном случае как можно меньше править реестр, неизвестно, как себя поведут другие сторонние проги, которые могут пользоваться этими-же настройками. И гемора у меня будет намного больше.

Так что спасибо! Не стоит проверять.


 
Anatoly Podgoretsky ©   (2009-08-18 10:49) [15]

О каком байте может идти речь, при

> Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\Work-TD\;Extended
> Properties=DBASE III;Persist Security Info=False;

Оно в принципе не поддержано, язык таблицы впервые появился в версии dBase for Windows. До этого никаких языков не было, только MACHINE, при этом под этим исключительно понимается OEM, для JET сделано извращение для покрытия извращений других проеkтировщиков - это переключение OEM/ANSI хотя ANSI в принципе быть не может, DBASE III это для ДОС

Дальнейшее извращение это двойная поддержка БДЕ - родного БДЕ и из JET, по JET я уже указал, но когда стоит большой БДЕ, то используются его языковые драйвера, но все равно для DBASE нет ANSI драйверов в принципе.

Третье извращение - это dBase VII тебя правда не касается, то там еще появилась поддрежка шрифтов, языки реализуются через шрифт :-)

> пробовал еще VFPOLEDB.1

Это бы решило проблему, только нет совместимости с dBase по индексам и мемо полям.

И все это не включает извращение над байтом язык таблицы, когда он установлен для тех форматов, где его быть не должно и непредсказуемое поведение большого БДЕ

И резюма, для JET, как правило, достаточно поиграться с параметром OEM/ANSI.


 
Anatoly Podgoretsky ©   (2009-08-18 10:51) [16]


> потому что проверять на разных машинах настройки Jet и BDE
> и менять их - это нехорошо.

Это очень нехорошо, но слава богу, что их можно задать локально в строке подключения, название параметра не помню.


 
avn72 ©   (2009-08-18 13:30) [17]

Оказывается, что неправильная кодировка при нулевом байте возникает при стандартных установках BDE (т.е. LangDriver="ascii" ANSI)


> но слава богу, что их можно задать локально в строке подключения,
>  название параметра не помню.


Уже все глаза проглядел на:
http://msdn.microsoft.com/en-us/library/aa140022(office.10).aspx#adoproperties_extendedsettings


 
avn72 ©   (2009-08-18 13:31) [18]

Не нашел!


 
kish   (2010-05-19 11:49) [19]


> Оказывается, что неправильная кодировка при нулевом байте
> возникает при стандартных установках BDE (т.е. LangDriver="ascii"
> ANSI)


Все что нужно, это добавить в реестр в ветку
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\xBase]
значение BDE типа DWord со значением 2.
Причем это не повлияет на работу остальных приложений.
Вот пруфлинк: http://support.microsoft.com/kb/307455/EN-US/


 
Anatoly Podgoretsky ©   (2010-05-20 13:33) [20]

Автор давно уже умер, а ты только проснулся.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2012.04.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.003 c
15-1323954680
jacksotnik
2011-12-15 17:11
2012.04.15
Скопировать данные с одной таблицы в другую


2-1324515704
kalamandra
2011-12-22 05:01
2012.04.15
Decode gzip


4-1256278384
Morgan128
2009-10-23 10:13
2012.04.15
Управление процессами с определенным PID


1-1291676222
Gu
2010-12-07 01:57
2012.04.15
Заглавное меню


2-1324556014
igorium@list.ru
2011-12-22 16:13
2012.04.15
Можно ли узнать где произошла ошибка на чужом компе?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский