1

У меня есть текстовый файл, в котором все символы ASCII отображаются правильно, а некоторые другие нет. В частности, есть это слово:

don‰Ûªt

В шестнадцатеричном формате байты составляют 64 6f 6e 89 db aa 74 . Очевидно, что почти наверняка ‰Ûª должен быть вьющимся апострофом, вероятно, U+02BC, U+2019 или U+0092 . [ Отредактировано, чтобы добавить: Основываясь на копировании правильного апострофа из PDF, который содержит тот же текст, я теперь вполне уверен, что это U+2019. ]

Эта веб-страница говорит

Если последовательность битов не имеет смысла (для человека) в какой-либо кодировке, документ, скорее всего, в какой-то момент был преобразован неправильно. ... Если документ был неверно истолкован и преобразован в другую кодировку, он поврежден. Попытка "починить" это может или не может быть успешным, обычно это не так. Любое ручное переключение битов или другое кодирование вуду - это, в основном, вуду.

Но, безусловно, я должен быть в состоянии выяснить, что случилось с моим файлом, учитывая, что я знаю байты и знаю, какой символ они должны означать. Может кто-нибудь сказать мне, как решить, как файл поврежден, и как это исправить?

1 ответ1

2

Может кто-нибудь сказать мне, как выяснить, как файл был поврежден, ...

Я не могу, но, возможно, вам повезет.

Учитывая скремблированную конфигурацию кубика Рубика, очень легко отработать набор ходов, чтобы вернуть его в исходное состояние. Обычно невозможно определить, какие ходы использовались, чтобы прийти в зашифрованное состояние - потому что число возможных последовательностей ходов огромно.

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

0x89 не является допустимым первым байтом для трехбайтовой кодировки UTF8 символа. 0xDBAA - арабский пустой центральный нижний стоп. Что, конечно, неправдоподобно. Возможно, UTF8 был неверно истолкован как некоторая 8-битная кодировка, а затем сохранен как другая 8-битная кодировка. Если файл был рядом с Японией, вы можете добавить в микс некоторые злоупотребления JIS, Shift-JIS и EUC.

Может быть, есть дюжина правдоподобных символов Юникода и, возможно, большее количество вероятных 8-битных и 16-битных кодировок. Это слишком много перестановок, чтобы попробовать вручную. Если бы это было достаточно важно, я, возможно, написал бы код, чтобы попробовать все перестановки начального символа плюс две скремблирования и посмотреть, дойдут ли они до 0x89DBAA.

Статистически я ожидаю, что наиболее вероятный сценарий - это нечто почти, но не совсем отличное:

  1. Создайте текстовый файл UTF8 без спецификации (как рекомендует консорциум Unicode).
  2. Прочитайте этот файл с помощью MS-Windows Notepad в локали «Windows-Latin-1». Блокнот неправильно воспринимает UTF8 как CP-1252, отчасти потому, что UTF-8 не имеет метки порядка байтов и потому что многие инструменты Microsoft злоупотребляют / неправильно используют метку порядка байтов в качестве индикатора кодировки.
  3. Сохранить файл как "Юникод". Блокнот использует неверную терминологию Microsoft и переводит то, что он считает CP-1252, в UTF-16 с прямым порядком байтов (с спецификацией)

Но это слишком просто (так что я не пробовал).

Я уверен, что ответ будет ослепительно очевидным в ретроспективе. Но это маленький комфорт сейчас.

... и как это исправить?

Учитывая, что единственным раскрытым контентом является английское слово don't мы не можем сделать вывод, что все данные на 95% ASCII. Это делает возможным использование ручного осмотра ...

  1. Составьте список всех различных последовательностей gobbledegook и вероятных замен, начиная с 0x89dbaa -> ' .

  2. Используйте байтово-ориентированный инструмент (например, sed) для выполнения этих замен.

  3. ???

  4. Прибыль!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .