Согласно [1 129] CodeGuru:
CString
к std::string
:
CString cs("Hello");
std::string s((LPCTSTR)cs);
, НО: std::string
не может всегда создавать из LPCTSTR
. т.е. код перестанет работать для сборок UNICODE.
Как std::string
может создать только от LPSTR
/ LPCSTR
, программист, который использует VC ++ 7.x или лучше может использовать классы преобразования такой как [1 110] как посредник.
CString cs ("Hello");
// Convert a TCHAR string to a LPCSTR
CT2CA pszConvertedAnsiString (cs);
// construct a std::string using the LPCSTR input
std::string strStd (pszConvertedAnsiString);
std::string
к [1 112] : (От [1 131] часто задаваемые вопросы Visual Studio CString... )
std::string s("Hello");
CString cs(s.c_str());
CStringT
может создать из обеих строк символьного или широкого символа. т.е. Это может преобразовать от [1 114] (т.е. LPSTR
) или от [1 116] (LPWSTR
).
, Другими словами, символьная специализация ([1 118]) т.е. CStringA
, wchar_t
-specilization CStringW
, и TCHAR
- специализация CString
может быть создана или от [1 124] или от широкий символ, завершенный пустой указатель (пустое завершение очень важно здесь) строковые источники.
Althoug IInspectable исправляет часть "пустого завершения" в комментариях :
NUL-завершение не требуется .
CStringT
имеет конструкторов преобразования, которые берут явный аргумент длины. Это также означает, что можно создатьCStringT
объекты от [1 127] объекты со встроеннымNUL
символы.
Если бы Вы надеетесь преобразовывать легко между другими строковыми типами, возможно, _bstr_t
, класс был бы более соответствующим? Это поддерживает converstion между char
, wchar_t
и BSTR
.
Решите это при помощи std::basic_string<TCHAR>
вместо std::string
, и это должно хорошо работать независимо от Вашей символьной установки.
преобразовать CString to std::string
. Можно использовать этот формат.
std::string sText(CW2A(CSText.GetString(), CP_UTF8 ));
Если вам нужно что-то более похожее на C ++, я использую это. Хотя это зависит от Boost, это только исключения. Вы можете легко удалить их, оставив его зависеть только от STL и вызова WideCharToMultiByte ()
Win32 API.
#include <string>
#include <vector>
#include <cassert>
#include <exception>
#include <boost/system/system_error.hpp>
#include <boost/integer_traits.hpp>
/**
* Convert a Windows wide string to a UTF-8 (multi-byte) string.
*/
std::string WideStringToUtf8String(const std::wstring& wide)
{
if (wide.size() > boost::integer_traits<int>::const_max)
throw std::length_error(
"Wide string cannot be more than INT_MAX characters long.");
if (wide.size() == 0)
return "";
// Calculate necessary buffer size
int len = ::WideCharToMultiByte(
CP_UTF8, 0, wide.c_str(), static_cast<int>(wide.size()),
NULL, 0, NULL, NULL);
// Perform actual conversion
if (len > 0)
{
std::vector<char> buffer(len);
len = ::WideCharToMultiByte(
CP_UTF8, 0, wide.c_str(), static_cast<int>(wide.size()),
&buffer[0], static_cast<int>(buffer.size()), NULL, NULL);
if (len > 0)
{
assert(len == static_cast<int>(buffer.size()));
return std::string(&buffer[0], buffer.size());
}
}
throw boost::system::system_error(
::GetLastError(), boost::system::system_category);
}