답변:
변환 할 때 기억해야 할 것들 중 하나 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
(latin1이 아닌지 여부와 상관없이) 파이프 연산자에서 액세스 위반이 발생합니다 . 이것은 Qt는에서 4.8.3 / MSVC ++ 10 / 윈 7입니다
당신이 사용할 수있는:
QString qs;
// do things
std::cout << qs.toStdString() << std::endl;
내부적으로 QString :: toUtf8 () 함수를 사용하여 std :: string을 생성하므로 유니 코드도 안전합니다. 에 대한 참조 문서는 다음과 같습니다QString
.
QString::toStdString()
부터는 QString::toUtf8()
변환을 수행하는 데 사용 되므로 문자열의 유니 코드 속성이 손실되지 않습니다 ( qt-project.org/doc/qt-5.0/qtcore/qstring.html#toStdString ).
궁극적 인 목표가 콘솔에 메시지를 디버깅하는 것이라면 qDebug ()를 사용할 수 있습니다 .
다음과 같이 사용할 수 있습니다.
qDebug()<<string;
콘솔에 내용을 인쇄합니다 .
이 방법은 std::string
디버깅 메시지를 위해 변환하는 것보다 낫습니다 .
가장 좋은 방법은 연산자 << 자신을 오버로드하여 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);
QtGlobal 에서 const char *를 전달하는 매크로 인 qPrintable documentation을 참조하십시오 .
이것을 사용할 수 있습니다.
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()); }