Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?  [new]
Ihor Bobak
Member [заблокирован]

Откуда: BIT Impulse
Сообщений: 983
Всем добрый день.

есть DBF файл в кодировке 1251 (полученный от заказчика - его выгрузил их программер 1С).

Стоит задача программно с помощью OLEDB провайдера вычитать текст.

С FoxPro я дело никогда не имел - чтение делаю в SQL Server Integration Services пакете, настраивая доступ с помощью Microsoft OLE DB Provider for Visual FoxPro 9.0 - взятого отсюда
http://www.microsoft.com/downloads/en/details.aspx?familyid=e1a87d8f-2d58-491f-a0fa-95a3289c5fd4&displaylang=en

Не могу этому OLEDB провайдеру "вдолбить" чтобы он считывал данные в кодировке 1251. Пока что вижу кракозяблу - см. картинку.

Вопрос: как заставить фоксовый OLEDB провайдер понимать кодовую страницу 1251?
Буду ОЧЕНЬ благодарен за любые подсказки.

P.S.
Здесь вижу подход со взломом vfpoledb.dll - но у меня версия 9.0.0.5815 - не могу найти адрес где надо заменять E4->E3. логика такой замены очевидна: если перевести 1252 в шестнадцатеричное число - выйдет 04E4. Открываем хекс-редактором, ищем все вхождения 04E4 - находим 5 штук, меняем на 04E3 (=1251 в десятичной). Записываем файл. Пробуем считать данные - а фиг там...

К сообщению приложен файл. Размер - 66Kb
7 апр 11, 19:09    [10487948]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1547
Ihor Bobak
Всем добрый день.

есть DBF файл в кодировке 1251
И этому есть подтверждение?
(полученный от заказчика - его выгрузил их программер 1С).
Вот как раз оттуда такие товарищи по незнанию выгружают часто совсем не то, что говорят.

Стоит задача программно с помощью OLEDB провайдера вычитать текст.
...
Не могу этому OLEDB провайдеру "вдолбить" чтобы он считывал данные в кодировке 1251.
И не сможете. Править надо выгруженный файл.
Пока что вижу кракозяблу - см. картинку.

Вопрос: как заставить фоксовый OLEDB провайдер понимать кодовую страницу 1251?
Не надо его заставлять. Он слишком умный для этого.
Буду ОЧЕНЬ благодарен за любые подсказки.

P.S.
Здесь вижу подход со взломом vfpoledb.dll - но у меня версия 9.0.0.5815 - не могу найти адрес где надо заменять E4->E3. логика такой замены очевидна: если перевести 1252 в шестнадцатеричное число - выйдет 04E4. Открываем хекс-редактором, ищем все вхождения 04E4 - находим 5 штук, меняем на 04E3 (=1251 в десятичной). Записываем файл. Пробуем считать данные - а фиг там...
Еще раз - надо правильно указать признак кодовой страницы в самом файле. Если файл не секретный и не слишком большой, то достаточно его выложить сюда для тщательного осмотра, постановки диагноза и выбора терапии.
7 апр 11, 19:51    [10488099]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Для начала, надо убедится, что файл DBF:

1. Имеет установленный признак кодовой страницы
2. Данные в файле действительно храняться в кодовой странице 1251

Признак кодовой страницы записан в 29 байте заголовка таблицы (первый байт имеет порядковый номер 0). Т.е. если открыть файл DBF как обычный текстовый файл, то признак кодовой страницы будет хранится в 30 символе. Там должно быть записано

866 кодовая страница - ASCII код 101
1251 кодовая страница - ASCII код 201

Вполне возможно, что в этот файл данные действительно выгрузили в кодовой странице 1251, вот только в заголовке файла "забыли" указать признак кодовой страницы

Только не вздумайте править заголовок DBF в блокноте. Разрушите все окончательно...
7 апр 11, 21:14    [10488374]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?  [new]
Ihor Bobak
Member [заблокирован]

Откуда: BIT Impulse
Сообщений: 983
ВладимирМ,

c заголовком все ок - смотрите скриншот. В следующем сообщении аттачем пойдет сам файл.

К сообщению приложен файл. Размер - 68Kb
7 апр 11, 22:50    [10488695]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?  [new]
Ihor Bobak
Member [заблокирован]

Откуда: BIT Impulse
Сообщений: 983
DBF-файл приаттачен.

К сообщению приложен файл (Kategor.DBF - 56Kb) cкачать
7 апр 11, 22:51    [10488697]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?  [new]
Ihor Bobak
Member [заблокирован]

Откуда: BIT Impulse
Сообщений: 983
еще хочу сказать, что при открытии файла в известной программе DBF Viewer 2000 можно четко увидеть, что это ANSI (то есть 1251). В самой проге пользователь задает как он хочет файл смотреть - в режиме ANSI или OEM. Если выбрать ANSI - отображает то, что надо.

Поэтому вопрос пока-что открыт, и я буду вам очень благодарен если скажете что не так.

P.S.
Если с моей стороны еще что-то надо - например, выложить сюда SSIS-пакет или .NET-приложение читающее файл через OLEDB-провайдер 9.0 фокспро - могу это сделать.
7 апр 11, 22:56    [10488711]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?  [new]
PaulWist
Member

Откуда:
Сообщений: 2236
Ihor Bobak,

C dbf табличкой положить текстовый файл (можно через блокнот) с именем Config.fpw и содержанием

