gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:27:41 26 4
gpt4 key购买 nike

我正在尝试编写一个可以接受文件名参数并希望它能够处理 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]);
}

最佳答案

啊啊啊!它又发生了。我来自汇编程序背景,所以偶尔一些 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进入命令提示符。在我的正常命令提示符模式下(使用 Raster Fonts 和代码页 437),它们显示为 ? 而不是 ,但它仍然给出相同的结果。


通过将参数强制转换为 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 字符有效,但使用批处理文件仍然无效。由于空字符,Unicode 仍然存在程序文件名被错误解释的问题,将其保存为 UTF-8 会导致它成为 not run at all。 .

关于c++ - 将 Unicode 命令行参数传递给控制台应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9867392/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com