Ruby1.9でcsvファイルをダウンロード(エンコード問題にも対応)

Ruby1.9系 Rails3でcsvファイルをダウンロードする(エンコード問題にも対応)

Rails 3.2.3
ruby 1.9.3

下記ソースでひとまず動いている

require 'kconv'
require 'csv'

columns = Person.all
file_name = Kconv.kconv("sample.csv", Kconv::SJIS)
header = ["名前1", "名前2", "登録日"]

 #※1
csv_data = CSV.generate("", {:encoding => 'sjis', :row_sep => "\r\n", :headers => header, :write_headers => true}) do |csv|
      columns.each do |line|
        column = []
        column << line[:name].encode('UTF-8','Shift_JIS') #※2
        column << line[:name].force_encoding('UTF-8')     #※3
        column << line[:created_at].strftime("%Y年%m月%d日")
        csv << column
      end
    end
    #※4
    csv_data = csv_data.tosjis
    #※5
    send_data(csv_data, :type => 'text/csv; charset=shift_jis; header=present', :filename => file_name)

  ※1 :encoding ・・・ここで指定してもsjisでファイル生成されなかった。なんで?なので※4で対応
   :row_sep ・・・改行コードの指定。上はCR+LFの場合。
   :headers ・・・配列でヘッダを指定。
:write_headers ・・・ヘッダの有無を指定。
  ※2 下記のようなエラーが出た場合

invalid byte sequence in UTF-8

  ※3 下記のようなエラーが出た場合
    http://blog.livedoor.jp/yakisobakintoki/archives/51075070.html

incompatible character encodings: UTF-8 and ASCII-8BIT
C:/Ruby193/lib/ruby/1.9.1/csv.rb:1729:in `join'
C:/Ruby193/lib/ruby/1.9.1/csv.rb:1729:in `<<'

  2と3の違いはよくわからない...

  ※5これでダウンロード。第一引数のCSVデータがちゃんと渡せれば、後はブラウザの保存時のポップアップが表示される。