回答:
変換するときに忘れてはならないことの一つ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;
。1つ目は正しくなく、2つ目は完璧です。これをテストするには、utf8端末が必要です。
.toStdString()
、私にとっては、QString
の内容(latin1でないかどうか)に関係なく、常にパイプオペレーターでアクセス違反が発生します。これは、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
、デバッグメッセージのためだけに変換するよりも優れています。
最良の方法は、operator <<をオーバーロードして、出力可能な型を想定している任意のライブラリにQStringを型として渡すことができるようにすることです。
std::ostream& operator<<(std::ostream& str, const QString& string) {
return str << string.toStdString();
}
これを使用できます。
QString data;
data.toStdString().c_str();
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()); }