powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?
19 сообщений из 19, страница 1 из 1
Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?
    #37205494
Ihor Bobak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем добрый день.

есть 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 в десятичной). Записываем файл. Пробуем считать данные - а фиг там...
...
Рейтинг: 0 / 0
Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?
    #37205556
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 в десятичной). Записываем файл. Пробуем считать данные - а фиг там...Еще раз - надо правильно указать признак кодовой страницы в самом файле. Если файл не секретный и не слишком большой, то достаточно его выложить сюда для тщательного осмотра, постановки диагноза и выбора терапии.
...
Рейтинг: 0 / 0
Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?
    #37205627
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала, надо убедится, что файл DBF:

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

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

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

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

Только не вздумайте править заголовок DBF в блокноте. Разрушите все окончательно...
...
Рейтинг: 0 / 0
Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?
    #37205728
Ihor Bobak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ,

c заголовком все ок - смотрите скриншот. В следующем сообщении аттачем пойдет сам файл.
...
Рейтинг: 0 / 0
Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?
    #37205730
Ihor Bobak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBF-файл приаттачен.
...
Рейтинг: 0 / 0
Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?
    #37205735
Ihor Bobak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще хочу сказать, что при открытии файла в известной программе DBF Viewer 2000 можно четко увидеть, что это ANSI (то есть 1251). В самой проге пользователь задает как он хочет файл смотреть - в режиме ANSI или OEM. Если выбрать ANSI - отображает то, что надо.

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

P.S.
Если с моей стороны еще что-то надо - например, выложить сюда SSIS-пакет или .NET-приложение читающее файл через OLEDB-провайдер 9.0 фокспро - могу это сделать.
...
Рейтинг: 0 / 0
Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?
    #37205983
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ihor Bobak,

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

Код: plaintext
codepage =  1251 
...
Рейтинг: 0 / 0
Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?
    #37207463
Гулин Федор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ihor Bobak,

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

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

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

если укажите ссылку для VFP провайдера - попробую
...
Рейтинг: 0 / 0
Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?
    #37207992
Ihor Bobak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Федор,

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

Еще раз все настройки:
...
Рейтинг: 0 / 0
Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?
    #37210389
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрался я до Integration Services. Так вот, после установки соединения, если нажать кнопку Preview возникает вот такой диалог

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

По крайней мере, у меня с этии настройками открывается нормально
...
Рейтинг: 0 / 0
Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?
    #37210395
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Окно настройки свойств соединения
...
Рейтинг: 0 / 0
Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?
    #37210409
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Окно свойств объекта OLE DB Source
...
Рейтинг: 0 / 0
Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?
    #37210918
Ihor Bobak
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ,

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

У меня все свойства были ИМЕННО ТАК, как вы показываете на скриншоте. После перезагрузки открыл записанный проект, ничего не менял. И все работает
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?
    #38143508
ВладимирМДобрался я до Integration Services. Так вот, после установки соединения, если нажать кнопку Preview возникает вот такой диалог

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

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

Указываю все, как просит этот warning.
Что нужно сделать, чтобы этот диалог исчез и больше не появлялся?
...
Рейтинг: 0 / 0
Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?
    #38170092
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rostislav D. KudryashovАртур Бондаренко, у меня были проблемы с CODEPAGE досовских файлов до установки Visual Foxpro 9 SP2. Потом Фокс стал правильно учитывать признак кодовой страницы в 29-м байте таблицы
фокс ее правильно учитывает с 5-й версии (может и в 3-й, с ней не работал), а вот в FPD 2.x в 29й байт фоксом писался ноль.
...
Рейтинг: 0 / 0
Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?
    #38170127
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
...
Рейтинг: 0 / 0
Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?
    #38170234
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМВ версии 2.5 и 2.6 он уже заполнялся.
Негде проверить. На W7x64 не запускается FPD. но если мне склероз не изменяет FPD 2.6 пишет 0 в кодовую страницу. Был один проект где одновременно было FPD 2.6 и VFP6, там эта проблема была, после PACK приходилось дополнительно устанавливать 29й байт.
Может речь о FPW 2.6 ?
...
Рейтинг: 0 / 0
Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?
    #38170246
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TFPD 2.6 пишет 0 в кодовую страницуЕсли он неправильно настроен.
...
Рейтинг: 0 / 0
Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?
    #38172294
Rostislav D. Kudryashov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё есть в 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, в региональный настройках задан "русский" по умолчанию.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как заставить OLEDB провайдера чтобы он нормально читал кодировку 1251?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]