2012-10-04 17 views
7

GUI olmadan Qt'de çok basit bir metin işleme uygulaması yazmaya başladım. Metnim özel karakterler içeriyordu, ancak bir şekilde, ne yaptığım önemli değil, bu özel karakterleri basamıyorum. Daha sonra fark ettim ki, QCoreApplication örneğini ekledikten sonra (daha önce çıkarmış olduğum için ihtiyacım olmadı diye düşündüm), her şey gerektiği gibi çalıştı.QCoreApplication başlatılmadığında, QString neden özel karakterleri doğru şekilde uygulamıyor?

#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; 
} 

Çıktı QCoreApplication ile (her şey olması gerektiği gibi çalışır): Burada

kodudur tanımlanır QCoreApplication hattı, yorumunu kaldırdıktan sonra

"aää" 
"aää" 
"aää" 
"aää" 
"aää" 
aää 
3 
5 

Çıkış (özel karakterler değildir (burada gösterilen):

"a" 
"a" 
"a" 
"a" 
"a" 
a 
3 
1 

Not qPrintabable(s) numaralı telefonu aradıktan sonra, özel karakterler zaten kaldırılmış. Bunu test ettim, bu QDebug problem değil. Dosya gerçekten UTF-8 olarak kodlanmış olması durumunda

Ben de kontrol ettim. Hiçbir QCoreApplication örneği edildiğinde

Neden doğru tedavi özel karakterler QString etmiyor? QCoreApplication inşa edildiğinde

+0

Yery ilginç bir soru ... Ben neden 'QTextCodec' veya' QTextStream' içinde olabileceğini tahmin ediyorum, ama yanlış olabilir. 'QDebug' bir' QTextStream' kullanır, ancak fark etmiş gibi (.toLocal8Bit(). ConstData() '' sadece bir kısaltmadır) 'qPrintable' zaten sihirli ASCII olmayan karakterleri kaldırır veya ekler' '\ 0', çünkü bu strlen'in 1 döndürmesi gereken tek açıklamadır. – leemes

+0

Diğer karakterleri takip eden "aäa" gibi diğer dizeleri test ettiğimden, '' \ 0 '' ifadesini eklemek mümkün değildir. özel bir karakterden sonra. Onlar kaldırılmaz. Başka bir deyişle, eğer '' 'aaa' 'ise,' QCoreApplication' kullanılmadığında çıktı 'aa' 'dır. – Misch

cevap

7

QT'ın kaynak koduna göz gittikten sonra ben olarak adlandırılan bu kod rastladım: Başka bir deyişle

#ifdef Q_OS_UNIX 
    setlocale(LC_ALL, "");    // use correct char set mapping 
    qt_locale_initialized = true; 
#endif 

, "Unix" sistemlerde, QCoreApplication yapıcısı setlocale için bir çağrı yapıyor (bulundu Programın geçerli yerel ayarını yapmak için kullanılan locale.h). Bu sonuçta, çıktıyı oluşturmak için sistem tanımlı yerel ayar olduğuna inandığı QTextStream belgesine dayanan qDebug çıktısını etkiler. Bir Linux sisteminde kodunuzu test

, yaptığını aynı sonucu karşılaştı. Bir Windows sisteminde, QCoreApplication yapısına yorum eklerken sonuçların hiçbir etkisi olmadı. Ayrıca, orijinal dize printf aracılığıyla yazdırmanın, QCoreApplication'un yapılandırılmış olup olmadığına bakılmaksızın doğru sonucu verdiğini fark ettim.

+0

, bu bir hatadır mı, yoksa Qt, diğer Qt bileşenlerini veya sınıflarını kullanmadan önce bir "Q (Çekirdek) Uygulaması" nı başlatması gerektiğini belirtir mi? – Misch

+0

@Misch Qt, bir Q (Çekirdek) Uygulaması başlatılması gereken koşulları belirtir. Http://qt-project.org/doc/qt-4.8/qcoreapplication.html adresine bakın. Bu özel davranış, "Yerel Ayarlar" bölümünde belgelenmiştir. –

İlgili konular