Поскольку вы используете MinGW (на самом деле MinGW-w64, но в данном случае это не имеет значения), у вас есть доступ к Windows API, поэтому следующее должно работать для вас. Вероятно, это могло бы быть чище и на самом деле протестировано должным образом, но, по крайней мере, оно должно дать хорошую идею:
#define _WIN32_WINNT 0x0600
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
#include <windows.h>
int main (void)
{
int argc;
int i;
LPWSTR *argv;
argv = CommandLineToArgvW(GetCommandLineW(), &argc);
if (argv == NULL)
{
FormatMessageA(
(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS),
NULL,
GetLastError(),
0,
(LPWSTR)&error, 0,
NULL);
fprintf(stderr, error);
fprintf(stderr, "\n");
LocalFree(error);
return EXIT_FAILURE;
}
for (i = 0; i < argc; ++i)
wprintf(L"argv[%d]: %ls\n", i, argv[i]);
// You must free argv using LocalFree!
LocalFree(argv);
return 0;
}
Имейте в виду одну проблему: Windows не будет составлять ваши строки за вас. Я использую свою собственную раскладку клавиатуры Windows, в которой используются комбинации символов (я странный), поэтому, когда я набираю
example -o àlf
в моей командной строке Windows я получаю следующий вывод:
argv[0]: example
argv[1]: -o
argv[2]: a\u0300lf
a\u0300
– это U+0061 (LATIN SMALL LETTER A)
, за которым следует представление кодовой точки Юникода U+0300 (COMBINING GRAVE ACCENT)
. Если я вместо этого использую
example -o àlf
который использует предварительно составленный символ U+00E0 (LATIN SMALL LETTER A WITH GRAVE)
, результат будет другим:
argv[0]: example
argv[1]: -o
argv[2]: \u00E0lf
где \u00E0
представляет собой предварительно составленный символ à
, представленный кодовой точкой Unicode U+00E0. Однако, хотя я могу быть странным человеком для этого, вьетнамская кодовая страница 1258 на самом деле включает в себя комбинирование символов. Обычно это не должно влиять на обработку имен файлов, но могут возникнуть некоторые трудности.
Для аргументов, которые являются просто строками, вы можете изучить нормализацию с помощью NormalizeString
. Документация и примеры, связанные с ней, должны помочь вам понять, как работает функция. Нормализация и некоторые другие вещи в Unicode могут оказаться долгим путешествием, но если вас это волнует, это также веселое путешествие.
person
Community
schedule
14.06.2015
argv
. Он кодирует командную строку, используя UTF-8 или ANSI? Если это ANSI, вам следует проверить, поддерживает ли MinGWwmain
для использованияwchar_t *
параметров. В противном случае просто игнорируйте ветхие строки ANSI (ИМХО, весь ANSI API в настоящее время является бесполезным мусором, который так часто приводит к моджибаке) и вызовитеCommandLineToArgvW
и вручную закодировать в UTF-8 черезWideCharToMultiByte
если вам нужноchar *
строк. - person Eryk Sun   schedule 14.06.2015GetCommandLineA
для получения копии командной строки в кодировке ANSI, и поэтому вы получаете моджибаке Ω => O, поскольку это самое близкое сопоставление вашего набора символов ANSI (вероятно, 1252) для греческого символа Omega. Это бесполезно. ИспользуйтеGetCommandLineW
,CommandLineToArgvW
иWideCharToMultibyte
для получения аргументов командной строки в кодировке UTF-8. - person Eryk Sun   schedule 14.06.2015