===[ Программы ]=== #post-id: 5477-04-59 #original-date: 25.07.2015 Sat #original-time: 4:59 AM #original-day: 5477 #original-host: WinXP Home SP3 (Build 2600) В новой версии Руби под Windows выяснилось, почему кириллица в командной строке больше не проблема. Для начала программа получает юникодную командную строку при помощи функции GetCommandLineW(). Здесь использована W функция для получения командной строки в UTF-16 вместо ANSI. Потом она пуляет её в функцию, которая занимается парсингом. https://github.com/ruby/ruby/blob/613d97c5253e8baa7998702c26c0ffdbf56dd3c7/win32/win32.c#L774 Обратите внимание на флаг CP_UTF8 - он означает, что после парсинга командная строка из UTF-16 будет перегнана в UTF-8 и дальше будет использована в таком виде. После дробления на составляющие, программа командует конвертировать UTF-16 строки параметров в указанную кодировку, тоесть, в UTF-8. https://github.com/ruby/ruby/blob/613d97c5253e8baa7998702c26c0ffdbf56dd3c7/win32/win32.c#L1747 В функции перекодирования находится простой WideCharToMultibyte(), который и делает указанную работу. https://github.com/ruby/ruby/blob/613d97c5253e8baa7998702c26c0ffdbf56dd3c7/win32/win32.c#L1968 Дальше не интересно. О чём это говорит? Авторы Windows билда Руби теперь в курсе, что юникод в Win32 API существует в UTF-16, и командная строка приложения прилетает в программу именно в этом формате. Кроме того, авторы правильно проводят парсинг и конвертируют текст в кодировку, которая уже дальше используется тем самым кроссплатформенным кодом. Заодно авторы отвечают на вопрос: «А чё, винда не умеет UTF-8?» Но всёже можно было заюзать CommandLineToArgW() и не мучиться.