Как определить кодировку файла dbf

Обновлено: 04.07.2024

[РЕШЕНО] DBF и редкие символы

БруноК:

--- Цитата из: eljo 19 апреля 2020 г., 14:35:38 ----.. но держу пари, кодировка символов utf8 16 или что-то в этом роде. Вам нужно преобразовать его в кодовую страницу, которая поддерживает ваши символы во время преобразования из xml.

--- Конец цитаты ---
libreoffice calc предлагает CP 850 : 'DOS Latin 1 Western Europe' для 11codmun.xls

wp:
Raul_ES, поскольку вы новичок в Pascal, я подумал, что, возможно, вам будет поучительнее, если у вас есть рабочий пример для начала. В вики fpspreadsheet есть пример преобразования xls в dbf, но он может оказаться слишком сложным для новичка.

Поэтому я написал приложенную демонстрацию. Он читает ваш файл excel (если он заархивирован, он все равно укладывается в ограничение на загрузку форума), извлекает из него поля и записывает ячейки в файл dbf. Затем файл dbf отображается в DBGrid. FPSpreadsheet преобразует строки в utf8, и в этом примере я увидел, что ваши испанские символы правильно отображаются в DBGrid. Поэтому я предполагаю, что DBF-компонент по умолчанию работает и с UTF8. Я проверял это с Лаз транком и Лаз 2.0.8/fpc 3.0.4 в Windows и Linux Мин. Удивительно, но никаких дополнительных преобразований кодовых страниц не требуется.

Обратите внимание, что для компиляции этой демонстрации вам необходим пакет laz_fpspreadsheet. Перейдите в Online-Package-Manager (в меню «Пакет»), прокрутите вниз до FPSpreadsheet, откройте узел и проверьте строку «laz_fpspreadsheet.lpk», нажмите «Установить». (Конечно, вместо этого вы можете проверить родительский узел "FPSpreadsheet", но для этой демонстрации вам не нужны другие пакеты).

Тэдди:
Сама dBASE (проверенная версия dBASE 4 для DOS, на которую у меня есть лицензия) не поддерживает это, за исключением кодовой страницы, как объяснялось выше.
Сомнительно, поддерживает ли такое наследие платформа очень нужна. Это просто неправильный выбор ядра базы данных, если только вы не работаете с устаревшими данными.

БруноК:

--- Цитата из: wp, 19 апреля 2020 г., 16:09:23 --- Удивительно, но никаких дополнительных преобразований кодовых страниц не требуется.

--- Конечная кавычка ---
Кодовая страница на самом деле CP 1252 (как сообщает notepad++), и это значение по умолчанию для TDBF.

wp:
Я не знаю, что вы хотите сказать.

Когда я загружаю файл dbf, созданный моей демонстрацией выше, в LibreOffice Calc, я получаю правильные испанские символы, когда выбираю UTF8 в диалоговом окне импорта. Когда я загружаю файл dbf в Notepad ++ и переключаюсь на кодировку UTF8, обнаруживаемые текстовые патчи имеют правильные испанские символы. Когда я загружаю файл dbf в свой шестнадцатеричный редактор, я вижу два байта в местах, где ожидается испанский символ -> созданный файл dbf имеет кодировку UTF-8.

Однако, когда я импортирую файл dbf в LibreOffice Base как файл dBase, испанские символы отображаются как два байта. Таким образом, этот файл сбивает с толку «настоящую» программу базы данных. Моя программа передает строки в файл dbf побайтно, а для отображения файл снова считывается без преобразований, поэтому в инфраструктуре Lazarus все выглядит правильно.

