将 const char* 转换为 const wchar_t*
Convert const char* to const wchar_t*
我正在尝试使用 Irrlicht 创建一个程序,它从用 Lua 编写的配置文件中加载某些内容,其中之一是 window 标题。然而,lua_tostring
函数 returns 一个 const char*
而 Irrlicht 设备的方法 setWindowCaption
期望一个 const wchar_t*
。如何转换 lua_tostring
?
返回的字符串
SO 上有多个问题解决了 Windows 上的问题。示例帖子:
- char* to const wchar_t * conversion
- 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 ;
// Incorrect code from the link
// const ctype<char>& ctfacet = use_facet<ctype<char>>(stm.getloc());
// Correct code.
const ctype<wchar_t>& ctfacet = use_facet<ctype<wchar_t>>(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' ;
}
}
您可以使用 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];
对于 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;
这正在使用 mbstowcs_s
。
这是第一个答案的代码的更快版本,不要忘记 std::locale::global(std::locale(""));对于某些字符
#include <xlocale>
#include <sstream>
[[nodiscard]] inline std::wstring widen(const char* str)
{
const auto length = strlen(str);
std::wstring result;
result.resize(length);
const auto& facet = use_facet<std::ctype<wchar_t>>(std::wostringstream().getloc());
std::transform(str, str + length, result.begin(), [&facet](const char ch)
{
return facet.widen(ch);
});
return result;
}
[[nodiscard]] inline std::string narrow(const wchar_t* str)
{
const auto length = wcslen(str);
std::string result;
result.resize(length);
const auto& facet = use_facet<std::ctype<wchar_t>>(std::ostringstream().getloc());
std::transform(str, str + length, result.begin(), [&facet](const wchar_t ch)
{
return facet.narrow(ch);
});
return result;
}
我正在尝试使用 Irrlicht 创建一个程序,它从用 Lua 编写的配置文件中加载某些内容,其中之一是 window 标题。然而,lua_tostring
函数 returns 一个 const char*
而 Irrlicht 设备的方法 setWindowCaption
期望一个 const wchar_t*
。如何转换 lua_tostring
?
SO 上有多个问题解决了 Windows 上的问题。示例帖子:
- char* to const wchar_t * conversion
- 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 ;
// Incorrect code from the link
// const ctype<char>& ctfacet = use_facet<ctype<char>>(stm.getloc());
// Correct code.
const ctype<wchar_t>& ctfacet = use_facet<ctype<wchar_t>>(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' ;
}
}
您可以使用 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];
对于 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;
这正在使用 mbstowcs_s
。
这是第一个答案的代码的更快版本,不要忘记 std::locale::global(std::locale(""));对于某些字符
#include <xlocale>
#include <sstream>
[[nodiscard]] inline std::wstring widen(const char* str)
{
const auto length = strlen(str);
std::wstring result;
result.resize(length);
const auto& facet = use_facet<std::ctype<wchar_t>>(std::wostringstream().getloc());
std::transform(str, str + length, result.begin(), [&facet](const char ch)
{
return facet.widen(ch);
});
return result;
}
[[nodiscard]] inline std::string narrow(const wchar_t* str)
{
const auto length = wcslen(str);
std::string result;
result.resize(length);
const auto& facet = use_facet<std::ctype<wchar_t>>(std::ostringstream().getloc());
std::transform(str, str + length, result.begin(), [&facet](const wchar_t ch)
{
return facet.narrow(ch);
});
return result;
}