Зависит от того, содержит ли ваша nsACString (которую я назову str
) данные ASCII или UTF-8:
ASCII
std::vector<WCHAR> wide(str.Length()+1);
std::copy(str.beginReading(), str.endReading(), wide.begin());
// I don't know whether nsACString has a terminating NUL, best to be sure
wide[str.Length()] = 0;
LPCWSTR newstr = &wide[0];
UTF-8
// get length, including nul terminator
int len = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS,
str.BeginReading(), str.Length(), 0, 0);
if (len == 0) panic(); // happens if input data is invalid UTF-8
// allocate enough space
std::vector<WCHAR> wide(len);
// convert string
MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS,
str.BeginReading(), str.Length(), &wide[0], len)
LPCWSTR newstr = &wide[0];
Это выделяет столько места, сколько необходимо - если вам нужен более быстрый код, который потенциально использует больше памяти, чем необходимо, вы можете заменить первые две строки на:
int len = str.Length() + 1;
Это работает, потому что преобразование из UTF-8 в WCHAR никогда не приводит к большему количеству символов, чем было введено байтов.