【Rails】CSVをエクスポート→エクセル で文字化け問題

  • 27
    Like
  • 6
    Comment
More than 1 year has passed since last update.

** 結論から言うと出回ってる解決策では、完璧には解決しないように思われます。
いろいろ解決策求めてここにたどり着いた方は、一番下に書いた結論のように方向転換して調査することをお勧めします。

以下概要。

問題

CSV形式で作成したファイルの日本語文字が、ダウンロードからダブルクリックすると(railsのデフォルト文字コードutf-8だと)エクセル上で文字化けしてしまう。

原因

いたってシンプル。
エクセルが、utf-8に対応していないから。

解決策らしきもの

以下解決策らしかったけど解決してくれなかったもの。

Mac版エクセルでも、Win版エクセルでも両方対応するためには、UTF-16LEでないといけないらしい。
→ 記事通りにencode変える+BOMつける。

def csv_download
  column_names = ["事業部名"]
  bom = "\xFF\xFE".force_encoding("UTF-16LE")
  respond_to do |format|
    format.csv{ send_data bom + column_names.to_csv.encode("UTF-16LE"), filename: "filename.csv", type: 'text/tsv' }
  end
end

これで,UTF-16LEの文字コードのファイルをダウンロードすることに完了。(ダウンロードして、そのファイルの文字コードがUTF-16LEだった。)

file --mime fliepath

でencode確認できる。

charset=utf-16le

ダウンロードしたやつが、utf-16leだった!!きた!!!!

(file --mineでencode確認してるが、それでうまくいかないときはnkfっていうのinstallして、nkf --guessとかでみれる。)

しかし!!!これをmacエクセルで開くと。。。。

"業"が化けてる...。

たしかに、他の文字で試したところ、ほとんど化けないことのほうが多い、だから、記事でUTF-16LEがいい!って言ってる人らは勘違いしてると思われる。

現状調べている感じでは、UTF-16LE以外に、日本語onCSV→excelでうまくいきそうな文字コードは見つかってない。しかし、UTF-16LEを使っても文字化けする文字は上記のように存在するので、それを使うのは少々危険すぎるかと。

結局どうすればいいか

① 英語のみにする。日本語とかいうマイナー言語使わん。
② csvで出力するのをやめる。Excelとか。(やめた場合、他の形式で文字化けなくうまくいくかは調査の必要あり。)
③ UTF-16LE以外でうまくいきそうな文字コードを見つける

の3策。好きなものを選びましょう。