perlでメール送信時の いわゆる波ダッシュ「〜」問題

perlでメール送信時の いわゆる波ダッシュ「〜」問題

今更ながらまた波ダッシュ問題で悩まされた。
波ダッシュ「〜」と全角マイナス「−」で文字化けが発生する。

これまた、Windowsの問題なわけで、マカーである自分にはなかなか気が付かない罠。

で、 perlの波ダッシュの文字コード変換のまとめ - (゚∀゚)o彡 sasata299's blog を読むと、UTF-8<=>SJIS、UTF-8<=>EUCが書かれているのだけれど、どうやらJISもEUCと同じ挙動をするらしい。

メール送信スクリプトで問題が起きるのはこれが原因か。
で、まとめのリンク先にあった Perlで日本語(ISO-2022-JP)メールを送信(まとめ) - 名古屋で働くWebプログラマの覚書 に、素晴らしい正規表現を発見。

「〜 ‖ − ¢ £ ¬」という文字化け発生原因の文字を置き換えられる。

$val =~ tr/[\x{ff5e}\x{2225}\x{ff0d}\x{ffe0}\x{ffe1}\x{ffe2}]/[\x{301c}\x{2016}\x{2212}\x{00a2}\x{00a3}\x{00ac}]/;

他にも機種依存文字が含まれていた場合の解決方法や、MIME::Lite で smtp送信する場合、Return-Pathを有効にする方法 などperlでメールを送信する際ハマるところの解説があります。

もうひとつの解決策

Encodeモジュールを使わずに Unicode::Japanese を使うという解決策。

多彩な機能に惹かれて以前は使っていたのたけれど、標準モジュールである Encode を使うほうが良いというような記事や、Encodeの方が動作が軽いという事でUnicode::Japaneseを使わなくなっていた。

波ダッシュ問題の解決にUnicode::Japaneseでおkなんて思いもしなかったのでこれからは文字コード変換処理はUnicode::Japaneseでいこうと思う。