「〜」が 「潤オ」に化ける。

サーバにあるファイルをほぼそのまま表示するCGIを書いていたら、IEで表示した時に「〜」が 「潤オ」に化けていた。EUC-JPには「〜」のバイト表現が二つあって、ひとつは a1 c1、もうひとつは 8f a2 b7。後者はJIS補助漢字(JIS X 0212)で、Windowsのコードページ 51932(EUC-JP相当)では対応していない。秀丸でもIEでも化けて表示される。
問題となるファイル名ができた原因は、samba 3.0から文字コード変換が変わったせいらしい。元の動作とほぼ同じ状態に戻すのに

  • /usr/bin/iconv -l | grep -i eucEUC-JP-MS が存在するか確認、なければiconvをいじる
  • smb.conf を unix charset = EUC-JP-MS のように変更

でうまくいった。環境によってはGNU iconvを入れる必要があるそうだ。
既存のファイルの一部の名前がヘンなバイト表現のまま残ってるが、sambaのクライアント側では問題なさそう。サーバ側では表示CGIを少し変更して誤魔化した。
表示文字列だけ s/$eucpre\x8f\xa2\xb7$eucpost/\xa1\xc1/g;
ほんとは他にも処理するべき文字がいくつかあるんだけど、そっちは放置している。