Как преобразовать CString и:: станд.:: строка:: станд.:: wstring друг другу?

69
задан Peter Mortensen 20 May 2011 в 15:28
поделиться

5 ответов

Согласно [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 символы.

86
ответ дан Community 24 November 2019 в 13:48
поделиться

Если бы Вы надеетесь преобразовывать легко между другими строковыми типами, возможно, _bstr_t , класс был бы более соответствующим? Это поддерживает converstion между char, wchar_t и BSTR.

-1
ответ дан Mateen Ulhaq 24 November 2019 в 13:48
поделиться

Решите это при помощи std::basic_string<TCHAR> вместо std::string, и это должно хорошо работать независимо от Вашей символьной установки.

34
ответ дан OJ. 24 November 2019 в 13:48
поделиться

преобразовать CString to std::string. Можно использовать этот формат.

std::string sText(CW2A(CSText.GetString(), CP_UTF8 ));
0
ответ дан 24 November 2019 в 13:48
поделиться

Если вам нужно что-то более похожее на 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);
}
4
ответ дан 24 November 2019 в 13:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: