この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
Railsで出力したCSVファイルがExcelで文字化けを起こしてしまった場合にBOMを付けて対応する方法をまとめました。
はじめに
またまた1か月ぶりの投稿となります、むらさきです。探していたSwitchも無事購入できて同期と日々インクを掛け合ってます。
さて、データベースに入っているデータをCSVファイルにUTF-8で出力してExcelで見られるようにしたい!と思い実装してみたところ盛大に文字化けしていた…なんて経験誰もが1度は体験したことがあると思います。
文字化けした文字を解読して読んでやる!…と挑戦した経験も1度ではないと思います。
ですが、僕に文字化けを解読する能力は備わってなかったようなので、今回はUTF-8の文字コードにBOMを付けて、出力する段階で文字化けしないようにする方法をまとめようと思います。
目次
- BOMとは?
- CSVをUTF-8で出力する
- 終わりに
1.BOMとは?
BOMとは、バイト・オーダー・マーク(Byte order mark)の略で、Unicodeの符号化形式で符号化したテキストの先頭に着ける数バイトのデータのことです。
ExcelはCSVファイルを開くときデフォルトでShift-JISで開きに行ってしまいUTF-8では確実に文字化けしてしまいます。ですがUTF-8で出力する際にこのBOMを付けることでExcelにUTF-8で書かれていると認識させることができます。
2.CSVを出力する
今回は適当な日本語をBOM付きUTF-8とBOM無しUTF-8でCSV出力してExcelで文字化けしているかどうかを確認するところまでやりたいと思います。
まずはBOM無しCSVを出力します。
require 'csv'
def csv_export
File.open(path + 'test_doruby.csv', "w:UTF-8") do |f|
csv_data = CSV.generate do |csv|
csv << csv_text
end
f.write(csv_data)
end
end
def csv_text
[
"これは",
"UTF-8の",
"BOMなしの",
"testです"
]
このメソッドを実行すれば、pathに指定した場所に”test_doruby.csv”がUTF-8で作成されるのでそれをExcelで開いてみます。
案の定日本語の部分が無駄に画数の多い漢字の羅列に置き換わりました。先ほど述べたようにUTF-8をShift-JISで開きに行っているからです。
では次に先ほどのコードを書き換えてBOMを付けます。
require 'csv'
def csv_export
File.open(path + 'test_doruby_bom.csv', "w:UTF-8") do |f|
bom = "\uFEFF"
csv_data = CSV.generate(bom) do |csv|
csv << csv_text
end
f.write(csv_data)
end
end
def csv_text
[
"これは",
"UTF-8の",
"BOMありの",
"testです"
]
bom = "\uFEFF"
と宣言し、CSV.generateの引数に渡すことでBOMを付けることができます。
BOMを付けたファイルをExcelで開いてみると
文字化けなく表示することができました。
3.おわりに
いかがだったでしょうか、今回紹介した方法以外にもWindowsのメモ帳で表示してから保存し直すなど、BOMを付ける方法はありますが何度も出力する必要がある場合はこちらの方が手間が1度でいいので良いと思います。自分の状況にあった方法を選択してください。