即使我的文件是有效的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
按照指示here和here。我已经验证系统区域设置为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.md
将pandoc
转换为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序列。有关更多信息,请参阅here和here。
更新2017.12.29 使用release of Pandoc 2.0.6,可以更好地处理此行为:
允许对乳胶错误日志进行宽松解码,这些日志并不总是正确地进行UTF8编码
现在,调试此类问题更容易。
以上是关于即使我的文件是有效的utf-8编码文件,pandoc也会抱怨utf-8解码错误的主要内容,如果未能解决你的问题,请参考以下文章
用于编码 ASCII 的不可映射字符,但我的文件是 UTF-8
如何在 Scala 或 Java 中读取具有混合编码的文本文件?