PDF で日本語の漢字が中国語の字形になる原因と直し方

要点

日中韓の漢字の多くは同じ Unicode 符号位置を共有していますが、地域ごとに字形が異なるものがあります。日本語の文書に中国語フォントが使われると、漢字が中国語の字形で表示されます。文書の言語に合ったフォントを指定するか、lang="ja" で言語を明示すれば直ります。

症状

直 骨 角 化 海 説 写 次 今 令 を Noto Sans SC・TC・JP・KR で表示した比較
同じ文字を 4 つの地域フォント(Noto Sans SC・TC・JP・KR)で表示。直・骨・角・化・令に注目。
Pandoc で Microsoft YaHei と Yu Gothic を指定して出力した日本語
Pandoc + xelatex で日本語を出力:CJKmainfont="Microsoft YaHei"(中国語の字形)と "Yu Gothic"(日本語の字形)。

原因

Unicode ではこれらの漢字が統合されているため、文字コードだけでは地域の字形が決まらず、フォントが字形を決めます。文書に言語情報がないと、ツールは最初に見つかった CJK フォント(中国語環境では中国語フォント、または文書全体に指定されたフォント)を使います。

日本語フォントで日本語のサンプルを開く

日本語サンプルを開く

各ツールでの対処法

  • Pandoc + xelatex:日本語用フォントを指定します。例:-V CJKmainfont="Yu Gothic"(Windows)、"Hiragino Sans"(macOS)、"Noto Sans CJK JP"。検証:Microsoft YaHei から 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 では

⚙ 設定でフォントを「Noto Sans 日本語」にしてください。lang="ja"・lang="ko"・lang="zh-TW"・lang="zh-CN" を付けた部分は、プレビューでも 2 種類の PDF でも、自動的にその地域の Noto フォントに切り替わります。

よくある質問

Unicode の不具合ですか?

いいえ。漢字の統合は意図された仕様で、地域の字形は言語タグとフォントで決まります。

どの漢字が違いますか?

多くは細かな画の違いです。直・骨・角・化・海・令・次・写・今などは分かりやすい例です。一つひとつは小さな違いでも、読み手にはすぐ分かります。

一つのフォントで全地域の字形を出せますか?

Noto Sans CJK / 源ノ角ゴシックのような汎 CJK フォントには全字形が入っていますが、正しい字形を選ぶには言語タグ(または地域別のフォント名)が必要です。