首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >向控制台应用程序传递Unicode命令行参数

向控制台应用程序传递Unicode命令行参数
EN

Stack Overflow用户
提问于 2012-03-26 14:11:05
回答 2查看 3.7K关注 0票数 3

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

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

我尝试创建一个Unicode批处理文件来调用程序,向它传递一些Unicode字符,但它不起作用;命令提示符根本不能启动程序,因为它在文件名中的空字符上出错。我尝试将代码页更改为65001,并在命令行中按Alt键键入Unicode字符,但也不起作用。

下面是一个示例程序。我正在尝试找到一种方法来获得以下输出:

代码语言:javascript
运行
复制
C:\> unicodeargtest Foobar
46, 0, 6f, 0
代码语言:javascript
运行
复制
// 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]);
}
EN

回答 2

Stack Overflow用户

发布于 2012-03-26 15:01:41

哦,blerg!这事又发生了。我有汇编程序的背景,所以偶尔也会遇到一些C++的问题。我经常忘记的一件事是,在C++中,编译器如何在计算索引、指针等时自动补偿类型大小。

例如:

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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字符,我得到以下结果:

代码语言:javascript
运行
复制
C:\>unicodeargtest ‽‽‽‽
203d, 203d, 203d, 203d

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

通过将参数强制转换为charBYTE

代码语言:javascript
运行
复制
printf("%x, %x, %x, %x\n",
    ((BYTE*)(argv[1]))[0], ((BYTE*)(argv[1]))[1],
    ((BYTE*)(argv[1]))[2], ((BYTE*)(argv[1]))[3]
);

我得到了预期的结果:

代码语言:javascript
运行
复制
C:\>unicodeargtest ‽‽‽‽
3d, 20, 3d, 20

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

粘贴Unicode字符可以工作,但使用批处理文件仍然不行。Unicode字符仍然存在由于空字符导致程序文件名被错误解释的问题,将其保存为UTF-8会导致其为not run at all

票数 2
EN

Stack Overflow用户

发布于 2012-03-26 15:04:29

拖放应该可以做到这一点。在资源管理器中,将要将其名称作为参数传递到测试可执行文件上的文件拖动。(您可能首先希望更改可执行文件,使其在退出前等待。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9867392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档