ToStdWStringAndBuiltInWchar: Difference between revisions

From Qt Wiki
Jump to navigation Jump to search
No edit summary
 
(Sub-categorize)
 
(7 intermediate revisions by 3 users not shown)
Line 1: Line 1:
'''English''' [[toStdWStringAndBuiltInWchar-SimplifiedChinese|简体中文]]
[[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.0/qtcore/qstring.html#toStdWString QString::toStdWString()] ''[qt.io]'' and [http://doc.qt.io/qt-5.0/qtcore/qstring.html#fromStdWString QString::fromStdWString()] ''[qt.io]''.
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:


Note that for other platforms the std::wstring may be implemented using uint32 (for ucs-4/utf-32) instead.
'''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>


===Categories:===
'''Convert an std::wstring to a QString'''
 
<code>
* [[:Category:HowTo|HowTo]]
QString stdWToQString(const std::wstring &str)
* [[:Category:snippets|snippets]]
{
#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
}