将Unicode命令行参数传递给控制台应用程序

时间:2012-03-26 06:11:05

标签: c++ windows unicode arguments console-application

我正在尝试编写一个可以接受文件名参数的控制台应用程序,并希望它能够处理Unicode文件名。问题是我无法弄清楚如何测试它。

如何将Unicode参数传递给控制台应用程序?

我尝试创建一个调用程序的Unicode批处理文件,并传递一些Unicode字符,但它不起作用;命令提示符根本无法启动程序,因为它在文件名中的空字符上被绊倒。我尝试将代码页更改为65001并在命令行中键入一个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 个答案:

答案 0 :(得分:1)

哦,blerg!它又发生了。我来自汇编程序背景,所以偶尔会有一些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字符。

按原样使用程序并传递Unicode字符,我得到了这个:

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

我只是将interrobangs粘贴到命令提示符中。在我的正常命令提示模式下(使用光栅字体和代码页437),它们显示为?而不是,但它仍会显示相同的结果。< / p>


通过将参数强制转换为charBYTE

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字符有效,但使用批处理文件仍然没有。由于null字符导致程序的文件名被错误地解释,因此Unicode仍然存在问题,并且将其保存为UTF-8会导致not run at all

答案 1 :(得分:1)

拖放应该可以解决问题。在资源管理器中,将要作为参数传递其名称的文件拖到测试可执行文件中。 (您可能首先要更改可执行文件,以便它在退出之前等待。)