Tôi bắt đầu viết một ứng dụng thao tác văn bản rất cơ bản trong Qt, không có GUI. Văn bản của tôi chứa các ký tự đặc biệt, nhưng bằng cách nào đó tôi không thể in các ký tự đặc biệt đó, bất kể tôi đã làm gì. Sau đó, tôi nhận thấy rằng sau khi thêm một cá thể QCoreApplication
(mà trước đây tôi đã xóa, vì tôi nghĩ mình không cần nó), mọi thứ hoạt động bình thường.Tại sao QString không xử lý các ký tự đặc biệt một cách chính xác, khi không có ứng dụng QCoreApplication được khởi tạo?
Đây là mã:
#include <QCoreApplication>
#include <QString>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString s(QString::fromUtf8("aä\xc3\xa4")); // aää
qDebug() << s;
qDebug() << s.toAscii();
qDebug() << s.toLatin1();
qDebug() << s.toUtf8();
qDebug() << s.toLocal8Bit();
qDebug("%s", qPrintable(s));
qDebug("%i", s.length());
qDebug("%i", strlen(qPrintable(s)));
return 0;
}
Output với QCoreApplication
(mọi thứ hoạt động như mong muốn):
"aää"
"aää"
"aää"
"aää"
"aää"
aää
3
5
Output sau khi cho ý kiến ra đường, nơi QCoreApplication
được định nghĩa (ký tự đặc biệt không được hiển thị nữa):
"a"
"a"
"a"
"a"
"a"
a
3
1
Lưu ý rằng sau khi gọi qPrintabable(s)
, các ký tự đặc biệt đã bị xóa. Tôi đã thử nghiệm điều này để đảm bảo rằng QDebug
không phải là vấn đề.
Tôi cũng đã kiểm tra xem tệp có thực sự được mã hóa trong UTF-8 hay không.
Tại sao QString không xử lý các ký tự đặc biệt một cách chính xác khi không có QCoreApplication
được khởi tạo?
Câu hỏi thú vị thú vị ... Tôi đoán rằng lý do có thể nằm trong 'QTextCodec' hoặc' QTextStream', nhưng tôi có thể sai. 'QDebug' sử dụng' QTextStream', nhưng như bạn đã nhận thấy, 'qPrintable' (chỉ là viết tắt của' .toLocal8Bit(). ConstData() ') đã loại bỏ một cách kỳ diệu các ký tự không phải ascii của bạn, hoặc chèn một' '\ 0'', vì đây là giải thích duy nhất tại sao 'strlen' nên trả về 1. – leemes
Chèn'' \ 0'' không phải là trường hợp, vì tôi đã thử nghiệm các chuỗi khác là '" aäa "', trong đó các chữ cái khác theo sau sau một nhân vật đặc biệt. Chúng không bị loại bỏ. Nói cách khác, nếu 's' là' "aäa" ', đầu ra khi không sử dụng' QCoreApplication' là '" aa "'. – Misch