pandocは、utf8以外の文字がないように見えますが、utf8以外の文字について文句を言い続けます。

pandocは、utf8以外の文字がないように見えますが、utf8以外の文字について文句を言い続けます。

マークダウンファイルをPDFに変換しようとしていますpandoc。私のマークダウンには中国語の文字が含まれているので、次のコマンドを使用してPDFを生成します。

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

しかし、pandocは、ファイルに処理できないutf8以外の文字が含まれていると文句を言います。正確なエラーメッセージは次のとおりです。

PDFの生成中にエラーが発生しました。
!未定義の制御順序。
pandoc.exe: バイト '\xbd' をデコードできません: >Data.Text.Internal.Encoding.streamDecodeUtf8With: 無効な UTF-8 ストリーム

インターネットで見つけた情報に基づいて作成しました。これは主にマークダウンファイルのエンコードによるものであり、おそらくpandocとは関係ありません。私のファイルには中国語と英語の文字がたくさん含まれています。 utf-8エンコーディングに変換しました。

試してみたが成功しなかったこと

ファイルをCentOSサーバーに転送し、間違った文字がある場所を見つけたか、間違った文字を削除してみました。しかし、成功しませんでした。

utf8 以外の文字を探す Grep

指示に従うここそしてここ(実際には両方の記事で複数の回答を試しましたが、うまくいきませんでした。)システムロケールがUTF-8に設定され、出力が次のようになっていることを確認しましたlocalectl status

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

utf8以外の文字を見つけるためにgrepを試みます。使用されるコマンドはですgrep -axv '.*' test.md。ただし、コマンドは何も出力しません。 (これはutf-8でデコードできない無効な文字がないことを意味すると仮定します。)

無効な文字を削除してみてください。

私は指示に従った。ここ私のファイルからutf8以外の文字を削除しようとしています。私が使用するコマンドは次のとおりです。

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

後で。output.mdpandoc

私の質問

驚くべきことに、上記の方法は機能しません。ファイルのどの部分が問題を引き起こしているかを確認する方法または回避策本物エラーなしでコンパイルされるように、ファイルからutf8以外の文字を削除しますか?

その他の情報

  • マークダウンファイルを見つけることができますここ

  • CJKmainfontLinuxシステムを使用している場合は、システムの他の有効な中国語フォント名に設定する必要があります。

  • LinuxシステムでMarkdownの中国語テキストを含むPDFを生成するコマンドは次のとおりです(フォントを有効なフォントに変更)。

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

ベストアンサー1

まあ、長い間問題を解決するために戦い、掘り下げた後。ついに問題の根本原因を見つけました。

理由

問題は、test.mdバックスラッシュで始まるテキストが実際にリテラルとして扱われるべきいくつかの場所に存在することです。例えば、

* 一般现在时\过去时\将来时,simple present\past\future
* 现在(过去\将来)进行时,present(past\ future) continuous
* 现在(过去\将来)完成时,present(past\future) perfect
* 现在(过去\将来)完成进行时,present(past\future) perfect continuous

上記の段落のバックスラッシュは、さまざまな状況間の区切り記号にすぎません。これは効果的な値下げです。しかし、残念ながら、それらはpandocコマンドによって処理されます。

解決策

代わりに、次のコマンドを使用してください。

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

バックスラッシュで始まるテキストを歪めるには、バックスラッシュを使用するか(必ずしも必要ではない)、2つのバックスラッシュを使用してください。

いくつかのアイデア

Pandocのエラーメッセージは、問題がUTF-8デコードに関連していないため、誤解を招く可能性があります。なぜこのようなエラーメッセージが表示されるのかわかりません。

また、この問題に関するエラーメッセージは一貫性がないようです。たとえば、上記のテキストにバックスラッシュが含まれているとします。次のようにコンパイルすると

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

エラーメッセージは次のようになります。

PDFの生成中にエラーが発生しました。
!未定義の制御順序。
l.75単純現在時刻\過去時間

これにより、utf-8関連の問題を掘り下げるよりも問題のある場所を見つけるのがはるかに簡単になります。

フォローアップ

これは実際にxelatexのバグです。誤った制御シーケンスが見つかった場合、誤ったUTF-8バイトが生成される可能性があります。しかし、pandocは有効なutf-8シーケンスを受け取ると仮定します。したがって、エラーが発生しました。詳しくはこちらをご覧くださいこの投稿

2017.12.29 更新
とともに読み取り2.0.6リリース、この動作はより適切に処理されます。

UTF8で常に正しくエンコードされていないLatexエラーログの緩いデコードを可能にします。

これで、これらの問題をデバッグする方が簡単になりました。

おすすめ記事