UTF-8 -> ISO-2022-JP
私のメール環境は、WindowsのノートPCからLinuxサーバにPuttyを使ってsshでログインして、VimやMuttを使ってメールを読み書きしています。このときの端末の文字符号化方式はUTF-8にしています。この環境でメールを書いているときに時々問題が生じます。それはUTF-8でメールが送られてしまうことがあることです。次の7文字(というかグリフ)はWindowsとLinux(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 |
このままでは相手に迷惑をかけることがあるのですが、結構長い間放置していました。しかし、先ほど、気が向いたのでPerlでVimのラッパースクリプトを書いてみました。使い方は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);