Convert const char * to const wchar_t *

I am trying to create a program with Irrlicht that loads certain things from a configuration file written in Lua, one of which is the window title. However, the lua_tostring function returns const char* , while the Irrlicht device method setWindowCaption expects const wchar_t* . How to convert the string returned by lua_tostring ?

+6
source share
3 answers

There are several questions on SO that fix the problem on Windows. Examples of messages:

There is a platform agnostic method available at http://ubuntuforums.org/showthread.php?t=1579640 . Source from this site (I hope that I do not violate any copyrights):

 #include <locale> #include <iostream> #include <string> #include <sstream> using namespace std ; wstring widen( const string& str ) { wostringstream wstm ; const ctype<wchar_t>& ctfacet = use_facet< ctype<wchar_t> >( wstm.getloc() ) ; for( size_t i=0 ; i<str.size() ; ++i ) wstm << ctfacet.widen( str[i] ) ; return wstm.str() ; } string narrow( const wstring& str ) { ostringstream stm ; const ctype<char>& ctfacet = use_facet< ctype<char> >( stm.getloc() ) ; for( size_t i=0 ; i<str.size() ; ++i ) stm << ctfacet.narrow( str[i], 0 ) ; return stm.str() ; } int main() { { const char* cstr = "abcdefghijkl" ; const wchar_t* wcstr = widen(cstr).c_str() ; wcout << wcstr << L'\n' ; } { const wchar_t* wcstr = L"mnopqrstuvwx" ; const char* cstr = narrow(wcstr).c_str() ; cout << cstr << '\n' ; } } 
+5
source

You can use mbstowcs :

  wchar_t WBuf[100]; mbstowcs(WBuf,lua_tostring( /*...*/ ),99); 

or more safely:

  const char* sz = lua_tostring(/*...*/); std::vector<wchar_t> vec; size_t len = strlen(sz); vec.resize(len+1); mbstowcs(&vec[0],sz,len); const wchar_t* wsz = &vec[0]; 
+2
source

For Unicode:

 std::string myString = "Master James"; const char* sz = myString.c_str(); size_t origsizes = strlen(sz) + 1; const size_t newsizes = 500; size_t convertedCharP = 0; wchar_t constTowchar[500]; mbstowcs_s(&convertedCharP, constTowchar, origsizes, sz, _TRUNCATE); std::wcout << constTowchar << std::endl; 

This works using mbstowcs_s .

0
source

All Articles