codepage = 1251
8 апр 11, 09:30    [10489451]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1273
Ihor Bobak,

я глянул файл в VFP9 все ок - 1251 кодировка
у меня тоже W7 x64

поставил VFP оле дб провайдер (какой был)
по ссылке у меня не открывается

в SSIS 2008 появлия оле дб сорс появился
но указывая директорию где лежит этот файл
SSIS почему то даже не видит списка dbf

если укажите ссылку для VFP провайдера - попробую
8 апр 11, 20:31    [10493765]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?  [new]
Ihor Bobak
Member [заблокирован]

Откуда: BIT Impulse
Сообщений: 983
Федор,

ссылка на провайдер: http://www.microsoft.com/downloads/en/details.aspx?familyid=e1a87d8f-2d58-491f-a0fa-95a3289c5fd4&displaylang=en
ccылка работает - только что проверил.

Еще раз все настройки:

К сообщению приложен файл. Размер - 95Kb
9 апр 11, 15:03    [10495483]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Добрался я до Integration Services. Так вот, после установки соединения, если нажать кнопку Preview возникает вот такой диалог

В нем ясно говорится, что нужно указать значение либо свойство объекта (OLE DB Source) DefaultCodePage = 1251, либо значение реквизита Local Indentifier = 1033 при создании соединения ADO.

По крайней мере, у меня с этии настройками открывается нормально

К сообщению приложен файл. Размер - 40Kb
11 апр 11, 16:39    [10502229]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Окно настройки свойств соединения

К сообщению приложен файл. Размер - 67Kb
11 апр 11, 16:42    [10502246]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Окно свойств объекта OLE DB Source

К сообщению приложен файл. Размер - 66Kb
11 апр 11, 16:45    [10502280]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?  [new]
Ihor Bobak
Member [заблокирован]

Откуда: BIT Impulse
Сообщений: 983
ВладимирМ,

помогла банальная перезагрузка компа.

У меня все свойства были ИМЕННО ТАК, как вы показываете на скриншоте. После перезагрузки открыл записанный проект, ничего не менял. И все работает
11 апр 11, 23:52    [10503924]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?  [new]
Артур Бондаренко
Member

Откуда: Одесса
Сообщений: 141
ВладимирМ
Добрался я до Integration Services. Так вот, после установки соединения, если нажать кнопку Preview возникает вот такой диалог

В нем ясно говорится, что нужно указать значение либо свойство объекта (OLE DB Source) DefaultCodePage = 1251, либо значение реквизита Local Indentifier = 1033 при создании соединения ADO.

По крайней мере, у меня с этии настройками открывается нормально


Указываю все, как просит этот warning.
Что нужно сделать, чтобы этот диалог исчез и больше не появлялся?
8 фев 13, 14:48    [13898027]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?  [new]
Dima T
Member

Откуда:
Сообщений: 15271
Rostislav D. Kudryashov
Артур Бондаренко, у меня были проблемы с CODEPAGE досовских файлов до установки Visual Foxpro 9 SP2. Потом Фокс стал правильно учитывать признак кодовой страницы в 29-м байте таблицы

фокс ее правильно учитывает с 5-й версии (может и в 3-й, с ней не работал), а вот в FPD 2.x в 29й байт фоксом писался ноль.
28 фев 13, 18:49    [13995820]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Dima T
фокс ее правильно учитывает с 5-й версии (может и в 3-й, с ней не работал), а вот в FPD 2.x в 29й байт фоксом писался ноль.

Если точнее, то 29 байт игнорировался до версии FoxPro for DOS 2.0 включительно. В версии 2.5 и 2.6 он уже заполнялся. Работа в Windows (даже в Win 3.11) без заполненного 29 байта может приводить к проблемам. Поэтому FPW 2.6 обязательно его заполнял.

Однако к описанной в теме проблеме это не имеет никакого отношения, поскольку речь идет о кодовой странице 1251. Т.е. это никак не может быть таблица от FoxPro for DOS.
28 фев 13, 19:09    [13995885]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?  [new]
Dima T
Member

Откуда:
Сообщений: 15271
ВладимирМ
В версии 2.5 и 2.6 он уже заполнялся.

Негде проверить. На W7x64 не запускается FPD. но если мне склероз не изменяет FPD 2.6 пишет 0 в кодовую страницу. Был один проект где одновременно было FPD 2.6 и VFP6, там эта проблема была, после PACK приходилось дополнительно устанавливать 29й байт.
Может речь о FPW 2.6 ?
28 фев 13, 20:48    [13996146]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1547
Dima T
FPD 2.6 пишет 0 в кодовую страницу
Если он неправильно настроен.
28 фев 13, 21:11    [13996195]     Ответить | Цитировать Сообщить модератору
 Re: Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?  [new]
Rostislav D. Kudryashov
Member

Откуда:
Сообщений: 237
Ещё есть в Help VFP S2 статья SET ENGINEBEHAVIOR.
"When you set SET ENGINEBEHAVIOR to 70 or 80 and the code page of the table (CPDBF( )) differs from the current Visual FoxPro code page setting (CPCURRENT( )), SQL or other Rushmore optimizable commands could return or act upon incorrect records. When you set SET ENGINEBEHAVIOR to 90, Visual FoxPro builds temporary indexes to ensure correct results."
А CPCURRENT() в VFPOLEDB вроде бы будет 1251, в региональный настройках задан "русский" по умолчанию.
3 мар 13, 07:31    [14004818]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить