Issue #12340 has been updated by Tomoyuki Chikanaga.

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.

----------------------------------------
Bug #12340: Windows: File.truncate has two string encoding issues
https://bugs.ruby-lang.org/issues/12340#change-59206

* Author: cremno phobia
* Status: Closed
* Priority: Normal
* Assignee: 
* ruby -v: 
* Backport: 2.1: WONTFIX, 2.2: DONE, 2.3: DONE
----------------------------------------
`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.

~~~ruby
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.




-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>