質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

2回答

2379閲覧

【ruby】zip圧縮したエクセルを展開すると文字化け

kakeiteiya

総合スコア252

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2020/01/14 09:33

編集2020/01/14 09:34

##起こっている問題
画面からボタンを押すと下記の処理が流れるようになっています

ruby

1 def excel_download 2 Zip.unicode_names = true 3 data = Zip::OutputStream.write_buffer do |out| 4 out.put_next_entry("テスト_1.xlsx") 5 end.string 6 send_data data, type: 'application/zip', filename: 'test.zip' 7 end

zipがダウンロードされて、解凍すると
繝・せ繝・1.xlsx
と文字化けしています

##状況
binding.pryで文字コードを調べたところ、UTF-8になっていました。
"テスト_1.xlsx".encoding
=> #Encoding:UTF-8

また、send_dataのfilenameを日本語にしても文字化けしていました
send_data data, type: 'application/zip', filename: 'テスト.zip'

##対応したこと
以下の二つのようにして、それぞれ動作確認しましたが、エラーになりました
"テスト_1.xlsx".encode('SHIFT-JIS')
"テスト_1.xlsx".encode(Encoding::CP932)
####エラー内容
Zip::Error (local header size changed (46 -> 43)):

文字コードをどうにかすればいいと思うのですが、どうすればいいのでしょうか・・・
よろしくお願いします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ZIPに取り込まれたfileの名前の問題ですね?
こんなのを作ってます。 
引数 dir にある 拡張子 csv, xlsx のfileをZIPしたものをTempfileに書き出してます

def compress_dir dir,subdir temp_file = Tempfile.new("HOGE_ZIP") files = Dir.glob(dir+"/**/*{csv,xlsx}") Zip::File.open(temp_file.path, Zip::File::CREATE) do |zipfile| files.each do |file| filename = file.sub(/#{dir}//,"") if ENV["RAILS_ENV"] == "development" zipfile.add(filename, Rails.root+"tmp"+file) else zipfile.add(filename.encode("Shift_JIS"), Rails.root+"tmp"+file) end end end temp_file.path end

投稿2020/01/14 12:21

winterboum

総合スコア23329

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kakeiteiya

2020/01/16 09:32

ありがとうございます! こちらためしてみます!
guest

0

ベストアンサー

2つ解決策があります。

Zip内にutf8で格納し、utf8に対応しているアーカイバーで展開してもらう

config/initializers以下にzip.rbとでもして以下を付け加える。

ruby

1Zip.unicode_names = true
Zip内にcp932で格納し、windows環境もしくはcp932で展開できるアーカイバーで展開してもらう

ruby

1data = Zip::OutputStream.write_buffer(StringIO.new("".encode(Encoding::CP932)) do |out| 2 out.put_next_entry("テスト_1.xlsx".encode(Encoding::C932)) 3end.string 4# 以下略

投稿2020/01/14 16:17

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kakeiteiya

2020/01/16 09:31

ありがとうございます! 上の方法では何もかわりませんでした・・;; 下の方法ではエラーがでました・・ このエラーはどういういみなのでしょうか・・・ Zip::Error (local header size changed (46 -> 43)):
kakeiteiya

2020/01/20 02:24

すみません!この記述でできました! ありがとうございます data = Zip::OutputStream.write_buffer(StringIO.new("".encode(Encoding::CP932))) do |out| out.put_next_entry("テスト_1.xlsx".encode(Encoding::CP932)) end.string
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問