玩式草子─ソフトウェアとたわむれる日々

第98回Plamo-7.0とUTF-8

前回はPlamo-7.0の特徴を簡単に紹介しました。今回からは、それらの特徴についてより詳しく掘り下げながら、Plamo Linuxの仕組みや内部構造について解説していこうと思います。まず最初に取りあげるのは、ユーザへの影響が大きい文字コードに関する話題です。

デフォルトの文字コードの設定

前回も触れたように、Plamo-7.0ではデフォルトの文字コードをEUC-JPからUTF-8に変更しています。この設定はログイン時に実行される~/.bashrcから、ja_JP.UTF-8を引数にして~/.set_lang_bshを実行することで行っています。

$ cat -n ~/.bashrc | grep -n2 lang
22-    22     IGNOREEOF=3
23-    23     
24:    24     source $HOME/.set_lang_bsh ja_JP.UTF-8
25-    25     
26-    26     # less で行番号をつけ、終了後に画面を残す

ここで使っている~/.set_lang_bshは、Bsh系が使うLANG環境変数をexportするためのコードです。

$ cat -n ~/.set_lang_bsh 
     1        case "$1" in
     2        *[uU][tT][fF]*)
     3          LANG=ja_JP.UTF-8 ;;
     4        *)
     5          LANG=ja_JP.eucJP ;;
     6        esac
     7        
     ...
    16        export LANG

このコードを独立したファイルにしているのは、必要に応じてこのファイルをsourceすることで、動的に文字コードを切り替えれるようにするためです。

たとえば、EUC-JPな日本語ファイル名を見る場合、デフォルトのUTF-8な設定では正しく表示できませんが、端末ソフトの文字コードをEUC-JPにして

$ source ~/.set_lang_bsh euc

