ฉันพยายามทำสิ่งนี้:
QString string;
// do things...
std::cout << string << std::endl;
แต่รหัสไม่ได้รวบรวม วิธีการส่งออกเนื้อหาของ qstring ลงในคอนโซล (เช่นสำหรับการแก้ไขจุดบกพร่องหรือเหตุผลอื่น ๆ )? วิธีการแปลงQString
เป็นstd::string
?
ฉันพยายามทำสิ่งนี้:
QString string;
// do things...
std::cout << string << std::endl;
แต่รหัสไม่ได้รวบรวม วิธีการส่งออกเนื้อหาของ qstring ลงในคอนโซล (เช่นสำหรับการแก้ไขจุดบกพร่องหรือเหตุผลอื่น ๆ )? วิธีการแปลงQString
เป็นstd::string
?
คำตอบ:
หนึ่งในสิ่งที่คุณควรจำไว้เมื่อมีการแปลง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 สามารถส่งเป็นชนิดไปยังไลบรารีใด ๆ ที่ต้องการประเภทเอาต์พุตที่สามารถทำได้
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::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()); }