使用Pandoc批量转换中文docx为md时汉字变问号的求助
问题场景
你在PowerShell脚本中调用Pandoc批量转换中文Docx文档到Markdown时,出现所有汉字变为问号“?”的异常,但相同命令处理英文文档完全正常。你最初尝试添加--latex-engine=xelatex、-V CJKmainfont="Microsoft YaHei"等参数,但发现这些是PDF转换专用参数,对Markdown转换无效甚至会中断流程。
根因定位
经过你的排查,问题并非出在Pandoc本身——Pandoc原生支持中文Docx到Markdown的编码转换,只要Docx文件本身编码正常,你最初的Pandoc命令就能输出正确的中文内容。真正的问题是脚本中后续的查找/替换等字符串处理操作没有兼容中文Unicode编码,导致中文文本被破坏,最终显示为问号。
具体解决步骤
隔离验证Pandoc本身的输出
先单独运行你的Pandoc命令转换一个中文Docx文件,直接检查输出的Markdown内容,确认Pandoc本身能正常处理中文:pandoc.exe -f docx -t markdown-simple_tables-multiline_tables-grid_tables+pipe_tables -i "你的测试文档.docx" -o "测试输出.md" --wrap=none --atx-headers --extract-media="./media"排查脚本中的文本处理逻辑
找到脚本中所有对转换后Markdown文件进行读取、修改、写入的代码段,重点检查:- 是否在读取/写入文件时未指定正确的编码(PowerShell默认编码可能不兼容UTF-8)
- 是否使用了仅支持ASCII的正则表达式或字符串替换规则
- 是否有字符串截断、编码转换类的操作破坏了中文文本
修正编码相关的脚本操作
在处理中文文本时,务必明确指定UTF-8编码,避免编码错乱:# 读取Markdown文件时指定UTF-8编码 $mdContent = Get-Content "测试输出.md" -Encoding UTF8 # 执行你的查找/替换操作(确保操作兼容Unicode) $mdContent = $mdContent -replace "旧文本", "新文本" # 写入文件时同样指定UTF-8编码 $mdContent | Set-Content "最终输出.md" -Encoding UTF8验证正则表达式的兼容性
如果使用正则表达式处理文本,避免使用仅匹配ASCII的规则(比如[a-z]),改用支持Unicode的模式,比如匹配中文字符可以用\p{Han}:# 示例:提取所有中文字符片段 $chineseSegments = [regex]::Matches($mdContent, "\p{Han}+")
额外提示
Pandoc在转换Docx到Markdown时,会自动保留原文档的编码信息,不需要额外添加中文相关参数。遇到编码类问题时,优先排查脚本中后续的文本处理环节,而不是调整Pandoc的转换参数。
内容的提问来源于stack exchange,提问作者nickchomey