Esri реализовала функцию «ПРЕОБРАЗОВАНИЕ КОДОВОЙ СТРАНИЦЫ» в приложениях ArcGIS Desktop (ArcMap, ArcCatalog и ArcGIS Pro), которая позволяет приложениям Desktop считывать и записывать шейп-файлы и файлы dBASE, закодированные в различных кодовых страницах. Функция преобразования кодовой страницы для файлов dBASE (называемая 'dbfDefault') активируется путем указания значения кодовой страницы в системном реестре. Ссылка на кодовую страницу включена в заголовок файла DBF. Кодовой страницей по умолчанию в шейп-файле (.DBF) является UTF-8 (UNICODE). Это значение по умолчанию для текущих методов интернационализации.

Что делает параметр dbfDefault?
Установив значение кодовой страницы в системном реестре, пользователи могут читать и записывать шейп-файлы и файлы dBASE, закодированные в этой кодовой странице. Например, пользователи могут экспортировать шейп-файл, закодированный в OEM, установив значение реестра кодовой страницы в OEM. Пользователи также могут читать шейп-файлы и файлы dBASE, в которых не хранится информация о кодовой странице, если они знают, в какой кодовой странице закодирован файл.

Зачем устанавливать dbfDefault?
При открытии шейп-файла и файла dBASE в ArcMap, ArcCatalog и ArcGIS Pro приложения смотрят на идентификатор языкового драйвера (LDID) в заголовке файла dBASE или связанный *.CPG, которые используются для определения кодовой страницы и помогают определить кодовую страницу читаемого файла. На основе полученной информации о кодовой странице ArcGIS Desktop отображает строки соответствующим образом, выполняя преобразование кодовой страницы, если это необходимо. Если в файле dBASE отсутствует LDID или файл .CPG, предполагается, что файл закодирован в кодовой странице Windows (ANSI/многобайтовая).

Большинство шейп-файлов и файлов dBASE должны содержать информацию о кодовой странице, хранящуюся в файле.Некоторые программы, такие как Microsoft Access и Excel, кодируют файлы dBASE в OEM, но не включают информацию о кодовой странице в LDID, поэтому ArcGIS не считывает файлы правильно. Чтобы избежать этой проблемы, пользователи могут установить для dbfDefault соответствующую кодовую страницу, прежде чем открывать файл, в котором отсутствует информация о кодовой странице.

Как работает dbfDefault?

Настройка dbfDefault в системном реестре определяет кодовую страницу, в которую экспортируется шейп-файл и файл dBASE. Кодовая страница шейп-файла и файла dBASE, созданные в ArcGIS Desktop, кодируются в соответствии с кодовой страницей, заданной значением 'dbfDefault' в системном реестре. Например, если для 'dbfDefault' установлено значение OEM, шейп-файлы и файлы dBASE, созданные в ArcMap, ArcCatalog и ArcGIS Pro, будут закодированы в OEM. В качестве альтернативы, если для dbfDefault установлено значение ANSI, шейп-файлы и файлы dBASE кодируются в ANSI.

С какими программами можно использовать dbfDefault?
Приложения ArcGIS Desktop — это единственные программы, на которые влияет настройка dbfDefault.

На какие форматы данных влияет dbfDefault?
Shapefile и файлы dBASE — единственные форматы данных, которые может использовать параметр dbfDefault для указания кодовой страницы.

Процедура

