我正在尝试编写一个可以接受文件名参数的控制台应用程序,并希望它能够处理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]);
}
答案 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 = ⪚
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>
通过将参数强制转换为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字符有效,但使用批处理文件仍然没有。由于null字符导致程序的文件名被错误地解释,因此Unicode仍然存在问题,并且将其保存为UTF-8会导致not run at all。
答案 1 :(得分:1)
拖放应该可以解决问题。在资源管理器中,将要作为参数传递其名称的文件拖到测试可执行文件中。 (您可能首先要更改可执行文件,以便它在退出之前等待。)