QString को std :: string में कैसे कन्वर्ट करें?


229

मैं ऐसा कुछ करने की कोशिश कर रहा हूं:

QString string;
// do things...
std::cout << string << std::endl;

लेकिन कोड संकलित नहीं करता है। कंसोल में qstring की सामग्री का उत्पादन कैसे करें (उदाहरण डीबगिंग उद्देश्यों या अन्य कारणों के लिए)? कैसे कन्वर्ट करने के लिए QStringकरने के लिए std::string?

जवाबों:


222

चीजें आप को याद रखना चाहिए जब परिवर्तित करने से एक 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();

यदि आप कोडेक निर्दिष्ट करते हैं तो सुझाई गई (स्वीकृत) विधि काम कर सकती है।

देखें: http://doc.qt.io/qt-5/qstring.html#toLatin1


यह सुरक्षित नहीं है और उचित तरीके से थोड़ा धीमा है। आप स्टैक पर बनाए गए QByteArray के डेटा को एक्सेस कर रहे हैं। QByteArray के लिए विध्वंसक STL स्ट्रिंग के निर्माता से पहले बुलाया जा सकता है। सहायक फ़ंक्शन बनाने का सबसे सुरक्षित तरीका है। static inline std::string toUtf8(const QString& s) { QByteArray sUtf8 = s.toUtf8(); return std::string(sUtf8.constData(), sUtf8.size()); }
विटाली

17
@ वैली सही नहीं। "QByteArray के लिए विध्वंसक को STL स्ट्रिंग के निर्माता से पहले बुलाया जा सकता है" सही कथन नहीं है: मानक का हवाला देते हुए: 12.2.3 पूर्ण-अभिव्यक्ति (1.9) के मूल्यांकन में अंतिम चरण के रूप में अस्थाई वस्तुओं को नष्ट कर दिया जाता है जो (शाब्दिक रूप से) इसमें वह बिंदु शामिल है जहां वे बनाए गए थे। और वहाँ पूर्ण अभिव्यक्ति है std::string utf8_text = qs.toUtf8().constData();इसलिए आपका कथन सही नहीं है
आर्टीकॉम

यह सच है - मैं const char * x = qs.ToUtf8 ()। ConstData () के बारे में सोच रहा था। फिर भी, सिर्फ qs.toStdString () को कॉल करना आसान नहीं है?
विटाली

6
@Vitali नं। गैर- latin1 अक्षर खो देता है। इस प्रयास करें: 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 टर्मिनल की आवश्यकता है।
Notinlist

3
इसके लायक यह है, .toStdString()मेरे लिए हमेशा पाइप ऑपरेटर में एक पहुंच उल्लंघन के परिणामस्वरूप होता है, भले ही QStringसामग्री (गैर-लैटिन 1 या न हो)। यह Qt 4.8.3 / MSVC ++ 10 / विन 7 पर है
डैनियल सानेर

269

आप उपयोग कर सकते हैं:

QString qs;
// do things
std::cout << qs.toStdString() << std::endl;

यह आंतरिक रूप से QString :: toUtf8 () फ़ंक्शन का उपयोग std :: string बनाने के लिए करता है, इसलिए यह यूनिकोड भी सुरक्षित है। यहाँ के लिए संदर्भ प्रलेखन है QString


