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 编码。
按照此处和此处的说明进行操作。我已验证系统区域设置为 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.
该问题是由于在 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 编码
现在,可以更轻松地调试此类问题。