为什么需要WCHAR相关代码处理

问题描述 投票:0回答:1

我看到一个应用程序的代码,并看到对于 "Windows "特定的代码,他们已经转换了命令行参数来做一些额外的WCHAR相关处理(在#ifdef _WIN32之间)。

在下面的代码中,为什么要为Windows添加WCHAR处理相关代码?我试图理解调用WCHAR相关函数背后的原理。最后,代码编写者试图调用的是 myFunc 可以直接使用普通的argC和argV调用。为什么有人觉得需要增加额外的wchar处理?

int main(int argc, char* argv[])
{

#ifdef _WIN32

    int argc_w;
    LPWSTR* argv_w = CommandLineToArgvW(GetCommandLineW(), &argc_w);
    std::vector<char*> argv_vector;
    int result;
    if (ConvertToUtf8(argc_w, argv_w, argv_vector)) {
        result = myFunc(argc_w, argv_vector.data());
    } else {
        result = myFunc(argc, argv);
    }

    // code to free vector
    return result;
#else
    int (*ptrMyFunc)(int, char**, const char*);

    void *dllHandle = dlopen(myDLL.c_str(), RTLD_LAZY);
    *(void **) (&ptrMyFunc) = dlsym(dllHandle, "myFunc");
    return (*ptrMyFunc)(argc, argv);
#endif

}
unicode c++17 wchar-t wchar
1个回答
0
投票

我认为有几个原因,有些也是错误的。

错的 myFunc 函数(我不评论这个名字选得不好)似乎需要UTF-8参数。现在在MacOS和Linux上你可以期待它,但在Windows上不是。我认为这是一个错误:人们不应该UTF-8,相反,程序应该检查出命令行编码。

但是Windows采用了早期的Unicode,在UTF-8成为一个东西之前(也可能在Unicode发现它不能实现最初的目标:所有字符都在16位)。所以Windows内部使用UCS-2或UTF-16,外部有ANSI等,但不是真正的标准(这取决于Windows语言)。Windows的功能 CommandLineToArgvW 将命令行解析成Unicode字符串,这是获取命令行的方法,如果你有非ASCII字符(实际上,应该使用 wmain. 我不是Windows API方面的专家,但上面的代码有味道。它似乎是一些复制粘贴来解决一些现有的问题(例如,命令行与非ASCII字符,只有现代MacOSLinux),而不理解问题,并得到一个干净的解决方案。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.