如何在D 2.0中使用wchar**初始化wstring []

Sha*_*531 6 d

在C++中,我可以使用wchar_t**初始化vector <wstring>,如下例所示:

#include <windows.h>
#include <string>
#include <vector>
#include <cwchar>
using namespace std;

int main() {
    int argc;
    wchar_t** const args = CommandLineToArgvW(GetCommandLineW(), &argc);
    if (args) {
        const vector<wstring> argv(args, args + argc);
        LocalFree(args);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,有没有办法在D 2.0中使用wchar**初始化wstring []?

我可以通过这种方式将wchar**的内容添加到wstring []:

import std.c.windows.windows;
import std.c.wcharh;

extern(Windows) {
    wchar* GetCommandLineW();
    wchar** CommandLineToArgvW(wchar*, int*);
    void* LocalFree(void*);
}

void main() {
    int argc;
    wchar** args = CommandLineToArgvW(GetCommandLineW(), &argc);
    if (args) {
        wstring[] argv;
        for (size_t i = 0; i < argc; ++i) {
            wstring temp;
            const size_t len = wcslen(args[i]);
            for (size_t z = 0; z < len; ++z) {
                temp ~= args[i][z];
            }
            argv ~= temp;
        }
        LocalFree(args);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我想找到一种更简洁的方式,比如C++版本.(性能不是问题)

Nek*_*nto 7

这是一个使用切片的简单版本:

import std.c.windows.windows;
import std.c.wcharh;
import std.conv;

extern(Windows) {
    wchar* GetCommandLineW();
    wchar** CommandLineToArgvW(wchar*, int*);
    void* LocalFree(void*);
}

void main() {
    int argc;
    wchar** args = CommandLineToArgvW(GetCommandLineW(), &argc);
    if (args) {
        wstring[] argv = new wstring[argc];
        foreach (i, ref arg; argv)
            arg = to!wstring(args[i][0 .. wcslen(args[i])]);
        LocalFree(args);
    }
}
Run Code Online (Sandbox Code Playgroud)

void main(string[] args)如果你真的需要,另一种选择是使用并转换为args wstring.

  • 在D字符串类型中映射到UTF编码.string = UTF-8,wstring = UTF-16,dstring = UTF-32.D运行时必须提供args作为正确编码的utf-8字符串,因此如果将命令参数转换为utf-8,则应该使用`void main(string [] args)`. (3认同)