fukke.cafe

プログラマーのロマン フォントの作り方編

フォントは何を使ってますか?

FiraCodeNerd Font,白源 などなど...

Nerd Font とは

開発者のためにいい感じのフォントを集めたセットのこと。 Git やフォルダのアイコンなど。
Image from Gyazo

Font は自由にカスタムしていいの?

Unicode

文字コードの業界規格。文字の集合。
ただの業界規格ですが、国際規格のhttps://ja.wikipedia.org/wiki/ISO/IEC_10646と同じになるように協調してつくっている。
ISO 国際標準化機構

Unicode ができるまでの話

米国で最初の文字コード ASCII (ISO/IEC646)が開発された。これは英語だけの文字集合でたとえば ё のような文字は文字集合に含まれていない。 そこで各国が ASCII をカスタマイズした文字集合をつくるようになった。 日本では JIS X 0201 がそれにあたる。 各国がそれぞれ作っていたが複数言語をつかいたいという需要がでてきて、一つの文字集合にする動きがでてきた。 そこで Unicode が誕生する。ASCII が生れてから Unicode が普及するまでの間の歴史がとても難しいです。(Shift_jis や EUC_JP などはその間のお話し)

UTF-まるまる

(Unicode のお話し) 文字の符号化方法についての規格

utf-8

ASCII コード互換で 1~4byte の可変長で表せられる

utf-16

一つの文字を 16bit(2byte)で表現する。 2^16 = 65536 文字しか表現できない!?
Unicode に登録されている Code Point は 10 万種類を超えている
UTF-16 では 2 つの Code Unit の組み合わせ(合計 4 バイト)で 1 つの文字(1 つの Code Point)を表現します → サロゲートペア

js

js は内部で utf-16 を採用している
// 「あ」のCodePoint  unicodeの話
'あ'.codePointAt(0); // 12354
Number(12354).toString(16); // 0x3042
String.fromCodePoint(12354); // 'あ'
// 16進数

// サロゲートペア

// コードポイントはひとつ
'🥺'.codePointAt(0); // 129402
// でも
'🥺'.length; // 2
// jsは内部で以下のようにもっている(utf-16)
'🥺'[0]; // "\ud83e"
'🥺'[1]; // "\udd7a"
console.log('\ud83e\udd7a'); // 🥺

// コードポイントごとに処理したい...
// イテレータにする
Array.from('🥺').length; // 1
// 正規表現をつかう
'🥺'.match(/./); // [ "\ud83e" ]
'🥺'.match(/./u); // [ "🥺" ]

日本語の範囲

\u3040 - \u30ff
Image from Gyazo

全角文字の範囲

\uff00 - \uffef
日本語、中国語、全角文字の範囲はターミナルで日本語を表示するときに重要になってくる。 日本語は英語二文字分のスペースを取るので。考慮しないと日本語と英語がまざったときに変な表示になったりする。
deno-cliffy を修正した例 https://github.com/c4spar/deno-cliffy/pull/541

Q.Font は自由にカスタムしていいの? A. フォントを自由に追加できる範囲

U+F0000–U+10FFFF https://ja.wikipedia.org/wiki/%E7%A7%81%E7%94%A8%E9%9D%A2 Image from Gyazo

FiraCode Nerd Font Image from Gyazo

FontForge を使った自作フォント

準備

fontforge というアプリケーションを使います。 mac 用は以下のリンクからダウンロードできました。
https://fontforge.org/en-US/downloads/mac-dl/

作成

fontforge を起動したらダイアログがででくるので新規作成を選択。
Image from Gyazo
エンコーディングを unicode にします。 Image from Gyazo
フォントのテーブルが出てくるのでフォントを作りたい文字を選んで右クリック+アウトラインウィンドウを開くを選択。
Image from Gyazo
ペンツールを選んで書いてみます。svg ファイルや png ファイルのインポートもできるっぽい!
Image from Gyazo
フォントが完成したらファイル>フォントを出力から生成します。
Image from Gyazo
生成した ttf や otf ファイルを Mac の FontBook で開いてシステムに登録。
vscode などでフォントの設定をすると自作フォントを読み込めます!
Image from Gyazo

ちょってぃをターミナルに表示したい!

svg を使う例

unicode を選択 → 0f0000 に移動 → アウトラインウインドウを表示 → 取り込み → svg → ok Image from Gyazo
エレメント情報からフォント名を決める Image from Gyazo
ファイル > フォントを出力 > ttf で生成 Image from Gyazo
Mac の場合、フォントブックによみこむ Image from Gyazo
VSCode に Font を設定
Image from Gyazo
FontBook からドラッグドロップで表示する
Image from Gyazo

おわりに

自作フォントの世界にようこそ。 華やかなターミナル、エディタをつくって よいフォントライフをおすごしください!
Image from Gyazo

Thanks you for reading.