2015-05-23 7 views
5

Я пытаюсь создать программу с Irrlicht, которая загружает определенные вещи из файла конфигурации, написанного в Lua, одним из которых является заголовок окна. Однако функция lua_tostring возвращает const char*, в то время как метод устройства Irrlicht setWindowCaption ожидает const wchar_t*. Как преобразовать строку, возвращаемую lua_tostring?Convert const char * to const 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

Как правило, я обнаружил, что для работы с широким текстом на C++ в Ubuntu требуется установить локаль по умолчанию. Это очень иронично, как ведут себя реализации. С 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]; 
Смежные вопросы