Відповіді:
Однією з речей, про які слід пам’ятати при перетворенні, QString
- std::string
це той факт, що QString
UTF-16 закодований, тоді як 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
вмісту "(не латинська1 чи ні). Це на Qt 4.8.3 / MSVC ++ 10 / Win 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 ).
Якщо вашою кінцевою метою є налагодження повідомлень на консолі, ви можете використовувати qDebug () .
Ви можете використовувати, як,
qDebug()<<string;
який буде друкувати вміст на консолі .
Цей спосіб кращий, ніж перетворити його std::string
просто заради налагодження повідомлень.
QString qstr;
std::string str = qstr.toStdString();
Однак якщо ви використовуєте Qt:
QTextStream out(stdout);
out << qstr;
Найкраще зробити це перевантажити оператора << самостійно, так що QString може бути переданий як тип будь-якій бібліотеці, яка очікує виходу, здатного вивести.
std::ostream& operator<<(std::ostream& str, const QString& string) {
return str << string.toStdString();
}
Альтернатива запропонованому:
QString qs;
std::string current_locale_text = qs.toLocal8Bit().constData();
може бути:
QString qs;
std::string current_locale_text = qPrintable(qs);
Дивіться документацію qPrintable , макрос, що надає const char * від QtGlobal.
-no-stl
набором -Option. ще інформація
Ви можете використовувати це;
QString data;
data.toStdString().c_str();
QString data;
data.toStdString().c_str();
~basic_string() _NOEXCEPT
{ // destroy the string
_Tidy_deallocate();
}
правильний шлях (безпечний - не виняток) - це, як пояснено вище від Артема
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()); }