UTF-8 -> ISO-2022-JP

私のメール環境は、WindowsのノートPCからLinuxサーバにPuttyを使ってsshでログインして、VimMuttを使ってメールを読み書きしています。このときの端末の文字符号化方式UTF-8にしています。この環境でメールを書いているときに時々問題が生じます。それはUTF-8でメールが送られてしまうことがあることです。次の7文字(というかグリフ)はWindowsLinux(glibc)ではISO-2022-JPでの同じグリフの文字に変換できるUnicode上の文字コードが異なります。そのため、Windows上で入力した「〜」等の文字がLinux上ではISO-2022-JPに変換できません。Mutt文字コードの変換に失敗するとロカールあるいはMuttの設定に従ってUTF-8に変換します。そういうわけで時々UTF-8でメールを送ってしまうことがあります。

グリフ Windows Linux(glibc)
2015 2014
2225 2016
ff0d 2212
ff5e 301c
¢ ffe0 00a2
£ ffe1 00a3
¬ ffe2 00ac

このままでは相手に迷惑をかけることがあるのですが、結構長い間放置していました。しかし、先ほど、気が向いたのでPerlVimのラッパースクリプトを書いてみました。使い方はmuttrcに「set editor="vim-wrapper"」のように記述を加えるだけです。

#!/usr/bin/perl -w
# vim-wrapper
use strict;
my $filename = $ARGV[0];
my $mtime1 = -f $filename ? (stat($filename))[9] : 0;
system("vim $filename");
my $mtime2 = -f $filename ? (stat($filename))[9] : 0;
exit if (! -f $filename or $mtime1 == $mtime2);
my $tmpfile = $filename . '.tmp';
open(TMPFILE,"> $tmpfile");
open(FILE,"< $filename");
while() {
    s/\xe2\x80\x95/\xe2\x80\x94/g;
    s/\xe2\x88\xa5/\xe2\x80\x96/g;
    s/\xef\xbc\x8d/\xe2\x88\x92/g;
    s/\xef\xbd\x9e/\xe3\x80\x9c/g;
    s/\xef\xbf\xa0/\xc2\xa2/g;
    s/\xef\xbf\xa1/\xc2\xa3/g;
    s/\xef\xbf\xa2/\xc2\xac/g;
    print TMPFILE $_;
}
close(FILE);
close(TMPFILE);
rename($tmpfile,$filename);