を実行すれば、その端末ソフト内はEUC-JPな環境になって、ファイル名を正しく表示できるようになります(図1で使っているmate-terminalの場合は、⁠端末(T)⁠⁠→⁠文字コードの設定(C)⁠⁠→⁠日本語(EUC-JP)⁠⁠。

図1 利用する文字コードを動的に切り替え
図1 利用する文字コードを動的に切り替え

この~/.bashrcは新規ユーザを登録するadduserコマンドが作成します。adduserを起動すると、登録したいユーザのログイン名やユーザID、グループ名に加え、日本語localeの設定やウィンドウマネージャ、日本語入力等の設定を尋ねられます。ログイン名以外の設定はあらかじめデフォルト値が用意されているので、そのままでいい場合はEnterを入力するだけで進みます。

root@plamo7:~# adduser
Can you read Japanese chars on this term? [Y/n]
y
Japanese mode

新しいユーザのログイン名を指定してください(8 文字以内)。 []: mkojima
mkojima のユーザ ID は? [自動登録の場合は 1000 番台になります]: 
mkojima が属するグループは? [users]: 
mkojima は他のグループにも属しますか?
  (デフォルト設定に追加する場合 --> add:,,...
   他のどのグループにも属さない場合 --> none)
  [audio,dialout,video,cdrom,kvm,pulse,pulse-access,mlocate,libvirt]: 
mkojima のホームディレクトリは? [/home/mkojima]: 
mkojima が使うシェルは? [/bin/bash]: 

日本語 locale の設定
1 : ja_JP.UTF-8(今風)
2 : ja_JP.eucJP(obsolete)
mkojima はどちらの locale を使いますか? [1]: 

ウィンドウマネージャ設定
1 : Twm(X付属のごくシンプルなWM)
2 : LXDE Desktop(Gtkベースの軽めの環境)
3 : MATE Desktop(GNOME2 の進化版)
mkojima が使う WM は? [3]: 

IM の選択
1 : uim
2 : fcitx
mkojima が使う IM は? [1]: 

もちろんデフォルト値以外も指定できるので、ロケールにja_JP.eucJPを使い続けることも可能なものの、デフォルト値以外の設定はテストが十分ではないため、何らかの不具合が生じるかも知れません。そのような場合はPlamo Linuxのメーリングリストなどにご報告いただければ、可能な限り対応するつもりです。

UTF-8とコンソール

Plamo Linuxの特徴の一つは「日本語をコンソールに直接表示できる」ことです。

X Window System上ではfreetypeやcairo、pango/harfbuzzといったフォント描画やテキスト処理用の各種ライブラリが揃っているのに対し、Xを使わないコンソール環境では日本語を扱えるターミナルエミュレータを使うか、カーネルにパッチをあてて日本語を表示可能にするかぐらいの選択肢しかありません。

初期のPlamo Linuxでは、JEの生みの親でもある真鍋敬士さん作のKON(Kanji ON linux)と呼ばれるターミナルエミュレータを使ってコンソール上で日本語を表示していました。

その後、linux-2.xの時代になると、konの開発終了と入れ替わるように、uniconと呼ばれるカーネルパッチが現われました。uniconは、linuxカーネルのコンソールドライバを改造して、漢字のようなマルチバイト文字を表示可能にするパッチで、この修正を加えたカーネルはターミナルエミュレータ無しでコンソールに日本語を表示できます。

unicon機能を使えばカーネルのみで日本語が表示できるようになるものの、そのためにはカーネルに日本語フォントを組み込まなければなりません。そのような特定の言語のみに対応した実装はカーネル開発者たちの好むところではないため、このパッチが本家のソースコードに取り込まれることはないでしょう。

そう考えて、⁠メンテナンスが大変だから」ということでカーネルに対するローカルパッチは避けてきたPlamo Linuxなものの、uniconパッチは全面的に採用し、その後、daiさんがlinux-2.6.31対応で開発を終了した後も使い続けて、Plamo-6.xまでuniconでコンソールに日本語を表示していました。

ところが、このuniconはUTF-8には対応していないため、デフォルトの文字コードをUTF-8にしようと考えていたPlamo-7では利用できません。そこで代替案をあれこれ探し、一時期はkmsconと呼ばれるKMS機能を使ったターミナルエミュレータも検討したものの、最終的にはgentoo-zh方面で開発されたlinux-cjkttyと呼ばれるカーネルパッチを採用し、unicon同様、カーネル自身にUTF-8な日本語を表示させることにしました。

図2はPlamo-7.0のインストーラ画面で、Plamo-6.xまでと同じに見えるものの、uniconではなくlinux-cjkttyを使って、メッセージの文字コードもUTF-8になっています。

図2 Plamo-7.0のインストーラ画面
図2 Plamo-7.0のインストーラ画面

なお、linux-cjkttyはUTF-8決め打ちなので、EUC-JPな文字コードは正しく表示できません。前節で紹介したように、X上ならば端末ソフトの文字コードを変更することで以前のja_JP.eucJPな環境も利用できるものの、コンソール上での日本語表示はja_JP.UTF-8に限られるのでご注意ください。

ファイル名の文字コード

デフォルトの文字コードを変更することで生じる最大の問題は、既存の日本語ファイル名が表示できなくなることです。図1で紹介したように、ja_JP.eucJPなロケールで保存した日本語ファイル名は、ja_JP.UTF-8なロケールから見ると謎な文字や???だらけになってしまいます。

先に紹介したように、~/.set_lang_bshをsourceすることでロケールは簡単に切り替えられるものの、古いファイルを使うたびにロケールを切り替えるのも実用的ではありません。

この問題を解決する一番簡単な方法は、既存の日本語ファイル名の文字コードをUTF-8に変更してしまうことです。Plamo Linuxではnkfという文字コード変換ツールがデフォルトで入っているので、たとえば以下のようなスクリプトで、引数に指定したファイル名の文字コードをUTF-8に変換できます。なお、この例ではEUC-JPからUTF-8へ変換することを想定しています。

#!/bin/bash
old_name=$1
new_name=`echo $name | nkf -w`
mv -v $old_name $new_name

このコードはエラー処理や特殊文字のエスケープ等は一切考えていないので、実際に変換する際は、直接mvで改名するのではなく、元のファイルは残したまま、別ディレクトリにcpする等の安全策を講じてください。また、より本格的なファイル名の文字コード変換ツールにはperlで書かれたconvmvがあります。

一方、以前のPlamo Linux環境とファイルを共有しているような場合、ファイル名をEUC-JPとUTF-8の双方でアクセスしたいこともあります。そのような状況で便利なのが、文字コード変換機能を持ったsambaです。

sambaは使っている文字コードが異なるLinuxとWindows間のファイル共有機能を提供するために開発されたソフトウェアなので、異なる文字コード間でファイル名を自動変換する機能を持っています。通常、sambaは他のマシンとファイル共有する際に使うものの、localhostを接続先に指定することで、1台のマシン内で共有ディレクトリを再マウントすることも可能です。その際に文字コード変換機能を使えば、共有ディレクトリのEUC-JPなファイル名をUTF-8に変換することができます。

sambaを使って文字コードを変換する例として、EUC_namesディレクトリにあるEUC-JPな文字コードのファイル名を、UTF-8に変換してUTF8_namesディレクトリにマウントしてみます。

Plamo-7.0に収録されているsambaパッケージをインストールすると、/etc/samba/smb.conf.distという設定ファイルのテンプレートが用意されるので、このファイルをsmb.confにコピーして、必要な設定を追加していきます。sambaの設定は多岐に渡るため、以下では一番シンプルな設定例を紹介します。

まず、[global]セクションに文字コードとログインアカウントに関する設定を追加します。"map to guest = Bad user"はパスワード無しでも接続を許可するための設定です。

[global]
  unix charset = EUC-JP
  guest account = nobody
  map to guest = Bad user

次に共有対象のディレクトリを指定します。

[EUC_names]
  comment = char code conversion test
  path = /home/kojima/EUC_names
  guest ok = yes

Plamo-7.0のsambaパッケージは、インストールしただけでは動作しないように起動用スクリプトの実行パーミッションを落しているので、このスクリプトに実行パーミッションを付与して、sambaサーバを起動します。起動用スクリプトに実行パーミッションを付けると、次回から起動時に自動実行されるようになります。

# chmod +x /etc/rc.d/init.d/samba
# /etc/rc.d/init.d/samba start
*  Starting nmbd...                                             [  OK  ]
*  Starting smbd...                                             [  OK  ]

localhost経由でこの共有をマウントする際、マウントのオプションとして文字コードをUTF-8に変換する設定(iocharset=utf8)を追加します。nobodyのPasswordは尋ねられるものの、そのままEnterキーを押せばマウントされます。

# mount //localhost/EUC_names ./UTF-8_names -o user=nobody,iocharset=utf8
Password for nobody@//localhost/EUC_names:
# 
# mount
/dev/sda3 on / type ext4 (rw,relatime,data=ordered)
devtmpfs on /dev type devtmpfs (rw,relatime,size=2019204k,nr_inodes=504801,mode=755)
....
//localhost/EUC_names on /home/kojima/UTF-8_names type cifs (rw,relatime,vers=default,
   cache=strict,username=nobody,domain=,uid=0,noforceuid,gid=0,noforcegid,addr=127.0.0.1,
   file_mode=0755,dir_mode=0755,iocharset=utf8,soft,nounix,serverino,mapposix,
   rsize=1048576,wsize=1048576,echo_interval=60,actimeo=1,user=nobody)

