마크다운 파일을 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이 아닌 문자를 제거하시겠습니까?
기타 정보
마크다운 파일을 찾을 수 있습니다여기.
CJKmainfont
Linux 시스템을 사용하는 경우 시스템의 다른 유효한 중국어 글꼴 이름으로 설정해야 할 수도 있습니다 .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
c½
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-=