Odpowiedzi:
Jedną z rzeczy, należy pamiętać przy konwersji QString
na std::string
to fakt, że QString
jest kodowana w UTF-16 podczas std::string
... Może mieć żadnych kodowania.
Tak więc najlepsze byłoby:
QString qs;
// Either this if you use UTF-8 anywhere
std::string utf8_text = qs.toUtf8().constData();
// or this if you're on Windows :-)
std::string current_locale_text = qs.toLocal8Bit().constData();
Sugerowana (zaakceptowana) metoda może działać, jeśli podasz kodek.
std::string utf8_text = qs.toUtf8().constData();
więc twoje stwierdzenie jest niepoprawne
QString s = QString::fromUtf8("árvíztűrő tükörfúrógép ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉP"); std::cout << s.toStdString() << std::endl; std::cout << s.toUtf8().constData() << std::endl;
. Pierwszy jest niepoprawny, drugi jest idealny. Aby to sprawdzić, potrzebujesz terminalu utf8.
.toStdString()
dla mnie zawsze skutkuje naruszeniem dostępu w operatorze potoku, niezależnie od QString
zawartości (innej niż łacińska1). To jest na Qt 4.8.3 / MSVC ++ 10 / Win 7.
Możesz użyć:
QString qs;
// do things
std::cout << qs.toStdString() << std::endl;
Wewnętrznie używa funkcji QString :: toUtf8 () do tworzenia std :: string, więc jest również bezpieczny dla Unicode. Oto dokumentacja referencyjna dla QString
.
QString::toStdString()
teraz używa QString::toUtf8()
do konwersji, więc właściwości ciągu znaków Unicode nie zostaną utracone ( qt-project.org/doc/qt-5.0/qtcore/qstring.html#toStdString ).
Jeśli Twoim ostatecznym celem jest dostarczenie komunikatów debugujących do konsoli, możesz użyć qDebug () .
Możesz użyć jak
qDebug()<<string;
który wydrukuje zawartość do konsoli .
Ten sposób jest lepszy niż konwersja w std::string
celu debugowania wiadomości.
QString qstr;
std::string str = qstr.toStdString();
Jeśli jednak używasz Qt:
QTextStream out(stdout);
out << qstr;
Najlepiej byłoby samemu przeciążyć operatora <<, aby QString można było przekazać jako typ do dowolnej biblioteki oczekującej typu zdolnego do wyjścia.
std::ostream& operator<<(std::ostream& str, const QString& string) {
return str << string.toStdString();
}
Alternatywa dla proponowanego:
QString qs;
std::string current_locale_text = qs.toLocal8Bit().constData();
możliwe:
QString qs;
std::string current_locale_text = qPrintable(qs);
Zobacz dokumentację qPrintable , makro dostarczające const char * z QtGlobal.
-no-stl
zestawem Qt-Build z zestawem -Option. więcej informacji
Możesz tego użyć;
QString data;
data.toStdString().c_str();
QString data;
data.toStdString().c_str();
~basic_string() _NOEXCEPT
{ // destroy the string
_Tidy_deallocate();
}
właściwą drogą (bezpieczna - bez wyjątku) jest to, co wyjaśniono powyżej od Artema
QString qs;
// Either this if you use UTF-8 anywhere
std::string utf8_text = qs.toUtf8().constData();
// or this if you're on Windows :-)
std::string current_locale_text = qs.toLocal8Bit().constData();
Spróbuj tego:
#include <QDebug>
QString string;
// do things...
qDebug() << "right" << string << std::endl;
static inline std::string toUtf8(const QString& s) { QByteArray sUtf8 = s.toUtf8(); return std::string(sUtf8.constData(), sUtf8.size()); }