2015-05-23 130 views
5

我正在尝试使用Irrlicht创建一个程序,该程序从用Lua编写的配置文件加载某些内容,其中一个是窗口标题。但是,lua_tostring函数返回const char*而Irrlicht设备的方法setWindowCaption预计const wchar_t*。我如何转换lua_tostring返回的字符串?将const char *转换为常量wchar_t *

回答

3

在SO上有多个问题可以解决Windows上的问题。样品的帖子:

  1. char* to const wchar_t * conversion
  2. conversion from unsigned char* to const wchar_t*

有张贴在http://ubuntuforums.org/showthread.php?t=1579640平台无关的方法。本网站的来源是(我希望我没有违反任何版权):

#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' ; 
    } 
} 
+0

忘了澄清我在Ubuntu上。现在测试您的答案... – Giaphage47

+0

通常,我发现在Ubuntu中处理C++中的宽文本需要设置默认语言环境。实现的行为非常具有讽刺意味。使用UTF-8和Unix-land一样,区域设置对于窄范围转换并不重要,但必须进行设置,而对于各种单字节编码,例如在Windows中,区域设置非常重要,但默认情况下已设置。 –

2

您可以使用mbstowcs

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

或更安全:

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]; 
相关问题