WSL で Windows Terminal を使っていると、英語はきれいな等幅なのに、日本語だけ幅が広すぎて桁がズレることがあります。原因はフォントで、直し方も単純です。さらに私は日本語・ベトナム語・英語を混ぜて書くので、その視点で合成フォントを比べたところ、思わぬ落とし穴(あるフォントがベトナム語を全角で描く)を見つけました。検証環境は WSL2(Ubuntu 24.04)+ Windows Terminal です。
執筆について: この記事は Claude Code が執筆し、筆者がレビューしました。スクリーンショットは Claude Code がヘッドレス Chrome で描画・計測したものです。
症状: 日本語だけ幅が広すぎる
英語と記号はぴったり等幅の格子に乗っているのに、日本語(と罫線・絵文字)の全角文字だけが、ラテン文字 1 セルの 2 倍より広く描かれて、列が右にズレていきます。全角は本来「半角ちょうど 2 個ぶん」のはずが、それより太いのです。
原因: CJK グリフが無く、別フォントへフォールバックしている
きっかけは既定フォントの CaskaydiaCove Nerd Font Mono(Cascadia Code に Nerd Font のアイコンを足したもの)でした。ラテン文字とアイコンはそろっていますが、日本語のグリフを一切持っていません。そのため Windows Terminal が、かな・漢字だけを別のシステム日本語フォント(Yu Gothic / MS Gothic / Meiryo など)へ自動フォールバックします。このフォールバック先のグリフ幅が、ラテン 1 セルのちょうど 2 倍に一致しないため、等幅の格子が崩れます。
なお、フェイス名にフォールバックを書き足す("CaskaydiaCove Nerd Font Mono, Yu Gothic" のように並べる)方法では直りません。これは「どのフォントで欠けたグリフを埋めるか」を変えるだけで(Windows Terminal は黙って同じことを既にやっています)、描かれる幅は元のままだからです。幅のズレそのものが問題なので、フォールバックの連鎖では解決しません。
解決: 半角:全角=1:2 の合成フォントに変える
直し方は、「半角ラテン 1 セル = 全角 CJK のちょうど半分」になるよう設計された合成フォント(コーディング向けに英語フォントと日本語フォントを 1:2 比で混ぜたもの)を 1 つ使うことです。Nerd Font 入りを選べば、プロンプトのアイコン( )もそのまま使えます。私は UDEV Gothic NF を選びました。JetBrains Mono + BIZ UDGothic の合成で、字形がいちばん素直でした。リガチャ(-> などの合字)が欲しい場合は UDEV Gothic NFLG を使います。
インストールは管理者権限も再起動も不要です。
-
UDEV Gothicの GitHub Releases から*_NFの zip を落とす → 解凍 -
.ttfをユーザー単位のフォントフォルダ%LOCALAPPDATA%\Microsoft\Windows\Fonts\に入れる(各.ttfを右クリック → インストール、でも可) - Windows Terminal の設定
settings.jsonでフェイスを指定
"profiles": {
"defaults": {
"font": { "face": "UDEV Gothic NFLG", "size": 14 }
}
}
defaults に書けば全プロファイルに効きます。あるプロファイルが weight だけ上書きしていても、face は defaults を継承します。settings.json はホットリロードされるので、効かなければタブを開き直しましょう。
確認は、全角文字の行をラテン文字の定規の下に並べて、「あ」一文字が M 二文字ぶんにきっちり収まるか見るだけです。
日本語・ベトナム語・英語を混ぜると、フォントで差が出る
ここからが本題です。私はベトナム語(ラテン文字+声調記号の積み重ね)も書くので、候補の合成フォント 4 つ(UDEV Gothic NF、HackGen Console NF、PlemolJP Console NF、Cica)でベトナム語も並べて比べました。結論から言うと、UDEV Gothic NF / UDEV Gothic NFLG と PlemolJP Console NF は、日本語・ベトナム語・英語のどれも等幅の格子にきれいに乗ります。
注意が要るのは HackGen Console NF です。まず、どのフォントもベトナム語のグリフ自体は持っています。声調つき母音の合成済みコードポイント U+1EA0–U+1EF9(ế ằ ữ ị ộ ở …)を 90/90 すべて cmap に含んでいました。つまり「文字が無くて豆腐になる」問題ではありません。
差が出るのは East Asian Width(東アジアの文字幅)の扱いです。HackGen Console NF だけがベトナム語の合成済み母音を Wide(全角)扱いにするため、1 文字が 2 セルぶんの幅を取り、単語の途中に隙間が空いて崩れます(ph ở Vi ệ t のように散らばる)。半角の定規(M と数字)の下に並べると一目瞭然で、ếằữịổờ の行だけが定規の右端を大きくはみ出します。
-
UDEV Gothic NF/UDEV Gothic NFLG→ ベトナム語の母音も半角。日本語・ベトナム語・英語すべて格子に乗る。安全。 -
PlemolJP Console NF→ 同じく半角で安全。UDEV Gothicの対抗馬。 -
HackGen Console NF→ ベトナム語の母音が全角になり、単語が崩れる。日本語+ベトナム語には不向き。 -
Cica→ 半角で格子は崩れないが、字形が軽め・丸めで好みが分かれる。
グリフの有無(カバレッジ)ではなく、フォントが各文字に割り当てる幅クラスの違いだ、という点がハマりどころでした。日本語だけ、あるいは英語だけで選ぶと気づきません。
結論
日本語・ベトナム語・英語を混ぜて書くなら、UDEV Gothic NFLG(リガチャ不要なら UDEV Gothic NF)が素直です。PlemolJP Console NF も同等に良い対抗馬です。HackGen Console NF はベトナム語の全角化があるので、多言語用途では避けるのが無難でした。日本語と英語しか使わないなら、4 つともきれいに揃います。
参考
- UDEV Gothic(JetBrains Mono + BIZ UDGothic + Nerd Fonts) https://github.com/yuru7/udev-gothic
- PlemolJP(IBM Plex Mono + IBM Plex Sans JP) https://github.com/yuru7/PlemolJP
- HackGen https://github.com/yuru7/HackGen / Cica https://github.com/miiton/Cica
- Nerd Fonts https://www.nerdfonts.com/
- 拙稿: WSLg のGUIアプリで文字をくっきり表示し、ウィンドウの端をドラッグでリサイズする https://qiita.com/vochicong/items/17a43cc51fcbac282b3c