ある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 の時にエラーが起こらないようにするためのものである。