Windows上のRubyでUnicodeファイル名をglobできるようになっていた
Ruby 1.9.2 から、WindowsのDir.globでSJIS範囲外のファイル名も取得できるようになったらしい。
「森鷗外.txt」ファイルがあるディレクトリでの例↓。パターン文字列をUnicodeのエンコーディングにすれば良いらしい。
> irb Dir.glob("*.txt".encode('utf-8')) # => ['\u68EE\u9DD7\u5916.txt'] Dir.glob("*.txt".encode('utf-8')).map {|f| f.encoding } # => [#<Encoding:UTF-8>] Dir.glob("*.txt".encode('utf-8')) {|f| File.delete f } # => (問題なく削除される)
エンコーディングを変えないと今まで通りWindows-31Jのままなので、範囲外の文字が ? になってしまう。
> irb Dir.glob("*.txt") # => ['森?外.txt'] Dir.glob("*.txt").map {|f| f.encoding } # => [#<Encoding:Windows-31J>] Dir.glob("*.txt") {|f| File.delete f } # => Errno::EINVAL (invalid argument)
マニュアルには載ってないけど、パターン文字列と同じエンコーディングでファイル名を取得するようになった、ということかな?