Может кто-нибудь сказать мне, как выяснить, как файл был поврежден, ...
Я не могу, но, возможно, вам повезет.
Учитывая скремблированную конфигурацию кубика Рубика, очень легко отработать набор ходов, чтобы вернуть его в исходное состояние. Как правило, невозможно определить, какие ходы использовались для достижения зашифрованного состояния, поскольку число возможных последовательностей ходов огромно.
Ваша проблема похожа. Частично потому, что вы не даете подсказок о платформах, локалях и инструментах, которые могли быть использованы для создания этого текстового файла.
0x89 не является допустимым первым байтом для трехбайтовой кодировки UTF8 символа. 0xDBAA - арабский пустой центральный нижний стоп. Что, конечно, неправдоподобно. Возможно, UTF8 был неверно истолкован как некоторая 8-битная кодировка, а затем сохранен как другая 8-битная кодировка. Если файл был рядом с Японией, вы можете добавить в микс некоторые злоупотребления JIS, Shift-JIS и EUC.
Может быть, есть дюжина правдоподобных символов Юникода и, возможно, большее количество вероятных 8-битных и 16-битных кодировок. Это слишком много перестановок, чтобы попробовать вручную. Если бы это было достаточно важно, я, возможно, написал бы код, чтобы попробовать все перестановки начального символа плюс две скремблирования и посмотреть, дойдут ли они до 0x89DBAA.
Статистически я ожидаю, что наиболее вероятный сценарий - это нечто почти, но не совсем отличное:
- Создайте текстовый файл UTF8 без спецификации (как рекомендует консорциум Unicode).
- Прочитайте этот файл с помощью MS-Windows Notepad в локали «Windows-Latin-1». Блокнот неправильно воспринимает UTF8 как CP-1252, отчасти потому, что UTF-8 не имеет метки порядка байтов и потому что многие инструменты Microsoft злоупотребляют / неправильно используют метку порядка байтов в качестве индикатора кодировки.
- Сохранить файл как «Юникод». Блокнот использует неверную терминологию Microsoft и переводит то, что он считает CP-1252, в UTF-16 с прямым порядком байтов (с спецификацией)
Но это слишком просто (так что я не пробовал).
Я уверен, что ответ будет ослепительно очевидным в ретроспективе. Но это маленький комфорт сейчас.
... и как это исправить?
Учитывая, что единственным раскрытым контентом является английское слово, don't
мы можем сделать вывод, что все данные на 95% ASCII . Это делает возможным использование ручного осмотра ...
Составьте список всех различных последовательностей gobbledegook и вероятных замен, начиная с
0x89dbaa
->'
.Используйте байтово-ориентированный инструмент (например
sed
), чтобы сделать эти замены.???
Прибыль!