I've got an std::string content that I know contains UTF-8 data. I want to convert it to a QString. How do I do that, avoiding the from-ASCII conversion in Qt?
4 Answers
QString::fromStdString(content)
This is better since it is more robust.
Also note, that if std::string is encoded in UTF-8, then it should give exactly the same result as QString::fromUtf8(content.data(), int(content.size())).
3 Comments
Rémi Benoit
Only in Qt5. In Qt4 it uses QString::fromAscii.
GUN_ter
and, thus,
QString::fromStdString(content) in Qt4 would result in fromLatin1() by default if setCodecsForCString(QTextCodec::codecForName("UTF-8")) was not called before.plasmacel
This should be the accepted answer. However your last statement is not necessarily true. In the C++ standard there is no guarantee, that
std::string is encoded in UTF8 (actually the encoding is unspecified), so QString::fromUtf8(content.data(), int(content.size())) may give different (and also incorrect) results than QString::fromStdString(content).There's a QString function called fromUtf8 that takes a const char*:
QString str = QString::fromUtf8(content.c_str());
2 Comments
Marc Mutz - mmutz
More efficient:
QString::fromUtf8( content.data(), content.size() )plasmacel
In the C++ standard there is no guarantee, that
std::string is encoded in UTF8 (actually the encoding is unspecified), so this answer is not entirely correct. At least you should check the encoding by an assertion.Usually, the best way of doing the conversion is using the method fromUtf8, but the problem is when you have strings locale-dependent.
In these cases, it's preferable to use fromLocal8Bit. Example:
std::string str = "ëxample";
QString qs = QString::fromLocal8Bit(str.c_str());