Bug #12340
closedWindows: File.truncate has two string encoding issues
Description
File.truncate
calls rb_str_encode_ospath()
which returns a UTF-8 encoded Ruby string.
Then it passes a pointer to the underlying C string to truncate()
aka rb_w32_truncate()
.
At last the UTF-8 string is passed to CreateFile()
aka CreateFileA()
(ANSI).
This also means it doesn't support Unicode unlike (hopefully all) other File singleton methods.
s = "\u2603"
IO.write(s, '123')
File.truncate(s, 0) # Errno::ENOENT: No such file or directory @ rb_file_s_truncate - ☃
A possible fix is attached. I'm not sure about the test code. I also couldn't find any similar tests. The actual fix should be fine however.
Updated by usa (Usaku NAKAMURA) over 8 years ago
- Status changed from Open to Closed
Applied in changeset r54887.
- test/ruby/test_file_exhaustive.rb: test UTF-8 filename. see [Bug #12340]
Updated by usa (Usaku NAKAMURA) over 8 years ago
- Backport changed from 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN to 2.1: WONTFIX, 2.2: REQUIRED, 2.3: REQUIRED
I can't find your attached file :-P, but I've fixed now.
Updated by cremno (cremno phobia) over 8 years ago
Oops! The tests you've added are much more comprehensive than mine anyway. Thank you for the quick fix.
Updated by usa (Usaku NAKAMURA) over 8 years ago
- Backport changed from 2.1: WONTFIX, 2.2: REQUIRED, 2.3: REQUIRED to 2.1: WONTFIX, 2.2: DONE, 2.3: REQUIRED
ruby_2_2 r55347 merged revision(s) 54887-54889.
Updated by nagachika (Tomoyuki Chikanaga) over 8 years ago
- Backport changed from 2.1: WONTFIX, 2.2: DONE, 2.3: REQUIRED to 2.1: WONTFIX, 2.2: DONE, 2.3: DONE
ruby_2_3 r55400 merged revision(s) 54887-54889.