Преобразовать char * в LPWSTR
Я пытаюсь преобразовать программу для многобайтовых символов в Unicode.
Я прошел программу и предшествовал строковым литералам с L
чтобы они выглядели как L"string"
.
Это сработало, но теперь у меня осталась строка в стиле C, которая не будет соответствовать. Я попробовал L
и поместил его в TEXT()
но L
добавляется к имени переменной, а не к строке, если я использую TEXT()
.
Я пытался сделать его TCHAR
но потом жалуется, что не может преобразовать TCHAR
в char *
.
Какие варианты у меня остались?
Я знаю, что C и C++ разные. Это старая внутренняя библиотека C, которая используется в проектах C++ уже несколько лет.
Ответы
Ответ 1
Функция std::mbstowcs
- это то, что вы ищете:
char text[] = "something";
wchar_t wtext[20];
mbstowcs(wtext, text, strlen(text)+1);//Plus null
LPWSTR ptr = wtext;
для string
s,
string text = "something";
wchar_t wtext[20];
mbstowcs(wtext, text.c_str(), text.length());//includes null
LPWSTR ptr = wtext;
→ ED: Префикс "L" работает только со строковыми литералами, а не с переменными. <-
Ответ 2
Чистым способом использования mbstowcs
является вызов его дважды, чтобы найти длину результата:
const char * cs = <your input char*>
size_t wn = mbsrtowcs(NULL, &cs, 0, NULL);
// error if wn == size_t(-1)
wchar_t * buf = new wchar_t[wn + 1](); // value-initialize to 0 (see below)
wn = mbsrtowcs(buf, &cs, wn + 1, NULL);
// error if wn == size_t(-1)
assert(cs == NULL); // successful conversion
// result now in buf, return e.g. as std::wstring
delete[] buf;
Не забудьте вызвать setlocale(LC_CTYPE, "");
в начале вашей программы!
Преимущество над Windows MultiByteToWideChar
заключается в том, что это полностью стандарт C, хотя в Windows вы, возможно, предпочтете функцию Windows API.
Я обычно обертываю этот метод вместе с противоположным в двух функциях преобразования string
→ wstring
и wstring
→ string
. Если вы также добавляете тривиальные перегрузки string
→ string
и wstring
→ wstring
, вы можете легко написать код, который компилируется с помощью Winapi TCHAR
typedef в любой настройке.
[Edit:] Я добавил нулевую инициализацию на buf
, если вы планируете напрямую использовать массив C. Обычно я возвращаю результат как std::wstring(buf, wn)
, но будьте осторожны, если вы планируете использовать массивы с нулевым завершением в стиле C. [/]
В многопоточной среде вы должны передать текущее состояние преобразования потока в функцию в качестве ее окончательного (в настоящее время невидимого) параметра.
Ниже приведена небольшая реклама по этой теме.
Ответ 3
Эта версия, используя функцию Windows API MultiByteToWideChar()
, обрабатывает выделение памяти для произвольно длинных строк ввода.
int lenA = lstrlenA(input);
int lenW = ::MultiByteToWideChar(CP_ACP, 0, input, lenA, NULL, 0);
if (lenW>0)
{
output = new wchar_t[lenW];
::MultiByteToWideChar(CP_ACP, 0, input, lenA, output, lenW);
}
Ответ 4
Вы можете использовать CString
, CStringA
, CStringW
для автоматического преобразования и преобразования между этими типами. Кроме того, вы можете также использовать CStrBuf
, CStrBufA
, CStrBufW
, чтобы получить шаблоны RAII с изменяемыми параметрами
Ответ 5
Я использую следующее в VC++, и это работает как очарование для меня.
CA2CT(charText)