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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了即使我的文件是有效的utf-8编码文件,pandoc也会抱怨utf-8解码错误相关的知识,希望对你有一定的参考价值。

我想在Windows系统上使用pandoc将markdown文件转换为pdf。由于我的markdown包含中文字符,我使用以下命令来生成pdf:

pandoc --pdf-engine=xelatex -V CJKmainfont=KaiTi test.md -o test.pdfbut

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

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

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

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

Grep for the non-utf8 character

按照指示herehere。我已经验证系统区域设置为UTF-8,localectl status的输出为:

   System Locale: LANG=en_US.UTF-8
       VC Keymap: us
      X11 Layout: us

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

Try to discard invalid characters

我按照指令here尝试从我的文件中删除非utf8字符。我使用的命令是:

iconv -f utf-8 -t utf-8 -c test.md > output.md

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

我的问题

如何确定文件的哪个部分导致问题或如何从文件中真正删除非utf8字符,以便我可以编译错误?

其他信息

  • 你可以找到降价文件here
  • 如果您使用的是Linux系统,则可能需要将CJKmainfont设置为系统中其他有效的中文字体名称。
答案

问题是由于在没有转义的情况下在markdown中使用反斜杠引起的。 Pandoc处理反斜杠后跟markdown中的文本作为LaTeX命令。使用以下命令生成pdf:

pandoc -f markdown-raw_tex --pdf-engine=xelatex -V CJKmainfont=KaiTi test.md -o test.pdf

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

跟进

感谢tex.stackexchange中的大师,最终找到了原因。本质上,它是xelatex,如果在处理tex文件期间遇到无效的控制序列,它将产生无效的utf-8序列。有关更多信息,请参阅herehere

更新2017.12.29 使用release of Pandoc 2.0.6,可以更好地处理此行为:

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

现在,调试此类问题更容易。

以上是关于即使我的文件是有效的utf-8编码文件,pandoc也会抱怨utf-8解码错误的主要内容,如果未能解决你的问题,请参考以下文章

用于编码 ASCII 的不可映射字符,但我的文件是 UTF-8

如何在 Scala 或 Java 中读取具有混合编码的文本文件?

EditPlus输入中文乱码,以前是好的,且设置了文件编码为UTF-8

什么是文本编码最有效的二进制文件?

APNS 是不是理解 UTF-8 编码的有效负载

编码声明:是coding:utf-8还是coding=urf-8