কিউ স্ট্রিংকে কীভাবে std :: স্ট্রিংয়ে রূপান্তর করবেন?


229

আমি এরকম কিছু করার চেষ্টা করছি:

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

কিন্তু কোডটি সংকলন করে না। কীভাবে কনসোলটিতে Qstring এর সামগ্রী আউটপুট করবেন (উদাহরণস্বরূপ ডিবাগিং উদ্দেশ্যে বা অন্যান্য কারণে)? কীভাবে রূপান্তর QStringকরবেন std::string?

উত্তর:


222

রূপান্তর QStringকরার সময় আপনার মনে রাখা উচিত যেগুলিগুলির std::stringমধ্যে একটি QStringহ'ল ইউটিএফ -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


এটি নিরাপদ নয় এবং সঠিক উপায়ে তুলনায় কিছুটা ধীর er আপনি স্ট্যাকের উপরে তৈরি কিউবাইটআরির ডেটা অ্যাক্সেস করছেন। QByteArray এর ডেস্ট্রাক্টরকে এসটিএল স্ট্রিংয়ের কনস্ট্রাক্টরের আগে ডাকা যেতে পারে। কোনও সহায়ক ফাংশন তৈরির নিরাপদতম উপায়। static inline std::string toUtf8(const QString& s) { QByteArray sUtf8 = s.toUtf8(); return std::string(sUtf8.constData(), sUtf8.size()); }
ভাইটালি

17
পছন্দ করেছেন "এসবিএল স্ট্রিংয়ের কনস্ট্রাক্টরের আগে কিউবাইটআরয়ের জন্য ডেস্ট্রাক্টর ডেকে আনা যেতে পারে" সঠিক বক্তব্যটি সঠিক নয়: মানটির উদ্ধৃতি: 12.2.3 অস্থায়ী বস্তুগুলি সম্পূর্ণ-এক্সপ্রেশন (1.9) মূল্যায়নের শেষ পদক্ষেপ হিসাবে নষ্ট হয় যা (সংক্ষিপ্তভাবে) তারা তৈরি করা হয়েছে যেখানে পয়েন্ট রয়েছে। এবং সম্পূর্ণ প্রকাশটি std::string utf8_text = qs.toUtf8().constData();তাই আপনার বক্তব্যটি সঠিক নয়
আরটিয়াম

এটি সত্য - আমি কনস্ট চর * x = qs.ToUtf8 ()। কনস্ট্যাটাটা () সম্পর্কে ভাবছিলাম। তবুও কি কেবল qs.toStdString () কল করা সহজ নয়?
ভিটালী

6
@ ভিটালি নং এটি নন-ল্যাটিন 1 অক্ষর হারিয়েছে। এই চেষ্টা করুন: 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 টার্মিনাল প্রয়োজন।
নোটলিস্ট

3
এটির .toStdString()জন্য মূল্যবান, আমার পক্ষে সর্বদা পাইপ অপারেটরে অ্যাক্সেস লঙ্ঘনের ফলাফল হয়, নির্বিশেষে QStringএর লিখিত সামগ্রী (নন-ল্যাটিন 1 নয়)। এটি Qt 4.8.3 / MSVC ++ 10 / Win 7. এ রয়েছে
ড্যানিয়েল সানার

269

তুমি ব্যবহার করতে পার:

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

এটি অভ্যন্তরীণভাবে স্ট্র্যাড :: স্ট্রিং তৈরি করতে QString :: toUtf8 () ফাংশন ব্যবহার করে, তাই এটি ইউনিকোডও নিরাপদ। এখানে রেফারেন্স ডকুমেন্টেশন QString


73
Qt 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;

জিজ্ঞাসার আগে আমি << qtr প্রথমে চেষ্টা করেছিলাম, তবে এটি সংকলন করে নি। যদিও এটি qstr.toStdString () এর সাথে কাজ করে।
আগস্টিন

2
আমি তাই মনে করি না. আপনি std :: cout << qtr চেষ্টা করেছেন, কিউ টেক্সটস্ট্রিং (স্টাডআউট) << qtr নয়;
ক্রিস

18

সর্বোত্তম জিনিসটি হ'ল ওভারলোড অপারেটর << নিজেই, যাতে কিউ স্ট্রিং কোনও আউটপুট-সক্ষম টাইপ আশা করে যে কোনও লাইব্রেরিতে প্রকার হিসাবে পাস করতে পারে।

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

3
ভাবা ভোট কেন? এটি আমার ক্ষেত্রে ওভারকিল, তবে কে জানে, এটি কার্যকর হতে পারে (আমার বা অন্য কারও জন্য)।
আগস্টিন

আমি এটি পছন্দ করি কারণ Qt এর স্ট্রিংগুলির কাজ করার পদ্ধতিটি বদলে ফেলার অভ্যাস রয়েছে - এবং এটি রূপান্তরটিকে এক জায়গায় রাখে।
ডেন-জেসন

12

প্রস্তাবিত বিকল্প:

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

হতে পারে:

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

কিউটি মুদ্রণযোগ্য ডকুমেন্টেশন দেখুন, কিউটিগ্লোবাল থেকে কনস্ট চর সরবরাহকারী একটি ম্যাক্রো।


2
এটি -no-stlঅপশন সেট সহ কিউটি-বিল্ড দিয়েও কাজ করে। আরও কিছু তথ্য
সেনি



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

এমনকি xstring এ VS2017 সংকলকটিতে ব্যতিক্রম ছুঁড়ে ফেলতে পারে

 ~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
প্রশ্নটি খুব স্পষ্ট: কিউস্ট্রিংকে স্টাড :: স্ট্রিংয়ে রূপান্তর করুন, এটি মুদ্রণের জন্য নয়।
eyllanesc

@ আইলেনেস্ক প্রশ্নের পাঠ্যটিতে "কীভাবে কনসোলটিতে কাস্টিংয়ের সামগ্রী আউটপুট করা যায়?" মনে হয় ওপি স্টাড :: স্ট্রিংয়ে রূপান্তর একমাত্র উপায়। এটি একবারে দুটি প্রশ্ন জিজ্ঞাসা করা হচ্ছে।
এমএম

@ এমএম প্রশ্নটি অস্পষ্ট বলে মনে হচ্ছে শিরোনামে প্রশ্নটি বলে যে কিউ স্ট্রিংকে স্টাডি :: স্ট্রিংয়ে কীভাবে রূপান্তর করা যায়? , সম্ভবত এটি একটি এক্সওয়াই সমস্যা।
eyllanesc
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.