73
क्यूटी 5.0 के रूप में, QString::toStdString()अब QString::toUtf8()रूपांतरण करने के लिए उपयोग करता है, इसलिए स्ट्रिंग के यूनिकोड गुण खो नहीं जाएंगे ( qt-project.org/doc/qt-5.0/qtcore/qstring.html#toStdString )।
एमिल कॉर्मियर

और यदि आप के लिए स्रोत कोड की जाँच करना चाहते हैं QString::toStdString, तो यहाँ है
ठग

1
मैं यह देखने के लिए कैसे परीक्षण कर सकता हूं कि क्या यह वास्तव में यूनिकोड संपत्ति खो देता है? यूनिकोड वर्णों का उपयोग करेगा (जैसे अंग्रेजी के अलावा अन्य भाषा से कहेंगे)?
यूसुफ आजाद

35

यदि आपका अंतिम उद्देश्य कंसोल को डिबगिंग संदेश प्राप्त करना है, तो आप qDebug () का उपयोग कर सकते हैं ।

आप की तरह उपयोग कर सकते हैं,

qDebug()<<string;जो कंसोल के लिए सामग्री मुद्रित करेगा ।

यह तरीका std::stringकेवल डिबगिंग संदेशों के लिए इसे रूपांतरित करने से बेहतर है ।


1
qDebug () अधिक बेहतर होगा, क्योंकि यह अधिक Qt प्रकारों का समर्थन करता है।
कामिल क्लीमेक

24
QString qstr;
std::string str = qstr.toStdString();

हालाँकि, यदि आप Qt का उपयोग कर रहे हैं:

QTextStream out(stdout);
out << qstr;

मैंने कोशिश की थी << पूछना पहले, पूछने से पहले, लेकिन यह संकलन नहीं था। यह qstr.toStdString () के साथ काम करता है, हालांकि।
अगस्तिन

2
मुझे ऐसा नहीं लगता। आपने std :: cout << qstr, not qextextring (stdout) << qstr;
क्रिस

18

सबसे अच्छी बात यह है कि ऑपरेटर को अधिभारित किया जाएगा << अपने आप को, ताकि QString को किसी भी लाइब्रेरी में एक प्रकार के रूप में पारित किया जा सके, जिसमें आउटपुट-सक्षम प्रकार की अपेक्षा हो।

std::ostream& operator<<(std::ostream& str, const QString& string) {
    return str << string.toStdString();
}

3
क्यों नीचे वोट, दोस्तों? यह मेरे मामले में एक ओवरकिल है, लेकिन कौन जानता है, यह उपयोगी हो सकता है (मेरे या किसी और के लिए)।
अगस्तिन

मुझे यह पसंद है क्योंकि क्यूटी को अपने तार के काम करने के तरीके को बदलने की आदत है - और यह रूपांतरण को एक स्थान पर रखता है।
डेन-जेसन

12

प्रस्तावित का एक विकल्प:

QString qs;
std::string current_locale_text = qs.toLocal8Bit().constData();

हो सकता है:

QString qs;
std::string current_locale_text = qPrintable(qs);

QPrintable दस्तावेज़ीकरण देखें, QtGlobal से एक कास्ट चार * वितरित करने वाला मैक्रो।


2
यह Qt-Build with -no-stl-Option सेट के साथ भी काम करता है । कुछ और जानकारी
सेनकी



0
 QString data;
   data.toStdString().c_str();

यहां तक ​​कि वीएस2017 कंपाइलर पर एक्सस्ट्रिंग में अपवाद भी फेंक सकता है

 ~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();

-1

इसे इस्तेमाल करे:

#include <QDebug>
QString string;
// do things...
qDebug() << "right" << string << std::endl;

1
प्रश्न बहुत स्पष्ट है: QString को std :: string में रूपांतरित करें, इसे प्रिंट करने के लिए नहीं।
आंखों की रोशनी

@eyllanesc प्रश्न पाठ में लिखा है "कंसोल में qstring की सामग्री का उत्पादन कैसे करें?" , ऐसा लगता है कि ओपी एसटीडी में परिवर्तित हो जाता है :: स्ट्रिंग एकमात्र तरीका है। यह वास्तव में एक बार में पूछे जाने वाले दो प्रश्न हैं।
एमएम

@MM प्रश्न स्पष्ट नहीं लगता है क्योंकि शीर्षक में प्रश्न कहता है कि QString को std में परिवर्तित कैसे करें :: string? , शायद यह एक XY समस्या है।
पलक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.