即使我的文件是有效的 utf-8 编码文件,pandoc 也会抱怨 utf-8 解码错误

jdh*_*hao 7 unicode bash utf-8 character-encoding pandoc

我正在尝试使用pandocWindows 系统将 Markdown 文件转换为 pdf 。由于我的 markdown 包含汉字,所以我使用以下命令来生成 pdf:

pandoc --pdf-engine=xelatex -V CJKmainfont=KaiTi test.md -o test.pdfbut
Run Code Online (Sandbox Code Playgroud)

但是 pandoc 抱怨该文件包含它无法处理的非 utf8 字符,确切的错误消息是:

生成 PDF 时出错。
!未定义的控制序列。
pandoc.exe:无法解码字节“\xae”:>Data.Text.Internal.Encoding.streamDecodeUtf8With:UTF-8 流无效

根据我在互联网上找到的内容。这主要是由于markdown文件的编码,可能与pandoc无关。我的文件包含很多汉字和英文字符。我已将其转换为 utf-8 编码。

我尝试过但没有成功的事情

非 utf8 字符的 Grep

按照此处此处的说明进行操作。我已验证系统区域设置为 UTF-8,输出localectl status为:

   System Locale: LANG=en_US.UTF-8
       VC Keymap: us
      X11 Layout: us
Run Code Online (Sandbox Code Playgroud)

我试图 grep 非 utf8 字符。使用的命令是grep -axv '.*' test.md. 但是命令什么也没输出。(我认为这意味着没有 utf-8 无法解码的无效字符。)

尝试丢弃无效字符

我按照此处的说明尝试从我的文件中删除非 utf8 字符。我使用的命令是:

iconv -f utf-8 -t utf-8 -c test.md > output.md
Run Code Online (Sandbox Code Playgroud)

之后,当我尝试output.md使用 .pdf转换为 pdf 时pandoc。我仍然遇到相同的错误消息,这表明该文件仍然包含非 utf8 字符。

我的问题

如何查明文件的哪一部分导致了问题,或者如何真正从文件中删除非 utf8 字符,以便我可以错误地编译它?

其他信息

  • 你可以在这里找到 markdown 文件。

  • If you are using Linux system, you may need to set CJKmainfont to other valid Chinese font name in your system.

jdh*_*hao 5

该问题是由于在 markdown 中使用反斜杠而不转义造成的。Pandoc 将反斜杠后跟 Markdown 中的文本视为 LaTeX 命令。使用以下命令生成pdf:

pandoc -f markdown-raw_tex --pdf-engine=xelatex -V CJKmainfont=KaiTi test.md -o test.pdf
Run Code Online (Sandbox Code Playgroud)

然后错误消失,可以成功生成pdf文件。

跟进

多亏了tex.stackexchange中的高手,终于找到原因了。本质上,如果在处理 tex 文件期间遇到无效的控制序列,则 xelatex 将产生无效的 utf-8 序列。有关更多信息,请参阅此处此处

更新 2017.12.29
随着Pandoc 2.0.6发布,这种行为得到了更妥善的处理:

允许对 Latex 错误日志进行宽松解码,这些日志并不总是正确的 UTF8 编码

现在,可以更轻松地调试此类问题。