🍣

[Bug #21561] Windows 環境で File 関連のメソッドの戻り地のエンコーディングが一貫していないバグ報告

に公開

[Bug #21561] Wrong encoding for File.dirname result on Windows

  • Windows 環境で非 ASCII 文字を含む à_signaler ディレクトリの配下でファイル関連のメソッドを呼び出したときに戻り値の文字列のエンコーディングが UTF-8 ではなくて US-ASCII になるというバグ報告
def dirname_encoding(file)
  h = {
    "file" => file,
    "File.dirname(file)" => File.dirname(file),
    "File.expand_path(file)" => File.expand_path(file),
    "File.expand_path(File.dirname(file))" => File.expand_path(File.dirname(file)),
    "File.dirname(File.expand_path(file))" => File.dirname(File.expand_path(file)),
  }
  puts
  h.each do |name, value|
    puts "#{name} = #{value.inspect} (#{value.encoding})"
  end
end

dirname_encoding "foo.bar"
dirname_encoding "foo/bar"
file = "foo.bar" (UTF-8)
File.dirname(file) = "." (US-ASCII)
File.expand_path(file) = "D:/à_signaler/foo.bar" (UTF-8)
File.expand_path(File.dirname(file)) = "D:/\xE0_signaler" (US-ASCII)
File.dirname(File.expand_path(file)) = "D:/à_signaler" (UTF-8)

file = "foo/bar" (UTF-8)
File.dirname(file) = "foo" (UTF-8)
File.expand_path(file) = "D:/à_signaler/foo/bar" (UTF-8)
File.expand_path(File.dirname(file)) = "D:/à_signaler/foo" (UTF-8)
File.dirname(File.expand_path(file)) = "D:/à_signaler/foo" (UTF-8)
  • 上記だと File.dirname("foo.bar")File.expand_path(File.dirname("foo.bar"))US-ASCII になっている
  • これは .US-ASCII として判定されているのが原因みたい
  • エンコーディングが異なるよりも一貫している方がよいということで開発版の Ruby 3.5-dev では修正済み
GitHubで編集を提案

Discussion