LoginSignup
11

More than 5 years have passed since last update.

Shift_JISのCSVを作成するCSVSjisというgemを作った

Last updated at Posted at 2014-12-11

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

まだまだ置換の対応が不十分だと思うので新しい文字を見つけ次第追加して育てていきたいと思います。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11