Issue #22194 has been reported by andrykonchin (Andrew Konchin). ---------------------------------------- Bug #22194: File.realpath and File.realdirpath handle differently path encoding incompatible to a filesystem's one https://bugs.ruby-lang.org/issues/22194 * Author: andrykonchin (Andrew Konchin) * Status: Open * Backport: 3.3: UNKNOWN, 3.4: UNKNOWN, 4.0: UNKNOWN ---------------------------------------- Both `realpath` and `realdirpath` methods accept a `path` parameter and try to return result in the `path`'s encoding. `realpath`: ```ruby File.realpath(".rubocop.yml").encoding # => #<Encoding:UTF-8> File.realpath(".rubocop.yml".encode("US-ASCII")).encoding # => #<Encoding:US-ASCII> ``` `realdirpath`: ```ruby File.realdirpath("src").encoding # => #<Encoding:UTF-8> File.realdirpath("src".encode("US-ASCII")).encoding # => #<Encoding:US-ASCII> ``` But it's possible that `path`'s encoding isn't compatible to the filesystem's one (that's is common to be UTF-8 on Linux and macOS), that's converting from the filesystem's encoding to `path`'s encoding fails. In this case `realpath` and `realdirpath` behaves differently - `realpath` just "forces" encoding to `path`'s one (and as fallback to filesystem's and then to binary if a string becomes broken) and `realdirpath` just returns a string in the filesystem's encoding. `realpath`: ```ruby File.realpath(".".encode(Encoding::ISO_8859_1), "test_dir_🦊").encoding # => #<Encoding:ISO-8859-1> ``` `realdirpath`: ```ruby File.realdirpath(".".encode(Encoding::ISO_8859_1), "test_dir_🦊").encoding # => #<Encoding:UTF-8> ``` It makes sense for the methods to handle this edge case consistently. -- https://bugs.ruby-lang.org/