みかづきメモ

学習したことのメモとか、日記とか、備忘録。

rubyzip で、日本語パスを含んだファイルを解凍する

どうやら、 rubyzip で日本語を含むファイルの zip を解凍すると、いろいろ死ぬっぽい。

その対策。


下のような構成のファイルを解凍すると、なにか色々おかしくなる。

ruby.zip
|-テスト
| |- 画像001.png
| |- memo.txt

解凍後は、下のように色々変になる。

ruby
|-?e?
| |- ??e001.png
| |- memo.txt

解決方法は単純で、前回と同じく文字コード周り

# coding: utf-8
require 'zip'
require 'kconv'

Zip::InputStream.open("ruby.zip") do |zis|
  loop do
    entry = zis.get_next_entry
    break if entry.nil?

    path = File.join("unzip", entry.name).toutf8
    if entry.file? && !entry.name.toutf8().end_with?("/")
      File.binwrite path, zis.read
    else
      FileUtils::makedirs path
    end
  end
end

厄介なのが、なぜかentry.file?が true なにもかかわらず、ディレクトリのパスが降りてくることがあるので、 entry.name.toutf8().end_with?("/")で、弾くようにした。