Подтвердить что ты не робот

Преобразовать char * в LPWSTR

Я пытаюсь преобразовать программу для многобайтовых символов в Unicode.

Я прошел программу и предшествовал строковым литералам с L чтобы они выглядели как L"string".

Это сработало, но теперь у меня осталась строка в стиле C, которая не будет соответствовать. Я попробовал L и поместил его в TEXT() но L добавляется к имени переменной, а не к строке, если я использую TEXT().

Я пытался сделать его TCHAR но потом жалуется, что не может преобразовать TCHAR в char *.

Какие варианты у меня остались?

Я знаю, что C и C++ разные. Это старая внутренняя библиотека C, которая используется в проектах C++ уже несколько лет.

4b9b3361

Ответ 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.

Я обычно обертываю этот метод вместе с противоположным в двух функциях преобразования stringwstring и wstringstring. Если вы также добавляете тривиальные перегрузки stringstring и wstringwstring, вы можете легко написать код, который компилируется с помощью 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)