пятница, 10 февраля 2012 г.

И в n-й раз о кодировке DBF

    Достаточно часто при работе со старыми 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, на практике у меня получилась не читаемая кодировка.

Похожие посты:

2 комментария:

  1. Напиши как получить данные из dos кодировки в utf-8 используя jet. conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=e:\\;Extended Properties=dBASE IV;User ID=;Password=;";

    ОтветитьУдалить
  2. зачем портить 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

    ОтветитьУдалить