UDEVGothicフォントで一部記号の幅がおかしい
-
Windows11(x64) Version 25H2 / Mery(x64) Version 3.8.9
UDEVGothicフォントを使用したとき一部記号の幅がおかしいです。
以下の例で期待値は、JPDOCフォントなら全てワイド幅、JPDOC以外のフォントはすべてナロー幅です。┌─┬─┬─┬─┐ │■│□│★│☆│ ├─┼─┼─┼─┤ │▲│△│▼│▽│ ├─┼─┼─┼─┤ │◆│◇│○│●│ ├─┼─┼─┼─┤ │♠│♡│♢│♣│ ├─┼─┼─┼─┤ │♤│♥│♦│♧│ └─┴─┴─┴─┘しかし、実際は以下のようになります。
JPDOCフォント トランプ記号(U+2660…U+2667) ナロー幅
JPDOC以外のフォント ★(U+2605)、☆(U+2606) ワイド幅
NFフォント ♥(U+2665) ワイド幅表示だがナロー幅認識フォールバックが悪さをしているのでしょうか。それともフォント自体が変なのでしょうか。
NFフォントの件は、フォント自体が変のようです。| enaka | 返信 -
MSゴシックでクラシックのメモ帳で書いて張り付けたんですが、ブラウザ(NOTOフォント?)だとガタガタですね。
| enaka | 返信 -
>> enakaさん
こんばんは。UDEV Gothic 作者です。
まず、結論から言うと、この事象はMeryによるものではなく、UDEV Gothicの仕様によるものかと思います。
そのため、ここでUDEV Gothicのサポートやり取りをしてしまうようでKuroさんには恐縮ですが、、、
以下に、頂いた各グリフの幅情報を表にしました。「幅」列が、各グリフの前進幅 (カーソル移動量) です。
UDEV Gothicですと、幅の数値の意味は
- 1024 = 半角幅 (ナロー幅)
- 2048 = 全角幅 (ワイド幅)
となっています。
> JPDOCフォント トランプ記号(U+2660…U+2667) ナロー幅
> JPDOC以外のフォント ★(U+2605)、☆(U+2606) ワイド幅
> NFフォント ♥(U+2665) ワイド幅表示だがナロー幅認識英語・日本語用の2つのフォントを合成した結果、各グリフの幅が決まるのですが、上記のように見えているのはこの「合成語の表示幅の値」が理由です。
※以下は、各グリフを1つ1つ詳しく見る時間が取れていないため、状況証拠からの推測もある点をご了承ください
- このフォントは、英語フォント (JetBrains Mono) と日本語フォント (BIZ UDゴシック) を合成して作成しています。記号類は概ね、英語フォント側は半角幅、日本語フォント側は全角幅になっています
- 合成する際、特定のグリフが両フォントいずれにも含まれ合成時に衝突する場合があります。その場合、英字フォント側を優先して適用しています。
- 英字フォントには記号グリフが多く収録されており、そのまま合成すると多くの記号が半角幅になってしまい、日本語文書での約物記号で表示がイマイチになってしまいました。これを解決すべく生まれたのが JPDOC 版です。
- JPDOC 版では、前述のグリフの衝突のうち、日本語文書でよく使う記号類だけ日本語フォント側を優先するようにしました。優先対象とした記号は udev-gothic/doc/JPDOC.txt に掲載しています。
- JPDOC版で U+25A0 ~ U+25CF あたりが全角になっているのは、この合成仕様によるものです
- U+2660 ~ U+2667 は日本語フォント側を優先する対象になっていないので、英語フォント側が適用されているものと思われます
- UDEV Gothic 無印版の ★(U+2605)、☆(U+2606) では、そもそもグリフの衝突をしておらず、日本語フォント側の全角グリフがそのまま反映されているものと思われます
- NF 版の ♥(U+2665) が半角のカーソル前進幅なのに表示が全角なのは、追加合成している Nerd Fonts の仕様と思われます。
- Nerd Fonts 由来の記号は、このように「半角の前進幅だけど全角の表示幅」となっています
- Nerd Fonts 由来の記号はすべて英語・日本語フォントよりも優先して適用しています
- 今回リストされたグリフの内 ♥(U+2665) だけが Nerd Fonts に収録されており、上記の合成仕様によって反映されたと思われます
グリフ情報: UDEV Gothic JPDOC
- ファイル:
UDEVGothic_v2.2.0/UDEVGothicJPDOC-Regular.ttf - unitsPerEm: 2048
Unicode シーケンス 文字 グリフ名 幅 (font units) U+25A0 ■ filledbox2048 U+25A1 □ H220732048 U+2605 ★ uni26052048 U+2606 ☆ uni26062048 U+25B2 ▲ triagup2048 U+25B3 △ uni25B32048 U+25BC ▼ triagdn2048 U+25BD ▽ uni25BD2048 U+25C6 ◆ uni25C62048 U+25C7 ◇ uni25C72048 U+25CB ○ circle2048 U+25CF ● H185332048 U+2660 ♠ spade1024 U+2661 ♡ uni26611024 U+2662 ♢ uni26621024 U+2663 ♣ club1024 U+2664 ♤ uni26641024 U+2665 ♥ heart1024 U+2666 ♦ diamond1024 U+2667 ♧ uni26671024 グリフ情報: UDEV Gothic
- ファイル:
UDEVGothic_v2.2.0/UDEVGothic-Regular.ttf - unitsPerEm: 2048
Unicode シーケンス 文字 グリフ名 幅 (font units) U+25A0 ■ filledbox1024 U+25A1 □ uni25A11024 U+2605 ★ uni26052048 U+2606 ☆ uni26062048 U+25B2 ▲ triagup1024 U+25B3 △ uni25B31024 U+25BC ▼ triagdn1024 U+25BD ▽ uni25BD1024 U+25C6 ◆ uni25C61024 U+25C7 ◇ uni25C71024 U+25CB ○ circle1024 U+25CF ● uni25CF1024 U+2660 ♠ spade1024 U+2661 ♡ uni26611024 U+2662 ♢ uni26621024 U+2663 ♣ club1024 U+2664 ♤ uni26641024 U+2665 ♥ heart1024 U+2666 ♦ diamond1024 U+2667 ♧ uni26671024 グリフ情報: UDEV Gothic NF
- ファイル:
UDEVGothic_NF_v2.2.0/UDEVGothicNF-Regular.ttf - unitsPerEm: 2048
Unicode シーケンス 文字 グリフ名 幅 (font units) U+25A0 ■ filledbox1024 U+25A1 □ uni25A11024 U+2605 ★ uni26052048 U+2606 ☆ uni26062048 U+25B2 ▲ triagup1024 U+25B3 △ uni25B31024 U+25BC ▼ triagdn1024 U+25BD ▽ uni25BD1024 U+25C6 ◆ uni25C61024 U+25C7 ◇ uni25C71024 U+25CB ○ circle1024 U+25CF ● uni25CF1024 U+2660 ♠ spade1024 U+2661 ♡ uni26611024 U+2662 ♢ uni26621024 U+2663 ♣ club1024 U+2664 ♤ uni26641024 U+2665 ♥ oct-heart-nf1024 U+2666 ♦ diamond1024 U+2667 ♧ uni26671024 | yuko | 返信 -
> yukoさん
いつも大変お世話になっております。丁寧な解説ありがとうございます。
Bizin Gothicは英数のサイズのバランスが漢字より少し小さい気がして、UDEV Gothicに乗り換えました。
UDEV Gothicは、`(U+0060)が少し見にくいですが、スラッシュゼロや波カッコや小文字gが好みの形状です。> まず、結論から言うと、この事象はMeryによるものではなく、UDEV Gothicの仕様によるものかと思います。
>
> そのため、ここでUDEV Gothicのサポートやり取りをしてしまうようでKuroさんには恐縮ですが、、、恐縮です。でもMeryの仕様が絡む話もしますのでご勘弁を。
NeoVimやEmacsやMinttyなどでは、文字のコードポイントを指定してナロー幅とワイド幅を選択できます。
https://zenn.dev/laddge/articles/369ee2672b4424
https://github.com/rbtnn/vim-ambiwidth
https://qiita.com/s417-lama/items/b38089a42fe7d4a061daそうすると、JPDOCフォントでなくともトランプ記号が横に伸びたワイドの表示に切り替わるので、元のJetBrains Monoは両方の設定を持っていて切り替わるのだと思います。
ただし、♢(U+2662)と♦(U+2666)はワイド幅と認識しても、なぜかナロー幅のグリフで隙間が空いて表示されます。
MS Gothicなどでも両方の設定を持っているようで、表示が切り替わります。Meryでも任意の文字のコードポイントを指定して、フォールバックフォントとナロー・ワイド幅を設定して差し替えが出来るとよいですね。
そうすれば、記号だけワイド幅のグリフがあるMS Gothicを使う、アスタリスクを五角から六角の任意のグリフと差し替える、全角空白を任意の文字に置き換える、任意のNeedフォントに差し替える、といったことができます。yukoさんのおっしゃるとおり、★(U+2605)と☆(U+2606) のように元のJetBrains Monoにグリフがない文字もありました。
Nerdフォントで♥(U+2665) だけグリフがあるのはなぜなのでしょうね。しかも塗り潰しのはずが繰り抜きになっています。
Nerd化の意味のあるグリフのみマージするのは無理そうなので仕方ないです。Notoフォントのように塗り潰しと繰り抜きの対となるフォントで、形状とサイズが違うほどではないため、それはよいのですが。○(U+25CB)と●(U+25CF)が小さいのはなんでだろう。
今どきのAIやGoogleのようなガンガン行くぜ的企業は、フォントのような神は細部に宿る仕事とは相性が良くなさそうです。| enaka | 返信 -
yuko さん、詳しいご説明ありがとうございます。
仕組みを改めて知ると、今回の挙動もかなり納得できますね。
特に JPDOC 版で記号の優先順位を入れ替えているというのは、なるほどと思いました。
Mery 側としても、今回の話はなかなか興味深いです。
> そのため、ここでUDEV Gothicのサポートやり取りをしてしまうようでKuroさんには恐縮ですが、、、
私は構いませんが、有用な情報でもありますので、GitHub の Issues のほうでやり取りされたほうが、UDEV Gothic を利用しているみなさんとも情報共有できてよいかもしれませんね。
> Meryでも任意の文字のコードポイントを指定して、フォールバックフォントとナロー・ワイド幅を設定して差し替えが出来るとよいですね。
Mery の場合、そもそも「全角文字なら 2 桁、半角文字なら 1 桁」という設計ではなく、実際のフォントの前進幅を使って文字位置を決めています。
そのため、ここに「この文字は強制的に 2 文字分」といった概念を持ち込むのは難しいと思います。
一応、Mery ではコードポイントを指定してフォールバックさせる機能がありますので、それを利用すれば、似たようなことは実現できます。
[ツール] → [オプション] → [DirectWrite] → [フォールバック フォント] で任意のフォントを追加します。
フォールバック フォントの一覧で項目をダブルクリックすると、Unicode 範囲を指定できるダイアログが表示されます。
詳しい指定方法については、以下のフォーラムで紹介しています。
【参考】フォールバック カスタムフォント
https://www.haijin-boys.com/discussions/7093#discussion-8413ただし、あくまでフォールバックなので、メインのフォントがすでにそのグリフを持っている場合はフォールバックされません。
そのため、UDEV Gothic でやるなら、対象となる記号のグリフを抜いたフォントを自前で用意していただく必要がありますね。
ちなみに、上記のフォーラムで、
「そもそも空っぽのフォントが作れたら、すべてフォールバックさせられるので、完全にオリジナルの組み合わせができるんじゃね?」
という話になりまして、そのときに yuko さんが、グリフを持たない空っぽのフォントを作成できるスクリプトを公開してくださいました。
これをベースにして、まず UDEV Gothic を記号を除いた Unicode 範囲にフォールバックさせ、さらに記号だけ MS Gothic にフォールバックするといった組み合わせもできると思います。
とはいえ、全角だからといって、必ずしも半角の 2 倍のサイズになるとは限りませんが…
一応、上記の Unicode 範囲の指定では、文字のサイズも % 単位で指定できるので、微調整すれば、近い見た目にすることはできるかもしれません。
| Kuro | 返信 -
> 一応、Mery ではコードポイントを指定してフォールバックさせる機能がありますので、それを利用すれば、似たようなことは実現できます。
すでに望んでいる機能があったとは(笑)
> という話になりまして、そのときに yuko さんが、グリフを持たない空っぽのフォントを作成できるスクリプトを公開してくださいました。
さっそく作りました。これからいろいろ実験してみます。フォールバック指定したフォント同士でコードポイントが重なった場合はどうなるんでしょうか。
fontforgeのエラーメッセージが文字化けしていますが、なんとなくですが「フォントのグリフがない」と言っているように読めます。$ pacman -S ucrt64/mingw-w64-ucrt-x86_64-fontforge $ fontforge -script ./empty_font.py Copyright (c) 2000-2026. See AUTHORS for Contributors. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> with many parts BSD <http://fontforge.org/license.html>. Please read LICENSE. Version: 20251009 Based on sources from 2026-01-26 21:17 UTC-ML-D. Based on source from git with hash: 8b6c18fbf290e1b44f787663b0f5b7f2a94260a1 Could not create plugin directory 'C:/Users/enaka/AppData/Roaming/FontForge//plugin' Core python package 'pkg_resources' not found: Cannot discover plugins Could not create plugin directory 'C:/Users/enaka/AppData/Roaming/FontForge//plugin' 縺薙・繝輔か繝ウ繝医↓縺ッUnicode繧ィ繝ウ繧ウ繝シ繝・ぅ繝ウ繧ー繧偵b縺、繧ー繝ェ繝輔′縺ゅj縺セ縺帙s. 蜃コ蜉帙&繧後◆繝輔か繝ウ繝医・縺翫◎繧峨¥菴ソ逕ィ縺ァ縺阪↑縺・〒縺励g縺・ 縺薙・繝輔か繝ウ繝医↓縺ッUnicode繧ィ繝ウ繧ウ繝シ繝・ぅ繝ウ繧ー繧偵b縺、繧ー繝ェ繝輔′縺ゅj縺セ縺帙s. 蜃コ蜉帙&繧後◆繝輔か繝ウ繝医・縺翫◎繧峨¥菴ソ逕ィ縺ァ縺阪↑縺・〒縺励g縺・ $ ls -l empty_font.ttf -rw-r--r-- 1 enaka none 1472 2026-09-03 22:20 empty_font.ttf最初、よく知らずに既存のグリフの少ないフォントを使おうと、マーレットを指定し面白おかしいことになった。
https://en.wikipedia.org/wiki/Marlett| enaka | 返信 -
>> enaka さん
> UDEV Gothicは、`(U+0060)が少し見にくいですが、スラッシュゼロや波カッコや小文字gが好みの形状です。
なるほど、言われてみればそうかもしれません。違和感が出ない程度に、少し調整の余地はあるかもしれません。
> Notoフォントのように塗り潰しと繰り抜きの対となるフォントで、形状とサイズが違うほどではないため、それはよいのですが。○(U+25CB)と●(U+25CF)が小さいのはなんでだろう。
しかしながら、あれだけのグリフ数を誇るフォントがフリーライセンスで出てくるのは衝撃でしたね。流石の財力。
>> Kuro さん
ご迷惑になっていないようでしたら、よかったです。issue の運用にはあまりこだわっていないので問題ないのですが (そんなんでいいのか)、そもそも言うほどユーザーからの質疑もないものでして。
とはいえ、再現手順を聞き出すとか込み入った話になりそうであれば誘導することもあるのですが、今回はお言葉に甘えさせていただきます。もし他のユーザーさんで当方製のものがあれば、遠慮なくフォントの issue へどうぞとご案内していただければ幸いです。
> グリフを持たない空っぽのフォントを作成できるスクリプト
そんなものもありましたねw 一発芸のように作ってみたものですが、2度も活用の場があるとは😂
| yuko | 返信 -
>> enaka さん
> フォールバック指定したフォント同士でコードポイントが重なった場合はどうなるんでしょうか。
上から順に優先されて適用されると思います。
DirectWrite の仕様で、リストの先頭から順番に、条件 (Unicode 範囲) にマッチするか走査されるはずです。
(昔、どこかで資料を見た気がするのですが、情報元は見つけられませんでした)
ちなみに、一覧の項目はドラッグアンドドロップで順番を変更することができます。
> 最初、よく知らずに既存のグリフの少ないフォントを使おうと、マーレットを指定し面白おかしいことになった。
メインのフォントがベースになるので、変わったフォントをメインにすると、いろいろおかしなことになるかもしれないですね。
たとえば、Consolas などの英字フォントと日本語フォントを組み合わせるとかの用途だと、割と相性の良い機能なのですが…
>> yuko さん
> もし他のユーザーさんで当方製のものがあれば、遠慮なくフォントの issue へどうぞとご案内していただければ幸いです。
了解です🫡
とはいえ、「それ、Windows の使い方の話では?」とか、「そもそもパソコンの使い方ですよね」というような投稿もたまにあるので、フォントまわりの話であれば、今回のように Mery のフォーラムで話題になっていても、許容範囲かなと思います(笑)
> そんなものもありましたねw 一発芸のように作ってみたものですが、2度も活用の場があるとは😂
当時、遊びで作った隠し機能だったもので、私もすっかり忘れていました。もう 2 年前の出来事なんですね…
ひとまず、本件は解決ということでよさそうですね。yuko さん、ありがとうございました。
| Kuro | 返信 -
> > フォールバック指定したフォント同士でコードポイントが重なった場合はどうなるんでしょうか。
>
> 上から順に優先されて適用されると思います。であれば置き換えたい特定のフォントでコードポイントを先に指定し、最後に通常使うフォントを指定すればよいですね。
> > 最初、よく知らずに既存のグリフの少ないフォントを使おうと、マーレットを指定し面白おかしいことになった。
>
> メインのフォントがベースになるので、変わったフォントをメインにすると、いろいろおかしなことになるかもしれないですね。マーレットはASCIIの数字とアルファベットのコードポイントにボタンなどのアイコンフォントが割り当てられているので、差し替えると英文が絵文字の暗号文みたいになります。
たまにタイトルバーのボタンがおかしくなるのは、マーレットのフォントキャッシュが壊れたからですね。> ひとまず、本件は解決ということでよさそうですね。yuko さん、ありがとうございました。
ありがとうございました。
| enaka | 返信