Как преобразовать из 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::string s = CT2A( lpctstr );

из вашего комментария: "функция, которую я вызываю, будет принимать строку 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);

Я не знаю, если это решение может помочь вам.