Re: Q: Convert std::string to std::wstring using std::ctype widen()
Jeffrey Walton wrote:
Hi All,
I've done a little homework (I've read responses to similar from P.J.
Plauger and Dietmar Kuehl), and wanted to verify with the Group. Over
in comp.lang.c++, I'm getting a lot of boot Microsoft answers (which
does not help me). Below is what I am performing (Stroustrup's Appendix
D recommendations won't compile in Microsoft VC++ 6.0).
My question is in reference to MultiByte Character Sets. Will this code
perform as expected? I understand every problem has a simple and
elegant solution that is wrong.
I generally use US English or Unicode, so I don't encounter a lot of
issues others may see (a multibyte character using std::string). I have
verified it works with a Hello World sample.
Before I get flamed for not using std::codecvt, Stroustrup states
(D.4.6 Character Code Conversion, p 925):
The codecvt facet provides conversion between different character sets
when a character is moved between a stream buffer and external
storage...
Jeff
Jeffrey Walton
std::string s = "Hello World";
std::ctype<wchar_t> ct;
std::wstring ws;
for( std::string::const_iterator it = s.begin();
it != s.end(); it++ )
{
ws += ct.widen( *it );
}
This should work:
#include <string>
#include <locale>
std::wstring to_wide_string(std::string const& source) {
typedef std::ctype<wchar_t> CT;
std::wstring rc('\0', source.size());
CT const& ct = std::_USE(std::locale(), CT);
ct.widen(source.data(), source.data() +
source.size(), &rc[0]);
return rc;
}
It relies on the non-portable assumption that std::wstring is
contiguous, but that's certainly true in VC6.
Tom