Bug #22194
Updated by andrykonchin (Andrew Konchin) 3 months ago
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 with 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.