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

第98回 Plamo-7.0とUTF-8

この記事を読むのに必要な時間:およそ 4 分

ファイル名の文字コード

デフォルトの文字コードを変更することで生じる最大の問題は,既存の日本語ファイル名が表示できなくなることです。図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のメーリングリストには親切な先輩方が多数いるので,興味を持たれた方はぜひ試してみてください。

著者プロフィール

こじまみつひろ

Plamo Linuxとりまとめ役。もともとは人類学的にハッカー文化を研究しようとしていたものの,いつの間にかミイラ取りがミイラになってOSSの世界にどっぷりと漬かってしまいました。最近は田舎に隠棲して半農半自営な生活をしながらソフトウェアと戯れています。

URLhttp://www.linet.gr.jp/~kojima/Plamo/index.html

コメント

コメントの記入