конвертировать кодирование полей базы данных в Jet Database / Delphi - PullRequest
0 голосов
/ 17 января 2011

У меня есть устаревшее приложение, написанное на Delphi, которое использует базу данных Jet в качестве внутреннего сервера для хранения данных, и мне нужно экспортировать данные в новый формат.

Открытие базы данных с помощью MS Access (Windows) или MDBViewer (Linux), в полях типа «MEMO» (эквивалент TEXT в mysql) все, что я вижу, - это мусор, напоминающий азиатские символы. При запуске устаревшего приложения содержимое полей отображается корректно.

Есть ли способ, которым я могу попробовать каждую возможную кодировку символов и преобразовать ее для восстановления данных (мне комфортно с PHP и C #)? Я читал что-то о спецификации (маркер порядка байтов), что может быть связано, какие-нибудь идеи?

Спасибо!

1 Ответ

2 голосов
/ 17 января 2011

Текущие версии MS Access используют UTF-8 для хранения строковых значений.Более старые просто следовали кодовой странице машины, на которой был введен текст.

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

Быстрые проверки

UTF-8

Если есть маркер, это будет $EFBBBF.Если нет, вы можете предположить, что это UTF-8, когда в строке можно увидеть последовательности символов ASCII (0-127).

UTF-16

Поставляется в двух вариантах: Little Endian (LE) и Big Endian (BE).Для символов в базовой многоязычной плоскости оба используют два байта на символ.Разница между ними заключается в том, что для символов ASCII один начинается с нулевого байта, а другой заканчивается им.

Если есть маркер, UTF-16LE обозначается $FFFE, а UTF-16BE - $FEFF.Если ни один из этих маркеров не имеет наличия чередующихся нулевых и ненулевых байтов в поле memo, то это правильное указание.И ваша первая ставка должна быть UTF-16LE, так как это стандарт Windows, а UTF-16BE используется гораздо реже.(Извините, никогда не могу вспомнить, какой из двух начинается с нулевого байта для символов ASCII, а какой начинается с ненулевого байта).

Прочее

Если вы можете исключить UTF-8 и UTF-16, вы можете попытаться выяснить, использовалось ли одно из других кодировок UTF.Хотя я бы не стал тратить время, скорее всего, программа просто полагалась на кодовую страницу машины.Поскольку вы имеете дело со многими «азиатскими» символами, лучше всего было бы проверить кодовые страницы MBCS (многобайтовые символы S - кодовые страницы).Смотрите MSDN для более подробной информации.Поскольку я никогда не имел дело с ними сам, я боюсь, что здесь я не смогу помочь.

Попытка кодирования

Если вам нужно начатьпробуя каждую имеющуюся кодировку, вы можете взглянуть на библиотеку DIConvertors.Это очень хорошо конвертировать между кодировками.IIRC также может распознавать кодировки, но в противном случае это должно помочь вам начать с вашего собственного обнаружения.Его можно найти на http://www.yunqa.de/delphi/doku.php/products/converters/index

...