В новой версии Руби под Windows выяснилось, почему кириллица в командной строке больше не проблема. Для начала программа получает юникодную командную строку при помощи функции GetCommandLineW(). Здесь использована W функция для получения командной строки в UTF-16 вместо ANSI.
Потом она пуляет её в функцию, которая занимается парсингом.
https://github.com/ruby/rub...7/win32/win32.c#L774
Обратите внимание на флаг CP_UTF8 - он означает, что после парсинга командная строка из UTF-16 будет перегнана в UTF-8 и дальше будет использована в таком виде.
После дробления на составляющие, программа командует конвертировать UTF-16 строки параметров в указанную кодировку, тоесть, в UTF-8.
https://github.com/ruby/rub.../win32/win32.c#L1747
В функции перекодирования находится простой WideCharToMultibyte(), который и делает указанную работу.
https://github.com/ruby/rub.../win32/win32.c#L1968
Дальше не интересно.
О чём это говорит? Авторы Windows билда Руби теперь в курсе, что юникод в Win32 API существует в UTF-16, и командная строка приложения прилетает в программу именно в этом формате. Кроме того, авторы правильно проводят парсинг и конвертируют текст в кодировку, которая уже дальше используется тем самым кроссплатформенным кодом. Заодно авторы отвечают на вопрос: «А чё, винда не умеет UTF-8?»
Иными словами авторы плюют в лицо всем графам, дедфудам и прочим любителям программ «изначально проектирующихся под UTF-8», тоесть дважды делают всё правильно.
Но всёже можно было заюзать CommandLineToArgW() и не мучиться.
Где все?