Ruby 1.9.3でbom付きUTF8ファイルを出力する方法


使用しているrubyのバージョンはRuby 1.9.3p194です。
ソースコードは下記になります。
require 'kconv'
io = open("出力したいファイル名.csv","w")
doc = File.read("読みたいファイル名")
io.puts Kconv.toutf8(doc)
io.puts doc
io.close
これを実行するとwindows上のExcellで開くと日本語が文字化けしてしまいますが、
cotEditorで"UTF-8のときBOMも保存"のチェックボックスを入れて保存し直すと、
文字化けがなおります。"UTF-8のときBOMも保存"をruby上で処理するにはどうすればよろしいでしょうか?よろしくお願いします。
web上でいろいろ解決法を探しましたが、ruby 1.8がほとんどで、ruby 1.9では実行できません。ruby 1.8に戻れないので、1.9.3の解決法をお願いします。
また下記のサイトも参考にしましたが、文字化けがなおりませんでした。
http://d.hatena.ne.jp/wwwcfe/20101229/ruby19_encoding
http://hpcgi2.nifty.com/sakazuki/forum/wwwforum.cgi?id=4&az=thread&number=66
http://stackoverflow.com/questions/9886705/how-to-write-bom-marker-to-a-file-in-ruby
http://yohshiy.blog.fc2.com/blog-entry-9.html
P.S. iphone上でもcsvを表示させるため、どうしてもutf8での保存が必要です。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/08/02 10:29:22
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Cherenkov No.1

回答回数1504ベストアンサー獲得回数493

ポイント300pt

文字コード:UTF-16LE(BOM必須)
改行コード:CRLF
区切り文字:tab

追記:
shift_jisなファイルを読み込んで、BOM付きutf-8で保存。

io = open("出力したいファイル名.csv","w")
io.print("\xEF\xBB\xBF") #write BOM
doc = File.read("読みたいファイル名.csv", :encoding => Encoding::Shift_JIS).encode(Encoding::UTF_8)
io.puts doc
io.close
他1件のコメントを見る
id:Cherenkov

追記しました。こちらの環境ではbom付けに成功しました。

2012/08/02 00:30:44
id:Ganan

おお!解決しました♪どうもありがとうございました!!

2012/08/02 10:27:48

その他の回答1件)

id:Cherenkov No.1

回答回数1504ベストアンサー獲得回数493ここでベストアンサー

ポイント300pt

文字コード:UTF-16LE(BOM必須)
改行コード:CRLF
区切り文字:tab

追記:
shift_jisなファイルを読み込んで、BOM付きutf-8で保存。

io = open("出力したいファイル名.csv","w")
io.print("\xEF\xBB\xBF") #write BOM
doc = File.read("読みたいファイル名.csv", :encoding => Encoding::Shift_JIS).encode(Encoding::UTF_8)
io.puts doc
io.close
他1件のコメントを見る
id:Cherenkov

追記しました。こちらの環境ではbom付けに成功しました。

2012/08/02 00:30:44
id:Ganan

おお!解決しました♪どうもありがとうございました!!

2012/08/02 10:27:48
id:oil999 No.2

回答回数1728ベストアンサー獲得回数320

http://yohshiy.blog.fc2.com/blog-entry-9.html
この方法はRuby 1.9でもできましたが、何ができないのでしょう?

id:Ganan

実行すると
test.rb:3:in `[]=': can't convert Fixnum into String (TypeError)
from test.rb:3:in `write_bom'
from test.rb:10:in `block in <main>'
from test.rb:9:in `open'
from test.rb:9:in `<main>'
とエラーが出てきます。

2012/08/01 21:57:14
  • id:Cherenkov
    File.readしているファイルの文字コードは?
  • id:Cherenkov
    文字コードを指定して読み込む
    Ruby/簡単なファイルアクセス(読み書き)の方法 - TOBY SOFT wiki http://tobysoft.net/wiki/index.php?Ruby%2F%B4%CA%C3%B1%A4%CA%A5%D5%A5%A1%A5%A4%A5%EB%A5%A2%A5%AF%A5%BB%A5%B9(%C6%C9%A4%DF%BD%F1%A4%AD)%A4%CE%CA%FD%CB%A1
  • id:Ganan
    コメントありがとうございます。
    >File.readしているファイルの文字コードは?
    Shift_JISです。
    教えていただいた。サイトから
    doc = File.read("読みたいファイル名")を
    doc = File.read("ファイル名", :encoding => Encoding::UTF_8)
    に変更しても変わらずexcelで文字化けします。
    ファイル出力をio.puts Kconv.toutf8(doc)から
    io.puts docに変更したら、文字コードがShift_JISに変化してしまい、
    iphoneで開けなくなりました。
    File.binwrite("ファイル名.csv", doc)と出力を変更しても同じくShift_JISです。
    ご教授お願い致します。
  • id:a-kuma3
    書き出す方のファイルの open を、こういうふうにしてみたら、うまくいかないかな?

    io = File.open("hogehoge.csv", "w:BOM|UTF-8")
  • id:Cherenkov
    ファイルを読み込む際に、shift_jisからutf-8に変換するのは
    doc = File.read("読みたいファイル名", :encoding => Encoding::Shift_JIS).encode(Encoding::UTF_8)
    だと思うけど、bomを付ける所がわからん。
  • id:a-kuma3
    自前で付けるしかないのかも >BOM

    http://stackoverflow.com/questions/9886705/how-to-write-bom-marker-to-a-file-in-ruby

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません