如何读取未知编码(FDF)的文件

时间:2019-05-14 04:43:23

标签: r encoding

我有this个文件。它是纯文本文件。 我正在尝试找到一种方法,将该文件简单地读入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看起来像是这些字符的latin1代码,因此我所看到的很有意义。但是我也知道那不应该是我所看到的。

由于readLines的输出从一开始就被截断了,因此无论如何都无法重新创建相同的文件,但是我的最终目标是能够操纵该文件,因此我需要对什么内容有更深入的了解。继续。

我还尝试了各种文本编辑器使用不同的编码选项(“ UTF-8”,“ UTF-16”,“ Western”)打开文件,但是这些似乎都没有显示文件的样子。因此,问题是我如何读取/写入此文件和/或可以采取哪些步骤来帮助我对其进行解码

编辑:如果我尝试使用skipNul命令跳过嵌入的nul,则截断问题已解决,但仍然留下了我无法回写的怪异编码到文件

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 个答案:

答案 0 :(得分:2)

文件的编码是混合的。

大多数PDF似乎在latin1中,因为第一个字符应为“%âãÏÓ”。 (请参阅:PDF File header sequence: Why '25 e2 e3 cf d3' bits stream used in many document?

但是,“ / V”命令中的文本使用UTF-16 little endian编码。 “ fe ff”字节实际上是文本的字节顺序标记。

您可能需要使用readBin并将字节转换为正确的编码。 PDF解析起来很可怕。

请参阅此http://stat545.com/block034_useR-encoding-case-study.html帖子,了解如何使用readBin读取混合编码的文件。 iconv函数对于编码转换也可能很有用