Я пытаюсь создать программу с Irrlicht, которая загружает определенные вещи из файла конфигурации, написанного в Lua, одним из которых является заголовок окна. Однако функция lua_tostring
возвращает const char*
, в то время как метод устройства Irrlicht setWindowCaption
ожидает const wchar_t*
. Как преобразовать строку, возвращаемую lua_tostring
?Convert const char * to const wchar_t *
5
A
ответ
3
Есть много вопросов по SO, которые устраняют проблему в Windows. Примеры сообщений:
Там является агностиком метод платформы размещен на 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' ;
}
}
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];
Смежные вопросы
- 1. COM: convert 'const GUID *' to const wchar_t *
- 2. convert const char ** to const char *
- 3. convert const char * to int
- 4. преобразование из unsigned char * to const wchar_t *
- 5. cuda kernel convert integer to const char *
- 6. Convert String^to const char * [vs C++]
- 7. не может преобразовать 'const char *' в 'LPCWSTR {aka const wchar_t *}'
- 8. Кастинг const char * to non const char *
- 9. `const char * 'to` char'
- 10. const char [22] 'to' LPCWSTR '
- 11. copy const wchar_t * to temp
- 12. convert wchar_t to char C++
- 13. fstream to const char *
- 14. Const Char to LPTSTR
- 15. const char * to LPTSTR
- 16. QString to Const Char *
- 17. const char * to TDesC16
- 18. C++ char to const char *
- 19. C++ const char * to char *
- 20. Ошибка C++ boost: невозможно преобразовать const value type * (aka const wchar_t *) в const char * при инициализации
- 21. (const char *) ++ или (const char) ++?
- 22. static_cast from 'const unsigned char * const *' to 'const char * const *' не разрешен
- 23. C++ Преобразование const char * to char *
- 24. LWPSTR to CONST CHAR * нужна помощь
- 25. Const correctness: const char const * const GetName const (// материал);
- 26. const char * to int cast?
- 27. convert std :: wstring to const * char в C++
- 28. Как обрезать const wchar_t *?
- 29. Почему невозможно связать 'const char *' lvalue с 'const char * const &&?
- 30. D - литье char [] to const char []
Забыла уточнить, что Я на ubuntu. Тестирование вашего ответа сейчас ... – Giaphage47
Как правило, я обнаружил, что для работы с широким текстом на C++ в Ubuntu требуется установить локаль по умолчанию. Это очень иронично, как ведут себя реализации. С UTF-8, как и в Unix-land, локаль вряд ли имеет значение для узкомасштабного преобразования, но должна быть установлена, в то время как с различными однобайтовыми кодировками, такими как в Windows, язык очень важен, но уже установлен по умолчанию. –