ToStdWStringAndBuiltInWchar: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
(Sub-categorize) |
||
(7 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
[[Category:HowTo]] | |||
[[Category:Snippets::Misc]] | |||
=QString, std::wstring and built-in wchar_t= | = QString, std::wstring and built-in wchar_t = | ||
==Problem statement== | == Problem statement == | ||
Qt advises to build your Qt based software without wchar_t as built-in type, just like the Qt libraries themselves. In some cases this is not desired by the environment or not possible because other libraries have been built with the built-in wchar_t type. This will cause obscure linker errors when using std::wstrings, and [http://doc.qt.io/qt-5 | Qt advises to build your Qt based software without wchar_t as built-in type, just like the Qt libraries themselves. In some cases this is not desired by the environment or not possible because other libraries have been built with the built-in wchar_t type. This will cause obscure linker errors when using std::wstrings, and [http://doc.qt.io/qt-5/qstring.html#toStdWString QString::toStdWString()] and [http://doc.qt.io/qt-5/qstring.html#fromStdWString QString::fromStdWString()]. | ||
==Possible solution== | == Possible solution == | ||
Windows uses utf-16 for its character encoding, as does Qt. Using this information we can use the following code to work around the issue: | Windows uses utf-16 for its character encoding, as does Qt. Using this information we can use the following code to work around the issue: | ||
'''Convert a QString to an std::wstring''' | |||
<code> | |||
std::wstring qToStdWString(const QString &str) | |||
{ | |||
#ifdef _MSC_VER | |||
return std::wstring((const wchar_t*)str.utf16()); | |||
#else | |||
return str.toStdWString(); | |||
#endif | |||
} | |||
</code> | |||
'''Convert an std::wstring to a QString''' | |||
<code> | |||
QString stdWToQString(const std::wstring &str) | |||
* | { | ||
#ifdef _MSC_VER | |||
return QString::fromUtf16((const ushort*)str.c_str()); | |||
#else | |||
return QString::fromStdWString(str); | |||
#endif | |||
} | |||
</code> |
Latest revision as of 12:27, 28 November 2016
QString, std::wstring and built-in wchar_t
Problem statement
Qt advises to build your Qt based software without wchar_t as built-in type, just like the Qt libraries themselves. In some cases this is not desired by the environment or not possible because other libraries have been built with the built-in wchar_t type. This will cause obscure linker errors when using std::wstrings, and QString::toStdWString() and QString::fromStdWString().
Possible solution
Windows uses utf-16 for its character encoding, as does Qt. Using this information we can use the following code to work around the issue:
Convert a QString to an std::wstring
std::wstring qToStdWString(const QString &str)
{
#ifdef _MSC_VER
return std::wstring((const wchar_t*)str.utf16());
#else
return str.toStdWString();
#endif
}
Convert an std::wstring to a QString
QString stdWToQString(const std::wstring &str)
{
#ifdef _MSC_VER
return QString::fromUtf16((const ushort*)str.c_str());
#else
return QString::fromStdWString(str);
#endif
}