2015-05-23 164 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]; 
相關問題