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)

マニュアルには載ってないけど、パターン文字列と同じエンコーディングでファイル名を取得するようになった、ということかな?