Re: MODIFIED: Copying a CString to a std::string via TCHAR
Giovanni Dicanio wrote:
However, I think that the OP can use std::string to store Unicode in a
non-losing way, just using UTF-8 (instead of UTF-16).
BTW: in case that conversion would be useful to the OP, here is some
code I wrote for that purpose (it is based on ATL and STL std::string
and std::vector classes, so can be used also in Win32 non-MFC projects):
<code>
#include <vector>
#include <string>
//----------------------------------------------------------------------------
// NAME: ConvertUTF16ToUTF8
// DESC: Converts Unicode UTF-16 (Windows default) text to Unicode UTF-8
//----------------------------------------------------------------------------
std::string ConvertUTF16ToUTF8( IN const wchar_t * utf16 )
{
//
// Check input pointer
//
ATLASSERT( utf16 != NULL );
if ( utf16 == NULL )
AtlThrow( E_POINTER );
//
// Handle special case of empty string
//
if ( *utf16 == L'\0' )
{
return "";
}
//
// Consider wchar_t's count corresponding to total string length,
// including end-of-string (L'\0') character.
//
const int utf16Length = wcslen( utf16 ) + 1;
//
// Get size of destination UTF-8 buffer, in chars (= bytes)
//
int utf8Size = ::WideCharToMultiByte(
CP_UTF8, // convert to UTF-8
0, // default flags
utf16, // source UTF-16 string
utf16Length, // total source string length, in wchar_t's,
// including end-of-string \0
NULL, // unused - no conversion required in this step
0, // request buffer size
NULL, NULL // unused
);
ATLASSERT( utf8Size != 0 );
if ( utf8Size == 0 )
{
AtlThrowLastWin32();
}
//
// Allocate destination buffer for UTF-8 string
//
std::vector< char > utf8Buffer( utf8Size );
//
// Do the conversion from UTF-16 to UTF-8
//
int result = ::WideCharToMultiByte(
CP_UTF8, // convert to UTF-8
0, // default flags
utf16, // source UTF-16 string
utf16Length, // total source string length, in wchar_t's,
// including end-of-string \0
&utf8Buffer[0], // destination buffer
utf8Size, // destination buffer size, in bytes
NULL, NULL // unused
);
ATLASSERT( result != 0 );
if ( result == 0 )
{
AtlThrowLastWin32();
}
//
// Build UTF-8 string from conversion buffer
//
return std::string( &utf8Buffer[0] );
}
</code>
In case there is a need to convert from a Unicode UTF-16 CString (in
Unicode build, or when explicit CStringW is used) to Unicode UTF-8 and
store the result in std::string, this code should work:
// Unicode build or use CStringW
CString str;
... assing str...
// Convert from UTF-16 'str' to UTF-8
// (non-losing conversion)
std::string utf8String = ConvertUTF16ToUTF8( str );
HTH,
Giovanni