FreeBSDでmsdosfs上の日本語ファイルを扱うには

MSDOSFSの日本語ファイル名に使われる文字コードはCP932(Shit_JIS)だが、これをFreeBSDでマウントするには少々の手間がかかる。
結論からいえば、現時点(2009/01/12)でUTF-8に変換すると問題があるため、EUC-JPに変換する。


具体的には、mount_msdosfsに-L, -Dオプションを与えて使う。

◎実行例

# dmesg|grep da0
Jan 12 12:37:10 onyx kernel: da0 at umass-sim0 bus 0 target 0 lun 0
Jan 12 12:37:10 onyx kernel: da0: <Maxtor OneTouch 0200> Fixed Direct Access SCSI-0 device 
Jan 12 12:37:10 onyx kernel: da0: 40.000MB/s transfers
Jan 12 12:37:10 onyx kernel: da0: 194480MB (398295040 512 byte sectors: 255H 63S/T 24792C)
<略>
# mount_msdosfs -o large -Lja_JP.eucJP -D CP932  /dev/da0s1 /mnt


これでファイル名はEUC-JPで表示されるので、LANG=ja_JP.eucJP;export LANGとしたうえで、ターミナルの設定を変えてやればOK。
UTF-8のターミナルでファイル名を確認したい場合には、nkf( /usr/ports/japanese/nkf)やiconv(/usr/ports/converters/libiconv)で変換する。


◎実行例

$ ls /mnt/Document/*.url
/mnt/Document/SUPPORT[Support Info.]Windows 2000 ???????.url
/mnt/Document/????????????????.url

$ ls /mnt/Document/*.url|iconv -f EUC-JP -t UTF-8
/mnt/Document/SUPPORT[Support Info.]Windows 2000 関連情報.url
/mnt/Document/ファイアウォール.url
$ 

nkfの場合にはiconvの代わりにnkf -Ewとする。

ファイル名の文字コード自体を変換したい場合には、convmv(ファイル名の文字コード変換)を使う。

なお、mount_msdosfsでUTF-8への変換時に発生する問題については下記のリンクを参照のこと。

"(FreeBSD-users-jp 91921) Re: Trouble in msdosfs UTF-8 conversion of japanese filename"

一部引用。

Q
cd9600 msdosfs ntfs などの CP932 なファイルシステム
日本語を含むファイルがある場合、UTF-8 に変換して mount する
(たとえば # mount_msdosfs -L ja_JP.UTF-8 ) と、日本語を
含むファイルへのアクセスがおかしいようです。

A
カーネル内部のコード変換が、バイト数が変化する変換に完全にはまだ
対応できていないためです( UTF-8 では漢字は 3 バイト)。EUC への
変換で回避するか、imuraさんによる kiconv enhancement パッチ
http://people.freebsd.org/~imura/kiconv/
を自分で当てて、対応したカーネルを作成する必要があります。