ExcelってなぜかShift_JISでcsvを読み込むので、UTF-8で生成すると文字化けするんですよね。
業務でわりとShift_JISのcsvを作るケースがあるのでgem化しました
csv_sjis | RubyGems.org
https://rubygems.org/gems/csv_sjis
halenohi/csv_sjis | github.com
https://github.com/halenohi/csv_sjis
使い方
data = [
['名前', '年齢'],
['こうぞう', 29]
]
file_path = Pathname.new(File.dirname(__FILE__) + '/sample.csv')
CSVSjis.open(file_path, 'w') do |csv|
data.each do |row|
csv << row
end
csv.close
end
file_path.read # => "名前","年齢"\n"こうぞう",29\n
デフォルトでencodingがShift_JISに設定されてます
UTF-8で保存したければオプションを指定します
CSVSjis.open(file_path, 'w', encoding: 'UTF-8') do |csv|
csv << row
csv.close
end
変換できない文字の対応
UTF-8からShift_JISに変換できない文字がある場合普通だと Encoding::UndefinedConversionError
という例外が発生してしまうんですが、?
にreplaceされるようにしています。
この部分はこちらを参考にさせていただきました
Ruby - CSV.open で Encoding::UndefinedConversionError になる場合 - Qiita
http://qiita.com/kano-e/items/19df487e163c606bd652
が、しかしあまり?
になってほしくはないので事前に互換性のある文字に置換するようにしています。
置換する文字は以下のように対応しています
- => -
~ => ~
この部分はこちらを参考にさせていただきました
Ruby - UTF-8からShift_JISに変換する時の注意 - Qiita
http://qiita.com/akkun_choi/items/a1fbde5d6d065df3fc97
Unicodeの似た文字を整理してみた - y-kawazの日記
http://d.hatena.ne.jp/y-kawaz/20101112/1289554290
まだまだ置換の対応が不十分だと思うので新しい文字を見つけ次第追加して育てていきたいと思います。