Предоставленные инструкции описывают, как установить значение dbfDefault в системном реестре. Ниже перечислены два варианта.

  1. Добавьте два ключа Common и CodePage в системный реестр.
    Чтобы добавить ключ:
    1. Откройте редактор реестра. Нажмите «Пуск» > «Выполнить», введите regedit и нажмите «ОК».
    2. В дереве реестра (в левой части окна реестра) перейдите к
      • Computer\HKEY_CURRENT_USER\Software\ESRI и щелкните раздел реестра Desktop 10.x (где x — текущая установленная версия).
      • Для ArcGIS Pro щелкните раздел реестра ArcGISPro.
    3. В меню "Правка" выберите "Создать" > "Ключ".
    4. Добавьте новый ключ с именем Common: введите имя Common и нажмите Enter.
    5. Нажмите новый общий ключ и добавьте еще один новый ключ с именем CodePage.
      1. Нажмите новый ключ CodePage.
      2. В меню "Правка" нажмите "Создать" > "Строковое значение".
      3. Введите dbfDefault в качестве нового значения и нажмите Enter.
        1. Выберите только что добавленную запись; важно, чтобы было выбрано dbfDefault, а не (по умолчанию).
        2. В меню "Правка" нажмите "Изменить".
        3. В поле "Значение" введите новое значение кодовой страницы, в данном примере SJIS, и нажмите "ОК".

        Новый ключ CodePage для ArcMap выглядит следующим образом:

        Ниже приведены списки поддерживаемых идентификаторов кодовых страниц (в них не учитывается регистр).

        437 — США
        708 — арабский (ASMO 708)
        720 — арабский (прозрачный ASMO), арабский (DOS)
        737 — греческий, греческий (DOS)
        775 – Прибалтика, Прибалтика (DOS)
        850 – Многоязычная латиница 1, западноевропейская (DOS)
        852 – Латиница 2, центральноевропейская (DOS)
        855 – кириллица
        857 – турецкий, турецкий (DOS)
        860 – португальский, португальский (DOS)
        861 – исландский, исландский (DOS)
        862 – иврит, иврит (DOS)
        863 – Французско-канадский, франко-канадский (DOS)
        864 – арабский, арабский (864)
        865 – скандинавский, скандинавский (DOS)
        866 – русский, кириллица (DOS)
        869 – Новогреческий, новогреческий (DOS)
        932 — японский, японский (Shift-JIS)
        936 — китайский (упрощенный): Китайская Народная Республика, Сингапур
        949 — корейский (унифицированный код хангыль) )
        950 — традиционный китайский: Тайвань, Гонконг, Китайская Народная Республика
        ALARABI — устанавливает кодовую страницу на 448

        1250 – среднеевропейская
        1251 – кириллица
        1252 – западноевропейская
        1253 – греческая
        1254 – турецкая
        1255 – иврит
        1256 – арабская
        1257 – балтийские языки
        1258 – вьетнамский
        Большая пятерка – китайский: Тайвань, Гонконг, Макао
        SJIS – японский (устанавливает кодовую страницу на 932)

        88591 – Латиница 1: Западноевропейская
        88592 – Латиница 2: Центральная и Восточноевропейская
        88593 – Латиница 3: Южноевропейская
        88594 – Латиница 4: Североевропейская
        88595 - Кириллица
        88596 - Арабский
        88597 - Греческий
        88598 - Иврит
        88599 - Латиница 5: Турецкий
        885910 - Латиница 6: Северный
        885911 - Тайский
        885913 – литовский
        885915 – латиница 9: западноевропейская (обновлена ​​латиницей 1)

        UTF-8 – устанавливает кодовую страницу 65001
        UTF8 – устанавливает кодовую страницу 65001

        Вариант B
        В качестве альтернативы можно использовать пакетный файл для изменения реестра Windows.

        1. В Блокноте создайте файл ChangeCodePage.bat, используя следующий код:

        Для ArcGIS Pro

        1. Сохраните файл в место на компьютере, которое нужно изменить.
        2. Откройте окно командной строки (может потребоваться запуск от имени администратора для запуска пакетного файла).
        3. Чтобы выполнить пакетный файл (и изменить кодовую страницу на японскую в этом примере), перейдите к местоположению пакетного файла и выполните следующую команду:

        Ключи реестра теперь созданы для ArcGIS Pro, а кодовая страница установлена ​​на SJIS.

        Последняя публикация: 13 марта 2021 г.

        Идентификатор статьи: 000013192

        Это краткое введение в API. Если вы хотите продолжить, вы можете найти people.dbf в examples/files/ .

        Открытие файла DBF¶

        Это возвращает объект DBF. Теперь вы можете перебирать записи:

        и количество записей:

        Удаленные записи доступны в удаленных:

        Вы также можете использовать оператор with:

        Объект DBF не держит открытыми какие-либо файлы, так что это сделано исключительно для удобства.

        Потоковая передача или загрузка записей¶

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

        Если у вас достаточно памяти, вы можете загрузить записи в список, передав load=True . Это обеспечивает произвольный доступ:

        Удаленные записи также загружаются в список в table.deleted .

        Кроме того, вы можете загрузить записи позже, вызвав table.load() . Это полезно, когда вы хотите просмотреть заголовок, прежде чем загружать что-либо. Например, вы можете создать функцию, которая возвращает список таблиц в каталоге и загружает только те, которые вам нужны.

        Если вам нужен только список записей и вам не нужны другие атрибуты таблицы, вы можете сделать следующее:

        Вы можете снова выгрузить записи с помощью table.unload() .

        Если таблица не загружена, записи и удаленные атрибуты возвращают объекты RecordIterator.

        При загрузке или переборе записей DBF и файл памятки будут открываться один раз для каждой итерации. Это означает, что объект DBF не содержит открытых файлов, только объект RecordIterator.

        Кодировки символов¶

        Все текстовые поля и примечания (кроме двоичных) будут возвращены в виде строк Unicode.

        dbfread попытается определить кодировку символов (кодовую страницу), используемую в файле, по байту language_driver. Если это не удается, он возвращается к ASCII. Вы можете переопределить это, передав encoding='my-encoding' . Кодировка доступна в атрибуте encoding.

        Возможно, некоторые символы не будут декодированы. Вы можете выбрать, как с ними обращаться, передав параметр char_decode_errors. Это передается прямо в bytes.decode . Дополнительную информацию см. в файле pydoc bytes.decode.

        Файлы заметок¶

        Если в файле есть хотя бы одно мемо-поле, dbfread будет искать соответствующий мемо-файл. Для Buildings.dbf это будет Buildings.fpt (для Visual FoxPro) или Buildings.dbt (для других баз данных).

        Поскольку файловая система Windows сохраняет регистр символов, имена файлов могут иметь смешанный регистр. Например, у вас может быть:

        Это создает проблемы в Linux, где имена файлов чувствительны к регистру. dbfread обходит это, игнорируя регистр в именах файлов. Вы можете отключить это, передав ignorecase=False .

        Если файл заметки отсутствует, вы получите исключение MissingMemoFile. Если вам все еще нужны остальные данные, вы можете передать ignore_missing_memofile=True . Все значения поля памятки теперь будут возвращены как None , как если бы памятки не было.

        dbfread полностью поддерживает файлы заметок Visual FoxPro ( .FPT ) и dBase III ( .DBT ). Он читает memo-файлы dBase IV (также .DBT ), но только если они используют размер блока по умолчанию 512 байт. (Это будет исправлено, если я найду больше файлов для изучения.)

        Фабрики звукозаписи¶

        Если вы не хотите, чтобы записи возвращались в виде коллекций.OrderedDict, вы можете использовать аргумент recfactory, чтобы создать собственную фабрику записей.

        Фабрика записей — это функция, которая принимает список пар (имя, значение) и возвращает запись. Вы можете делать с этими данными все, что угодно. Вот функция, которая создает объект записи с полями в качестве атрибутов:

        Если вы передадите recfactory=None, вы получите исходный список (имя, значение). (Это ярлык для recfactory=lambda items: items .)

        Пользовательские типы полей¶

        Если включенных типов сообщений недостаточно, вы можете добавить свои собственные, создав подкласс FieldParser . В качестве глупого примера, вот как вы можете читать текстовые ( C ) поля в обратном порядке:

        и вот как вы можете вернуть недопустимые значения как InvalidValue вместо того, чтобы вызывать ValueError :

        Имя файла нечувствительно к регистру, что означает, что DBF('PEOPLE.DBF') откроет файл people.dbf . Если есть файл заметок, он также будет искаться без учета регистра, поэтому DBF('PEOPLE.DBF') найдет файл заметок people.FPT .

        Возникнет DBFNotFound, если файл не найден, и MissingMemoFile, если файл заметки отсутствует.

        По умолчанию записи будут передаваться прямо с диска. Если вы передадите load=True, вместо этого они будут загружены в списки и станут доступны в виде записей и удаленных атрибутов.

        Вы можете загружать и выгружать записи в любое время с помощью методов load() и unload().

        Укажите кодировку символов для использования.

        По умолчанию dbfread пытается угадать кодировку символов из байта language_driver. Если это не удается, он возвращается к ASCII.

        Схема обработки ошибок, используемая для обработки ошибок декодирования. Это передается как опция ошибок в метод bytes.decode(). Из документации этого метода:

        «По умолчанию используется «строгий», что означает, что ошибки декодирования вызывают ошибку UnicodeDecodeError. Другими возможными значениями являются «игнорировать» и «заменить», а также любое другое имя, зарегистрированное с помощью codecs.register_error, которое может обрабатывать ошибки UnicodeDecodeError».

        lowernames=False Имена полей обычно пишутся в верхнем регистре. Если вы передадите True, все имена полей будут преобразованы в нижний регистр.

        Принимает функцию, которая будет использоваться для создания новых записей. Функция будет вызвана со списком пар (имя, значение).

        Если вы передадите recfactory=None, вы получите исходный список (имя, значение).

        ignorecase=True Windows использует файловую систему с сохранением регистра, что означает, что people.dbf и PEOPLE.DBF являются одним и тем же файлом. Это вызывает проблемы, например, в Linux, где регистр имеет значение. Чтобы обойти это, dbfread игнорирует регистр в именах файлов. Вы можете отключить это, передав ignorecase=False . parserclass=FieldParser Анализатор, используемый при анализе значений поля. Вы можете использовать это для добавления новых типов полей или выполнения пользовательского синтаксического анализа путем создания подкласса dbfread.FieldParser . (См. Типы полей.) ignore_missing_memofile=False Если у вас нет поля memo, вы можете передать ignore_missing_memofile=True . Все поля memo будут возвращены как None , так что вы, по крайней мере, получите остальные данные. raw=False Возвращает все значения данных в виде строк байтов. Это можно использовать для отладки или для собственного декодирования.

        Методы¶

        load() Загружать записи в память. Это загружает как записи, так и удаленные записи. Записи и удаленные атрибуты теперь будут списками записей. unload() Выгрузить записи из памяти. Записи и удаленные атрибуты теперь будут экземплярами RecordIterator , который выполняет потоковую передачу записей с диска.

        Атрибуты¶

        записи Если таблица загружена, это список записей. Если нет, то это объект RecordIterator. В любом случае повторение его или вызов len() даст одинаковые результаты. удалено Если таблица загружена, это список удаленных записей. Если нет, то это объект RecordIterator. В любом случае повторение его или вызов len() даст одинаковые результаты. loaded Истинно, если записи загружаются в память. dbversion Имя программы, создавшей базу данных (на основе байта dbversion в заголовке). Пример: «FoxBASE+/Dbase III plus, без памяти». name Имя таблицы. Это корень имени файла в нижнем регистре, например, файл /home/me/SHOES.dbf будет иметь имя shoes . date Дата последнего обновления файла (как datetime.date ) или None, если дата была полностью нулевой или недействительной. field_names Список имен полей в том порядке, в котором они появляются в файле. Например, это можно использовать для создания строки заголовка в файле CSV. encoding Кодировка символов, используемая в файле. Это определяется байтом language_driver в заголовке и может быть переопределено аргументом ключевого слова кодирования. ignorecase, lowernames, recfactory, parserclass, raw Для них устанавливаются значения одних и тех же аргументов ключевого слова. имя файла Имя файла DBF. memofilename Имя файла памятки или None, если файла памятки нет. заголовок

        Заголовок файла. Это предназначено только для внутреннего использования, но доступно для целей отладки. Пример:

        Читайте также: