Network Users' Group ``wheel'' / Dai ISHIJIMA's Page
文字フォント / BDFフォントをubuntuで使う
#トップ #はじめに #ISO10646フォント作成 #terminalでEUC-JP

初版: 2012-02-19
最終更新日: 2012-02-19


BDFフォントを変換してUbuntu Linuxで利用する

gnome-terminalでEUCエンコーディングを使う

●はじめに

BDFフォントを変換してWindowsで使う で書いたように、 ビットマップフォントを使いたい場面がUbuntu Linuxでもありました。 Ubuntu Linuxでは、gnomeが動いており、フォントは基本的に TrueTypeが用いられるようです。 とはいえ、UN*X系の処理系ですから、どこかの設定ファイルを変更すれば、 ビットマップを使えるようになるでしょうし、 その上でビットマップフォントを用意すればいいのではないかと考えました。

TrueTypeフォントの利用が基本なのであれば、 BDFから変換したTTFでなんとかなるかと思いましたが、 試した範囲ではうまく動きませんでした。 そこで、BDF(から変換したPCF)をビットマップフォントのまま 使う方法を探してみました。 そんな中で、いろいろと調べてみると有用な情報を発見しました。 bucchiさんの、 「gnome-terminal で M+ ビットマップフォントを使う」です。 この記事によると、/etc/fonts/conf.dの修正と フォントのエンコーディングがISO10646である必要があるようです。


●JIS X 0201フォントとJIS X 0208フォントからISO10646フォントを

ISO10646エンコーディングなフォントは、 ずいぶん前に SLザウルス用の フォントの作成で 作ったことがあります。 というわけで、それを再利用しました。
mbdf -c jisx0201.txt 8x16rk.bdf -c jisx0208.txt jiskan16.bdf > jiskan16u.bdf

○エンコーディング情報の修正とPCF化

上に書いた操作でフォントは中途半端ではありますが、 ISO10646-1エンコーディングになります。 ただし、これはフォントをSLザウルス向けに変換するための途中であって、 BDFフォントとしては不十分です。 どこが不十分かというと、BDFフォントのプロパティの 「CHARSET_REGISTRY」などがJISのまま、という点です。 ここはテキストエディタなどで
FONT -Misc-Fixed-Medium-R-Normal--16-150-75-75-C-80-JISX0201.1976-0
CHARSET_REGISTRY "JISX0201.1976"
CHARSET_ENCODING "0"
みたいな部分を
FONT -Misc-Fixed-Medium-R-Normal--16-150-75-75-C-80-ISO10646-1
CHARSET_REGISTRY "ISO10646"
CHARSET_ENCODING "1"
と修正します。もちろん、
#! /bin/sh

cat $@ |
sed 's/^\(FONT -.*\)-JISX020[18]\.[0-9]*-0/\1-ISO10646-1/' |
sed 's/^CHARSET_REGISTRY "JISX020[18]\.[0-9]*"/CHARSET_REGISTRY "ISO10646"/' |
sed 's/^CHARSET_ENCODING "0"/CHARSET_ENCODING "1"/'
こんなシェルスクリプトに通すのが楽ちんですね。

また、ターミナルその他のアプリケーションで フォントを参照するときの「そのフォントの名前」は、

FONT -Misc-Fixed-Medium-R-Normal--16-150-75-75-C-80-ISO10646-1
FAMILY_NAME "Fixed"
の「Fixed」の部分が使われるようです。 ここは、たとえば「JISKAN16」と(今回のjiskan16.bdfなら)しておくと いいでしょう。この処理もテキストエディタで修正しても構いませんし、
#! /bin/sh

name='bitmap'
case x"$1" in
    x-[A-Za-z0-9]*)
	name=`echo "x$1" | sed 's/^x-//'`
	shift
	;;
esac

cat "$@" |
sed 's/^FONT[^-]*-[^-]*-[^-]*-\(.*\)$/FONT -'"$name"'-'"$name"'-\1/' |
sed 's/^FOUNDRY ".*"/FONDRY "'"$name"'"/' |
sed 's/^FAMILY_NAME ".*"/FAMILY_NAME "'"$name"'"/'
といったフィルタに通す方法もアリでしょう。

