我正在尝试编写一个控制台应用程序,它可以接受文件名参数,并希望它能够处理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]);
}发布于 2012-03-26 15:01:41
哦,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),它们显示为?而不是‽,但它仍然提供相同的结果。
通过将参数强制转换为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会导致其为not run at all。
发布于 2012-03-26 15:04:29
拖放应该可以做到这一点。在资源管理器中,将要将其名称作为参数传递到测试可执行文件上的文件拖动。(您可能首先希望更改可执行文件,使其在退出前等待。)
https://stackoverflow.com/questions/9867392
复制相似问题