mkisofs の漢字コード問題とパッチ

更新履歴
著者       NOBORU
1. mkisofs の漢字コード問題について

 mkisofs というのは CDRTOOLS の一部で、CD-R を焼く前にイメージファイルを作るためのプログラムなのですが、これで Windows などでよく使用されている Joliet 形式を指定して日本語 EUC のファイル名のファイルをイメージファイルにしてそれを焼くと Windows 側でその CD-R を見たときに漢字の部分が全部アンダーバーになってしまってました。

こ、これはいかん

と思い、改造を試みて無事改造が終りましたのでパッチを公開します。これは CDRTOOLS 2.0 に対するパッチです。 CDRTOOLS 2.0 については ftp://ftp.berlios.de/pub/cdrecord/ から貰って来ましょう。 下記のパッチは cdrtools-2.00.tar.gz と cdrtools-2.00.3.tar.gz に対応しています (何らかの事情があってどうしても古いバージョンでなければならない場合以外は新しい cdrtools-2.00.3.tar.gz の方を貰って来ましょう)。

 尚、このパッチは Linux 2.4 のカーネルソースの fs/nls/ 以下からガバッとコピーしてきてちょこちょこと書き直して組み込んだもので、当前ですが、ライセンスは Linux カーネルと同じ GPL V2.0 (日本語訳) で配布です。著作権は私にありますが一切の保障はありませんのでご注意下さい。

2. パッチ

 以下のファイルです。

noboru_nls_patch_20030714.txt.gz

3. やり方

ダウンロードした cdrtools-2.00.3.tar.gz (または cdrtools-2.00.tar.gz) と noboru_nls_patch_20030714.txt.gz が同じディレクトリにあるとします。

4. 使い方

 mkisofs と同じなので全ての詳細は書きません。違いは -input-charset で指定できるコードセット名です。以下のコードセット名が指定できます。
big5
gb2312
euc-kr
sjis
euc-jp
utf8
tis-620
koi8-u
koi8-r
iso8859-9
iso8859-8
iso8859-7
iso8859-6
iso8859-5
iso8859-4
iso8859-3
iso8859-2
iso8859-15
iso8859-14
iso8859-13
iso8859-1
cp950
cp949
cp936
cp932
cp874
cp869
cp866
cp865
cp864
cp863
cp862
cp861
cp860
cp857
cp855
cp852
cp850
cp775
cp737
cp437
cp1255
cp1251
cp1250
 尚、私は euc-jp 以外をテストしていません。その他は出来るかどうかよくわかりませんが多分出来ると思います。つまりうまく行けば韓国語だろうが中国語だろうがなんでもこいと言った状態になるわけです。めでたしめでたし。

5. 使用例

 こんな風にすると日本語 EUC の漢字ファイル名があってもちゃんと Linux でも Windows でも漢字でファイル名を見れるようになる筈です。

mkisofs -r -J -R -input-charset euc-jp -o myimage.iso your/image/src/dir

6. テストしたOSとマシン、及び注意

OS: RedHat Linux 8.0 (Kernel kernel-2.4.20-13.8)
マシン: CPU Celeron 1.7MHz, Memory 256M, HDD 40G + 120G

CD-R に Joliet 形式で漢字ファイル名が書かれているかどうかの確認は Windows Me または Windows Xp Home Edition の入っているマシンで見てみました。

その他ではテストしてません。また -input-charset euc-jp 以外でのテストをしていません。


更新履歴
2003年7月16日(水) N.Yamamoto さんが Windows XP の Cygwin 上でコンパイルをした結果をメールで教えてくれました。 下記のようにするとなんとかなるそうです (以下、メールからの引用)。
WinXP でコンパイルする場合、 mmap works to get shared memory で CPU を使い果たしますが、タスクマネージャで CPU の高い方の conftest.exe を殺せば、判定結果は no になりますが、一応最後まで コンパイルできました。
情報どうもありがとうございます。
2003年7月14日(月)
  1. N.Yamamoto さんより修正パッチを頂きましたのでマージしました。
    下記の点が修正されています。
    • Cygwin (Win2k 上) でコンパイルできるようにした。
    • mkisofs で半角カナを含むファイル名を rockridge に正しく記録できるようにした。
    • isoinfo を新しい libunls の形式に変更し動作するようにした。
    パッチありがとうございました。

    しかし、Windows XP Home Edition の最新版 Cygwin で make してみたら "checking if mmap works to get shared memory..." の所で停止したままになりました。 原因はよくわかりませんが駄目なこともあるようです (Windows XP だからかな? あるいは Cygwin が新しすぎたか?)。

  2. ケネスさんという香港から来られた方からメールがありました。 「-input-charset で big5 を指定して作った CD-R を 繁体中国語版 Windows で見て漢字ファイル名も問題無し」 だそうです。テストレポートありがとうございました。
2003年6月16日(月) 同じく韓国の方からバグの指摘がありましたが、 仕事で忙しくて詳しく調べる暇がありませんでした(すいません)。 しかしようやっと原因が判明し修正しました。 joliet_strlen() 関数の作りが iso8859-1 などの 1 バイトで 1 文字を現す文字セットにしか対応しておらず、(漢字などの) 元が多バイトの文字が混ざると正常に文字数をカウント出来て いませんでした。その結果 CD-R に焼いたあとでディレクトリ 以下のファイルが見れないなどの症状が出ていました。
2003年5月13日(火) (おそらく韓国の方から英語で)「-V で Volume ID が入らない」 といった内容のメールが来たので調べた。 すると Joliet format では -V によって Volume ID をコピーするように作られていないことが分かった。 (オリジナルのソースがそうなっていた。これはバグか? 仕様か? 今のところ不明)。 とにかく -V でうまく行くように修正したパッチを作った。 この修正がないと焼いた CDR を Windows マシンで見たときに CD 名が出てこない。 この頃 Linux マシンばかりいじってて気づかなかったよ。
2003年2月 2日(日)初版完成

*--- 以下宣伝 ---*
Linux大ダコクラブ に入ろう!! [MLの詳細]
メールアドレス
Linux Programmers ML に入ろう!! [MLの詳細]
メールアドレス