PDF 里日文汉字显示成中文字形?汉字地区字形的原因与修法

简短回答

中日韩大部分汉字共用同一个 Unicode 编码,但各地区的写法有差别。PDF 工具如果用中文字体排日文(或反过来),就会显示错误的字形。修法是按文档语言选择字体,或用 lang="ja" / lang="ko" 标注段落,让工具自动切换字体。

症状

直 骨 角 化 海 説 写 次 今 令 在 Noto Sans SC、TC、JP、KR 中的写法
同样的字,四种地区字体(Noto Sans SC、TC、JP、KR)。注意 直、骨、角、化、令。
Pandoc 分别用微软雅黑和 Yu Gothic 输出的日文
用 Pandoc + xelatex 导出日文:CJKmainfont="Microsoft YaHei"(中文字形)与 "Yu Gothic"(日文字形)。

原因

Unicode 对这些汉字做了“统一编码”,编码本身不区分地区写法,由字体决定。文档里没有语言信息时,工具会使用排在最前面的中日韩字体:在中文系统上常常是中文字体,或者整篇文档设定的那款字体。

用日文字体打开日文示例

打开日文示例

在原工具中的修法

  • Pandoc + xelatex:按文档语言设置字体,日文可用 -V CJKmainfont="Yu Gothic"(Windows)、"Hiragino Sans"(macOS)或 "Noto Sans CJK JP"。实测:从微软雅黑换成 Yu Gothic 后,字形如上图所示变为日文写法。
  • 基于 HTML / Chromium 的工具(实测 md-to-pdf;VS Code Markdown PDF 和 Typora 同样基于 Chromium/Electron,未实测):标注语言。使用 <span lang="ja">…</span> 或 <html lang="ja"> 后,Chromium 会选用日文字体;md-to-pdf 把测试文件中 lang="ja" 的那一行渲染成了日文字形。也可以在 font-family 里把对应地区的字体放在最前面。
  • 多语言混排:每种语言放进各自的 lang 标签(LaTeX 中为每种语言设置单独的字体族)。
日本語の段落:<span lang="ja">直 骨 角 化</span>
中文段落:<span lang="zh-CN">直 骨 角 化</span>

在 MarkPDF 中

在 ⚙ 设置中按文档语言选择字体(日文、韩文、简体或繁体中文)。用 lang="ja"、lang="ko"、lang="zh-TW"、lang="zh-CN" 标注的段落会自动切换为对应地区的 Noto 字体,预览和两种 PDF 都一样。

常见问题

这是 Unicode 的问题吗?

不是。汉字统一编码是有意的设计,地区写法由语言标记和字体决定。

哪些字有差别?

很多,通常是细微笔画:直、骨、角、化、海、令、次、写、今 都比较明显。单个差别不大,但母语读者一眼就能看出来。

有没有一款字体能显示所有地区写法?

Noto Sans CJK / 思源黑体这类泛中日韩字体包含所有写法,但仍需要语言标记(或地区字体名)来选择正确的那一套。

相关指南