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.md.pandoc

내 질문

놀랍게도 위의 방법은 작동하지 않습니다. 파일의 어느 부분이 문제를 일으키는지 확인하는 방법 또는 해결 방법진짜오류 없이 컴파일되도록 파일에서 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

백슬래시로 시작하는 텍스트를 왜곡하려면 백슬래시를 사용하거나(항상 필요한 것은 아님) 백슬래시 두 개만 사용하십시오.

몇 가지 아이디어

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 오류 로그의 느슨한 디코딩을 허용합니다.

이제 이러한 문제를 디버깅하는 것이 더 쉬워졌습니다.

답변2

pandoc바이트 \xbd(16진수 "bd")에 대해 불평하므로 grep. 예를 들어

grep -n $'\xbd' file 

예를 들어, 4줄로 구성된 작은 파일을 생성하면 줄 중 하나에 다음 \xbd문자가 포함됩니다.

a
b
d

그런 다음 grep -n라인 3에 있음을 알려줍니다.

$ grep -n $'\xbd' file 
3:c½

참고: $'\xbd'bash와 같은 UNIX 쉘이 필요합니다. '를 보고 man bash검색하세요.인용하다"더 알아보기.


그런데 이 \xbd문자는 확장된 ASCII 문자입니다. 손상된 유니코드 시퀀스일 수 있습니다(많은 유니코드 문자에는 0xbd해당 바이트 값 중 하나가 있음). 내 화면에는 "1/2" 분수가 표시됩니다. ascii이에 대한 몇 가지 생각은 다음과 같습니다 .

$ ascii bd
ASCII 11/13 is decimal 189, hex bd, octal 275, bits 10111101: meta-=

관련 정보