Unable to convert the CStringW to CStringA

A B picture A B · Feb 26, 2014 · Viewed 7k times · Source

I am working on one project where I have stucked on one problem of converting CStringW to CStringA for multibyte string like Japanese Language.

I am loading the string from string resources using LoadString() Method. I have tried following code but it does not seem to work.

CStringW csTest;
csTest.LoadString(JAPANESE_STRING);
CStringA Msg = CStringA(csTest); // Msg has been returned blank string

And

std::string Msg = CW2A(csTest);// Msg has been returned blank string

I have also tried wcstombs() too.

Can anyone tell me how I can convert CStringW to CString? Thanks in advance.

Answer

Mr.C64 picture Mr.C64 · Feb 26, 2014

CStringW stores Unicode UTF-16 strings.

What encoding do you expect for your CStringA?

Do you want UTF-8?
In this case, you can do:

// strUtf16 is a CStringW.
// Convert from UTF-16 to UTF-8
CStringA strUtf8 = CW2A(strUtf16, CP_UTF8);

Talking about CStringA without specifying an encoding doesn't make sense.

The second parameter of CW2A is a what is passed to WideCharToMultiByte() Win32 API as CodePage (note that CW2A is essentially a convenient safe C++ RAII wrapper around this API). If you follow this API documentation, you can find several "code page" values (i.e. encodings).