içinde ** wchar ile [] wstring başlatmak için nasıl, bu örnekte olduğu gibi, ** bir wchar_t olan bir vektör <wstring> sunabilmesi: AncakC++ D 2.0
#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);
}
}
, bir yolu yoktur Bir wstring [] bir Wchar ** ile D 2.0'da başlatılır? Ben C++ versiyonu gibi daha temiz, daha basit bir yol bulmak istiyoruz,
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);
}
}
Ama:
Ben wstring [] Bu şekilde wchar ** içeriğini ekleyebilir.
Dizgiler [] dizgileri UTF-8 olarak kodlanır mı? Komut satırı argümanlarını almak için CommandLineToArgvW kullanıyorum (her türlü unicode karakterini içerebilir) ve sonra her argümanı UTF-8 olarak kodlanmış bir dizeye dönüştürmek için std.utf.toUTF8() öğesini kullanıyorum. Eğer string [] args bunu karşılarsa, o zaman bunu kullanacağım. Ama bunu düşünmemiştim. – Shadow2531
Bununla birlikte, örneğinizi değiştirirseniz ve argv'yi bir dizgi [] olarak değiştirirseniz ve wdring() yerine std.utf.toUTF8() öğesini kullanırsam, istediğim sonucu oluşturduğunu düşünüyorum. Ancak, ana (string [] args) gerçekten aynı utf-8 kodlamasını üretiyorsa, kesinlikle bunu kullanacağım. – Shadow2531
Wcslen() ile bahsetmediğim bir sorun var. Std.string dosyasını içe aktarırsam, dmd std.string.wcslen'in core.stdc.wchar_.wcslen ile çakıştığını belirtir. Yani, wcslen() olmadan yapmanın iyi bir yolu varsa, bu harika olurdu. – Shadow2531