ひとりごと

新しい記事:[2478]  古い記事:[2476] 表示単位 :

ついったー[おとなり日記] かがみさん Y.Kumagaiさん

2009/05/15 (金)

・ BOM

うちの会社の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の場合 そうとは限らないのですな。ちょっと曲者かもです。

[つっこみ]

新しい記事:[2478]  古い記事:[2476] 表示単位 :
※このページへのリンクは自由です。リンクの方法については[つっこみ]で表示されるページの最後をごらんください。
たかたに(takatani@mars.dti.ne.jp)