Как преобразовать из LPCTSTR в std:: string?
у меня есть LPCTSTR
и хотите вызвать функцию, которая принимает
7 ответов
верхушка айсберга
LPCTSTR
может быть однобайтовой или многобайтовой строкой (зависит от UNICODE
константа определяется во время компиляции или нет), в то время как std::string
пользователи (включая вашу функцию) обычно используют его для хранения однобайтовой строки.
вам понадобятся два преобразования: одно для LPCSTR
(неUNICODE
build) и один для LPCWSTR
(UNICODE
build). Первый из них прост:
std::string convert(LPCSTR str) {
return std::string(str);
}
второй нуждается в своем входном параметре для преобразования в другую кодировку сначала с WideCharToMultiByte
. Не пугайтесь имени, результат can быть однобайтовой строкой символов; это зависит от
из вашего комментария: "функция, которую я вызываю, будет принимать строку std::и использовать ее в качестве имени файла при вызове std::fstream::open()"
Ну, это неправильно. Функция действительно должна принимать tstring
(определена как typedef std::basic_string<TCHAR> tstring
). Есть много файлов Windows, имя которых не может быть представлено без Unicode. Например, все файлы в разделе \User\<myusername\My Documents\
Если <myUserName>
содержит символ не-ANSI (и вы действительно не хотите говорить своему пользователю, что у него плохое имя!)
но после того, как вы изменили на tstring
, Он просто работает. Вы все равно получите то же самое
LPCTSTR
- это определение Windows, которое читается как что-то вроде " длинного указателя на строку символьного типа const.- Я не совсем понимаю, что означает буква "Т", но это связано с характером проекта.
если ваш проект использует набор символов Юникода, этот тип является const wchar_t*
, который использует два байта на символ. Если в проекте используется многобайтовый набор символов, этот тип является const char*
, который использует один байт на символ.
большинство вероятно, набор символов вашего проекта-Unicode, поэтому LPCTSTR
это const wchar_t*
. С std::string
использует один байт на символ, он не может содержать два байта на строку символов. может,.
Если вам нужно преобразовать const wchar_t*
до const char*
чтобы он был назначен строке, вы можете использовать такие функции, как wcstombs
для этого. Если вы включаете ATL (в частности,atlconv.h
) в ваш проект, он содержит макросы, чтобы сделать это более легко:
USES_CONVERSION;
const wchar_t* = L"Wide string";
std::string str = W2A(value);
прагматичный подход:
LPCTSTR input;
std::string s;
#ifdef UNICODE
std::wstring w;
w = input;
s = std::string(w.begin(), w.end()); // magic here
#else
s = input;
#endif
см. другие ответы для отличных backgrounders!
этот фрагмент кода должен выполнять преобразование из LPWSTR в char* / std::string
LPWSTR input = L"whatever";
int cSize = WideCharToMultiByte (CP_ACP, 0, input, wcslen(input), NULL, 0, NULL, NULL);
std::string output(static_cast<size_t>(cSize), '');
WideCharToMultiByte (CP_ACP, 0, input, wcslen(input),
reinterpret_cast<char*>(&output[0]), cSize, NULL, NULL);
и этот фрагмент должен выполнять преобразование из однобайтового std:: string в LPWSTR
std::string input = "whatever";
//computing wchar size:
int wSize = MultiByteToWideChar (CP_ACP, 0, (LPCSTR) input.c_str (), -1, 0, 0);
//allocating memory for wchar:
LPWSTR output = new WCHAR[wSize];
//conversion from string to LPWSTR:
MultiByteToWideChar (CP_ACP, MB_PRECOMPOSED , (LPCSTR) input.c_str (), -1, output, wSize);