ここまでの処理が終わったら、bdftopcfコマンドで、 フォントをPCF化しておきます。


●「/etc/fonts/conf.d」を修正してビットマップフォントを有効に

TrueTypeフォント以外にPCF形式ビットマップフォントも使うかどうかは 「/etc/fonts/conf.d/」の「70-*-bitmaps.conf」 で設定できました。具体的には以下のようにしました。
% cd /etc/fonts/conf.d
% sudo rm 70-no-bitmaps.conf
% sudo ln -s ../conf.avail/70-yes-bitmaps.conf .


●PCFフォントのインストール

これまでの手順で用意したフォントをインストールするには、 たとえば、デスクトップにPCFファイルを置いて、 そのアイコンをダブルクリックするなどします。 gnome-font-viewerが動き、 英数文字列と「いろはにほへと…」という文字列を そのフォントで表示したサンプルが出てきます。 フォントの種類(PCF)やフォントの名前も表示されます。 「フォントのインストール」ボタンを押すと 「$HOME/.fonts/」にインストールされ、 フォントが利用可能となります。


●gnome-terminalで簡単に「ja_JP.EUC-JP」エンコーディングを

Ubuntuのターミナルエミュレータである「gnome-terminal」では、 文字エンコーディングのデフォルトが「UTF-8」になっています。 もちろん、「EUC-JP」や「シフトJIS」も使えますが、 これには、メニューバーから「端末(T)」→「文字コードの変更」 で使いたいエンコーディングを選択する必要があります。 「コマンドラインオプションでどうにかならんのか」と思いましたが、 こちらも有用な情報がありました。 トコシステムさんの ubuntuでのターミナルです。


●「locale-gen(8)」による「ja_JP.EUC-JP」ロケールの生成

gnome-terminalでは、使われる文字エンコーディングは 起動時の「$LANG」環境変数がデフォルトとなるそうです。 ただし、素のUbuntu Linuxでは、 「LANG=ja_JP.EUC-JP」と設定しようとしてもエラーになります。 その原因はそのlocaleがないからです。 「なかったら作ったらしまいやん」というのはUN*X系の常識(?)ですから、 以下のようにして作りましょう。
% sudo locale-gen ja_JP.EUC-JP
Generating locales...
  ja_JP.EUC-JP... done


●「--disable-factory」オプションでgnome-terminalを「EUC-JP」で使う

さらに「--disable-factory」オプションを付けるとうまくいくということで、
env LANG=ja_JP.EUC-JP /usr/bin/gnome-terminal --disable-factory --geometry 80x32 --profile=jiskan16
のようにしてgnome-terminalを起動すればバッチリな模様です。 これをコマンドラインから毎回打つのはめんどくさいので、 「システム」→「設定」→「メインメニュー」から登録して 「アプリケーション」→「アクセサリ」から呼び出せるように しておけばいいですね。

上のgnome-terminalを呼び出すコマンドで、 「--profile=jiskan16」と書いていますが、 これは、ずっと上で書いた「JISKAN16フォント」を使う設定にした プロファイルです。 あらかじめgnome-terminalの「編集」→「プロファイル」メニューで 作成しておいてください。

エンコーディングの乱立というか、歴史的な経緯もあって、 ネットワーク上にはUTF-8なマシンやEUC-JPなマシンが混在することも 多いでしょう。 Ubuntuクライアントから、EUC-JPなサーバにリモートログインするときに、 この方法を使えば簡単だと思います。 十分確認してはいませんが、

% sudo localedef -f SHIFT_JIS -i ja_JP ja_JP.SJIS
% sudo locale-gen ja_JP.SJIS
でシフトJISも使えそうな感じです。


●謝辞というか参考文献というか

今回も先人の功績に謝意を表します。


●関連リンク



ご質問などありましたらお気軽に