こうしておけば、EUC-JPな環境からはEUC_namesに置いたファイル名が、UTF-8な環境からはUTF-8_namesに置いたファイル名が、それぞれ正しく見えるようになります。図3は上下2つのターミナルを開いていて、上がEUC-JPな環境、下がUTF-8な環境です。それぞれ自分の環境に適合した文字コードのファイル名は正しく表示されていることがわかります。

図3 samba経由の文字コード自動変換
図3 samba経由の文字コード自動変換

このように、sambaを介すればロケールが異なる日本語ファイル名を共有することが可能になります。今回はローカルなディレクトリを再マウントしたものの、NFS経由でマウントしたディレクトリをsamba経由で再マウントする、といった指定も可能なので、工夫しだいでさまざまな使い方ができるでしょう。


この連載で紹介しているPlamo-7.0b1のDVDイメージを筆者が管理しているサーバで公開しています。DVDイメージは2枚組なものの、2枚目はtetexとオプショナルなパッケージ群なので、TeX環境が不要な方は1枚目のDVDイメージのみでインストール可能です。

ドキュメントまわりは未整備なので、Plamo Linuxをご存知ない方にはやや敷居が高いかも知れませんが、Plamo Linuxのメーリングリストには親切な先輩方が多数いるので、興味を持たれた方はぜひ試してみてください。

おすすめ記事

記事・ニュース一覧