うちの会社のFreeBSDは互換性の検証が面倒なので、ずいぶん古いバイナリがいくつか転がっています。Sambaも FreeBSD 4.8 の時代にコンパイルしたsamba2なので(^_^)、今後 freebsd-update を使うとなるとハマるだろうなーとおもって更新してみました。
ついでに漢字コードをSJISからUTF-8にしたのでターミナルからはずいぶん扱いやすくなったのですが、メールの通知を smbclient -M でWindowsのメッセンジャーサービスに送っている部分が動かなくなりました。samba2 の smbclient と比べると -t オプションが機能しなくなっているものの、事前のテストでは UTF-8 で送ってやればよかったのだけれど・・・。と思いつついろいろ試してみると、どうも nkf で UTF-8 にすると動かなくなるようです。
% echo "Hello" | hd 00000000 48 65 6c 6c 6f 0a |Hello.| 00000006
% echo "Hello" | nkf -w8 |hd 00000000 ef bb bf 48 65 6c 6c 6f 0a |...Hello.| 00000009
あり? テストしたときは UTF-8 なコマンド行から直接 echo で送っていたのですが、procmailからsmbclientに渡すのにはnkfが必要なので、ここで先頭になんかへんなのがくっついたようです。ちなみに、nkf のマニュアルを読み返してみるとこうありました。
-w -w8[0] -w16[BL][0]
Unicode を出力する。
-w -w80
UTF8 コードを出力する。 (BOM 無し)
-w8 UTF8 コードを出力する。
はへ? BOM ってナニ? 爆弾?? と思って調べてみると、Byte Order Markというもので、本来はUTF16などでコードのバイト並び順を特定するものなのだそうですが、関係ないはずのUTF8でも文字コードがUTF-8であることを特定するのに有効なのだそうな。ただ、当然のことながら先頭に付いてるのだから、実装の仕方によって(というかUTF8に対応してるかどうかによって) BOM が付いてると問題がある場合・付いてないと判定を誤る場合があるらしい。でもって Windows XP のメッセンジャーサービスはBOMがあると動かないと(T^T)。
てことで、nkf のオプションを -w8 から -w に書き換えると動いてくれました。てゆーか、UTF-8の出力は -w8 しか無いと思っていたのですが、-w と -w8 を BOMの有無で使い分けなくちゃいけなかったのですな。ぜんぜん知りませんでした。
% cat /etc/rc | nkf -w8|file -
/dev/stdin: Unicode text, UTF-8
SJISやEUCでは漢字コードを除去したテキストファイルに差異はなかったのですが、UTF-8の場合 そうとは限らないのですな。ちょっと曲者かもです。