Достаточно часто при работе со старыми dbf-ками встречается ситуация, когда таблица открывается, но вместо русского текста видны "кракозябры".
Я уже упоминал о такой возможности в статье о открытии dbf, теперь посмотрим как с этим бороться. Досовские кириллические символы как правило шли в 866-й кодовой странице. По умолчанию драйвер использует win1251.
Для начала нужно установить себе драйвер Visual FoxPro. Взять его можно здесь. Далее, нужно открыть файл таблицы любым редактором, поддерживающим 16-тиричное отображение и посмотреть на 29-й байт от начала. Там, скорее всего, нули. В этом случае драйвер будет использовать значение по умолчанию. Чтобы он начал воспринимать 866-ю страницу туда нужно записать шестнадцатеричное 65 (десятичное 101). Сделать это можно как руками, так и написав простенькую процедуру:
string filename = @"\\сервер\папка\table.dbf";
byte wrbyte = 101;
BinaryWriter bwrite = new BinaryWriter(File.Open(filename, FileMode.Open));
bwrite.Seek(29, SeekOrigin.Begin);
bwrite.Write(wrbyte);
bwrite.Close();
Теперь нужно подключить драйвер. Делается это следующей строкой подключения:
conn.ConnectionString = @"Provider=vfpoledb.1;Data Source=\\сервер\папка\;Exclusive=No;Collating Sequence=Machine;CODEPAGE = 1251";
Странное: хотя вроде логично было бы указать CODEPAGE =866, на практике у меня получилась не читаемая кодировка.
Я уже упоминал о такой возможности в статье о открытии dbf, теперь посмотрим как с этим бороться. Досовские кириллические символы как правило шли в 866-й кодовой странице. По умолчанию драйвер использует win1251.
Для начала нужно установить себе драйвер Visual FoxPro. Взять его можно здесь. Далее, нужно открыть файл таблицы любым редактором, поддерживающим 16-тиричное отображение и посмотреть на 29-й байт от начала. Там, скорее всего, нули. В этом случае драйвер будет использовать значение по умолчанию. Чтобы он начал воспринимать 866-ю страницу туда нужно записать шестнадцатеричное 65 (десятичное 101). Сделать это можно как руками, так и написав простенькую процедуру:
string filename = @"\\сервер\папка\table.dbf";
byte wrbyte = 101;
BinaryWriter bwrite = new BinaryWriter(File.Open(filename, FileMode.Open));
bwrite.Seek(29, SeekOrigin.Begin);
bwrite.Write(wrbyte);
bwrite.Close();
Теперь нужно подключить драйвер. Делается это следующей строкой подключения:
conn.ConnectionString = @"Provider=vfpoledb.1;Data Source=\\сервер\папка\;Exclusive=No;Collating Sequence=Machine;CODEPAGE = 1251";
Странное: хотя вроде логично было бы указать CODEPAGE =866, на практике у меня получилась не читаемая кодировка.
Напиши как получить данные из dos кодировки в utf-8 используя jet. conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=e:\\;Extended Properties=dBASE IV;User ID=;Password=;";
ОтветитьУдалитьзачем портить dbf файл и использовать спец. драйвер для бд
ОтветитьУдалитьможно использовать встроенные средства для изменения кодировок
например, я использовал вот такую функцию
...
string convertDefaultToDos(String src)
{
byte[] buffer;
buffer = Encoding.Default.GetBytes (src);
Encoding.Convert(Encoding.Default, Encoding.GetEncoding(866), buffer);
return Encoding.Default.GetString(buffer);
}
...
строка подключения была
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+"\\"+";Extended Properties=dBASE 5.0;User ID=Admin;Password="
и всё хорошо вроде было
...
Нижегородов Олег - olegnizh@mail.ru