Передача аргументов командной строки Unicode в консольное приложение - PullRequest
2 голосов
/ 26 марта 2012

Я пытаюсь написать консольное приложение, которое может принимать аргументы имени файла и хотеть, чтобы оно могло обрабатывать имена файлов Unicode. Проблема в том, что я не могу понять, как это проверить.

Как передать аргументы Unicode в консольное приложение?

Я попытался создать пакетный файл Unicode, который вызывает программу, передавая ей несколько символов Unicode, но он не работает; командная строка вообще не может запустить программу, потому что она встречается с нулевыми символами в имени файла. Я попытался изменить кодовую страницу на 65001 и Alt, набрав символ Unicode в командной строке, но это тоже не сработало.

Ниже приведен пример программы. Я пытаюсь найти способ получить следующий вывод:

C:\> unicodeargtest Foobar
46, 0, 6f, 0


// UnicodeArgTest.cpp
#define UNICODE
#include <tchar.h>
#include <stdio.h>
int wmain (int argc, wchar_t**argv) {
    printf("%x, %x, %x, %x\n", argv[1][0], argv[1][1], argv[1][2], argv[1][3]);
}

Ответы [ 2 ]

1 голос
/ 26 марта 2012

Drag-and-drop должен помочь.В проводнике перетащите файл, имя которого вы хотите передать в качестве аргумента, в исполняемый файл теста.(Вы можете сначала захотеть изменить исполняемый файл так, чтобы он ждал перед выходом.)

1 голос
/ 26 марта 2012

О, блерг!Это случилось снова.Я родом из ассемблера, поэтому иногда некоторые вещи из C ++ приводят меня в замешательство.Одна вещь, которую я постоянно забываю, это то, как в C ++ компилятор может автоматически компенсировать размеры шрифтов при вычислении индексов, указателей и т. Д.

Например:

DWORD dwa[4] = {1,2,3,4};
//dwa[2] references the third DWORD in the array (i.e., the ninth BYTE),
//NOT the second BYTE in the array

или

struct EGS {
    char  str[5];
    int   num;
};
EGS   eg = {0};
EGS* peg = &eg;
peg++;
//peg is incremented by a whole EGS’ worth of bytes, NOT just 1
//for EGS, it is increased by 12 (5+4=9, rounded to the nearest 4, equals 12)

В этом случае, поскольку аргументы интерпретируются как широкие (2-байтовые) символы, argv[1][1] не является нулевым символом, это второй символ Юникода.

Использование программы каки передав символ Unicode, я получаю следующее:

C:\>unicodeargtest ‽‽‽‽
203d, 203d, 203d, 203d

Я просто вставил interrobangs в командную строку.В моем обычном режиме командной строки (с использованием растровых шрифтов и кодовой страницы 437) они отображаются как ? вместо , но все равно дают те же результаты.

Приведя аргументы к char или BYTE следующим образом:

printf("%x, %x, %x, %x\n",
    ((BYTE*)(argv[1]))[0], ((BYTE*)(argv[1]))[1],
    ((BYTE*)(argv[1]))[2], ((BYTE*)(argv[1]))[3]
);

, я получу ожидаемые результаты:

C:\>unicodeargtest ‽‽‽‽
3d, 20, 3d, 20

C:\>unicodeargtest Foobar
46, 0, 6f, 0

Вставка символов Unicode работает, но использование командного файла все еще не работает.У Unicode все еще есть проблема с неверно интерпретируемым именем файла программы из-за нулевых символов, и сохранение его как UTF-8 приводит к тому, что не запускается вообще .

...