Как прочитать файл с неизвестной кодировкой (FDF) - PullRequest
2 голосов
/ 14 мая 2019

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

Проблема заключается в строке 9, где предполагалось прочитать что-то вроде

/V (½ þ ¾ → ‘ ’ ” “ •)

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

readLines('https://github.com/oganm/toSource/raw/master/cant_read.fdf',
          encoding = 'UFT-8')

Я получаю предупреждение

Warning message:
In readLines("https://github.com/oganm/toSource/raw/master/cant_read.fdf",  :
  line 9 appears to contain an embedded nul

и строка 9 выглядит усеченной и закодированной странным образом.

readLines('https://github.com/oganm/toSource/raw/master/cant_read.fdf',
          encoding = 'UTF-8')[9]
[1] "/V (\xfe\xff"

Если я использую другую опцию latin1, я получаю неправильные символы вместе с тем же предупреждением

readLines('https://github.com/oganm/toSource/raw/master/cant_read.fdf',
          encoding = 'latin1')[9]
[1] "/V (þÿ"

Глядя на отношения между двумя версиями, \xfe\xff выглядит как латинские коды для этих символов, так что имеет смысл, что это то, что я вижу. Однако я также знаю, что это не то, что я вижу.

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

Я также пробовал разные текстовые редакторы, чтобы открыть файл, используя разные опции кодирования («UTF-8», «UTF-16», «Western»), но ни один из них, кажется, не показывает файл таким, какой он есть. Итак, вопрос как я могу прочитать / написать этот файл и / или какие шаги я могу предпринять, чтобы помочь мне расшифровать его

Редактировать: Если я попытаюсь пропустить вставленный nul с помощью команды skipNul, проблема усечения будет решена, но у меня все еще остается странная кодировка, которую я не могу записать обратно в файл

readLines('https://github.com/oganm/toSource/raw/master/cant_read.fdf',
          encoding = 'UTF-8',skipNul=TRUE)[9]
[1] "/V (\xfe\xff\xbd \xfe \xbe !\x92  \030  \031  \035  \034  \")"
readLines('https://github.com/oganm/toSource/raw/master/cant_read.fdf',
          encoding = 'latin1',skipNul=TRUE)[9]
 "/V (þÿ½ þ ¾ !’  \030  \031  \035  \034  \")"

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

Примечание: Отображаемое þ не связано с фактическим þ в файле. Я на самом деле добавил þ позже, чтобы посмотреть, как это повлияет на вывод. Это ничего не изменило, что означает, что усечение происходит при кодировании ½, и данные, которые мы можем прочитать, вероятно, являются частью ½.

1 Ответ

2 голосов
/ 14 мая 2019

Кодировка файла смешанная.

Большая часть PDF, кажется, находится на латинице 1, так как первые символы должны быть "% âãÏÓ". (См .: Последовательность заголовков файлов PDF: почему поток битов '25 e2 e3 cf d3' используется во многих документах? )

Однако текст в команде "/ V" закодирован в UTF-16 с прямым порядком байтов. Байт "fe ff" на самом деле является меткой порядка байтов текста.

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

См. Этот http://stat545.com/block034_useR-encoding-case-study.html пост о том, как читать файлы со смешанной кодировкой, используя readBin. Функция iconv также может быть полезна для преобразования кодировки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...