Konvertieren Sie std :: string in QString


77

Ich habe eine std::string content, von der ich weiß, dass sie UTF-8-Daten enthält. Ich möchte es in ein konvertieren QString. Wie mache ich das, um die From-ASCII-Konvertierung in Qt zu vermeiden?

Antworten:


90

Es gibt eine QStringFunktion aufgerufen , fromUtf8die eine nimmt const char*:

QString str = QString::fromUtf8(content.c_str());

19
Effizienter:QString::fromUtf8( content.data(), content.size() )
Marc Mutz - mmutz

2
Im C ++ - Standard gibt es keine Garantie, die std::stringin UTF8 codiert ist (tatsächlich ist die Codierung nicht spezifiziert), daher ist diese Antwort nicht ganz korrekt. Zumindest sollten Sie die Codierung durch eine Zusicherung überprüfen.
Plasmacel

101

QString::fromStdString(content)ist besser, da es robuster ist. Beachten Sie auch, dass wenn std::stringes in UTF-8 codiert ist, es genau das gleiche Ergebnis liefern sollte wie QString::fromUtf8(content.data(), int(content.size())).


4
Nur in Qt5. In Qt4 wird QString :: fromAscii verwendet.
Rémi Benoit

3
Dies sollte die akzeptierte Antwort sein. Ihre letzte Aussage ist jedoch nicht unbedingt wahr. Im C ++ - Standard gibt es keine Garantie dafür, dass std::stringdie Codierung in UTF8 codiert ist (tatsächlich ist die Codierung nicht angegeben) und daher QString::fromUtf8(content.data(), int(content.size()))möglicherweise andere (und auch falsche) Ergebnisse liefert als QString::fromStdString(content).
Plasmacel

7

Normalerweise ist die Konvertierung am besten mit der Methode fromUtf8 möglich . Das Problem besteht jedoch darin, dass Zeichenfolgen vom Gebietsschema abhängig sind.

In diesen Fällen ist es vorzuziehen, fromLocal8Bit zu verwenden . Beispiel:

std::string str = "ëxample";
QString qs = QString::fromLocal8Bit(str.c_str());

5

Da QT5 fromStdString intern fromUtf8 verwendet, so können Sie verwenden beide:

inline QString QString::fromStdString(const std::string& s) 
{
return fromUtf8(s.data(), int(s.size()));
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.