Answers:
转换QString
为时应记住的一件事是,...可能是UTF-16编码std::string
的事实。QString
std::string
所以最好的办法是:
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();
如果指定编解码器,建议的(接受的)方法可能会起作用。
std::string utf8_text = qs.toUtf8().constData();
所以您的说法不正确
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;
。第一个是不正确的,第二个是完美的。您需要utf8终端进行测试。
.toStdString()
对我而言,无论QString
的内容是什么(无论是否为latin1),在管道操作员中总是会导致访问冲突。这是Qt的4.8.3 / MSVC ++ 10 /赢7.
您可以使用:
QString qs;
// do things
std::cout << qs.toStdString() << std::endl;
它内部使用QString :: toUtf8()函数创建std :: string,因此它也是Unicode安全的。这是的参考文档QString
。
QString::toStdString()
现在用于QString::toUtf8()
执行转换,因此不会丢失字符串的Unicode属性(qt-project.org/doc/qt-5.0/qtcore/qstring.html#toStdString)。
QString::toStdString
,这里是。
提议的替代方案:
QString qs;
std::string current_locale_text = qs.toLocal8Bit().constData();
可能:
QString qs;
std::string current_locale_text = qPrintable(qs);
请参阅qPrintable文档,这是一个从QtGlobal提供const char *的宏。
QString data;
data.toStdString().c_str();
~basic_string() _NOEXCEPT
{ // destroy the string
_Tidy_deallocate();
}
正确的方法(安全-无例外)是上文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();
试试这个:
#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()); }