あるUTF-8の文字列をiso-2022-jpに変換(NKF.nkfなどで)して、メールの件名に使うとヘッダが崩れる
●崩れる原因
変換後の文字列に「\n」が入り、これが改行とみなされてヘッダが崩れる。
例)
・encode.rb
require "base64" def encode( str ) "=?iso-2022-jp?B?" + Base64.encode64( NKF.nkf( '-j --utf8-input', str ) ).chomp + "?=" end #文字コードはUTF-8 str = "あいうえおかきくけこさしすせそたちつてと" p encode( str ) #=> "=?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQrJC0kLyQxJDMkNSQ3JDkkOyQ9JD8kQSREJEYkSBso\nQg==?="
↑変換後に「\n」の文字列が入っているので、これをメールの件名に利用すると、改行されてしまうので「\n」以降の文字列がメールの本文に入ってしまう。
●解決策
「\n」を「\\n」のようにエスケープすれば良い。
例)
・encode.rb
require "base64" def encode( str ) "=?iso-2022-jp?B?" + Base64.encode64( NKF.nkf( '-j --utf8-input', str ) ).chomp + "?=" end #文字コードはUTF-8 str = "あいうえおかきくけこさしすせそたちつてと" p encode( str ) #=> "=?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQrJC0kLyQxJDMkNSQ3JDkkOyQ9JD8kQSREJEYkSBso\nQg==?=" p encode( str ).gsub(/\n/,'\\n') if str #=> "=?iso-2022-jp?B?GyRCJCIkJCQmJCgkKiQrJC0kLyQxJDMkNSQ3JDkkOyQ9JD8kQSREJEYkSBso\\nQg==?="
↑「\\n」とエスケープされているので、改行されず、正しく件名が表示される。
●はまりポイント
・・・ p encode( str ).gsub(/\n/,'\\n') if str
↑nil.gsub(/\n/,'\\n')はエラーなので、if str は、 strが nil の時にエラーが起こらないようにするためのものである。