Respostas:
Uma das coisas que você deve se lembrar ao converter QString
para std::string
o fato de que QString
é UTF-16 codificado enquanto std::string
... pode ter qualquer codificações.
Portanto, o melhor seria:
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();
O método sugerido (aceito) pode funcionar se você especificar o codec.
std::string utf8_text = qs.toUtf8().constData();
Então sua afirmação não é correta
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;
. O primeiro está incorreto, o segundo é perfeito. Você precisa de um terminal utf8 para testar isso.
.toStdString()
para mim sempre resulta em uma violação de acesso no operador do tubo, independentemente do QString
conteúdo do site (não latino1 ou não). Esta é em Qt 4.8.3 / MSVC ++ 10 / Win 7.
Você pode usar:
QString qs;
// do things
std::cout << qs.toStdString() << std::endl;
Ele usa internamente a função QString :: toUtf8 () para criar std :: string, portanto também é seguro para Unicode. Aqui está a documentação de referência para QString
.
QString::toStdString()
agora é usado QString::toUtf8()
para executar a conversão, portanto, as propriedades Unicode da string não serão perdidas ( qt-project.org/doc/qt-5.0/qtcore/qstring.html#toStdString ).
Se seu objetivo final é obter mensagens de depuração no console, você pode usar qDebug () .
Você pode usar como,
qDebug()<<string;
que imprimirá o conteúdo no console .
Dessa maneira, é melhor do que convertê-lo std::string
apenas para fins de depuração de mensagens.
QString qstr;
std::string str = qstr.toStdString();
No entanto, se você estiver usando o Qt:
QTextStream out(stdout);
out << qstr;
A melhor coisa a fazer seria sobrecarregar o operador << você mesmo, para que o QString possa ser passado como um tipo para qualquer biblioteca que espera um tipo com capacidade de saída.
std::ostream& operator<<(std::ostream& str, const QString& string) {
return str << string.toStdString();
}
Uma alternativa à proposta:
QString qs;
std::string current_locale_text = qs.toLocal8Bit().constData();
poderia ser:
QString qs;
std::string current_locale_text = qPrintable(qs);
Consulte a documentação qPrintable , uma macro que fornece um const char * da QtGlobal.
-no-stl
-Option. mais algumas informações
Você pode usar isso;
QString data;
data.toStdString().c_str();
QString data;
data.toStdString().c_str();
~basic_string() _NOEXCEPT
{ // destroy the string
_Tidy_deallocate();
}
o caminho certo (seguro - sem exceção) é como é explicado acima pela Artyom
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();
Tente o seguinte:
#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()); }