2012-10-04 9 views
7

मैंने क्यूटी में एक बहुत ही बुनियादी पाठ मैनिपुलेशन एप्लिकेशन लिखना शुरू किया, बिना जीयूआई के। मेरे पाठ में विशेष वर्ण थे, लेकिन किसी भी तरह से मैं उन विशेष पात्रों को मुद्रित करने में सक्षम नहीं था, इससे कोई फर्क नहीं पड़ता कि मैंने क्या किया। मैंने तब देखा, कि QCoreApplication उदाहरण जोड़ने के बाद (जिसे मैंने पहले हटा दिया था, क्योंकि मैंने सोचा था कि मुझे इसकी आवश्यकता नहीं होगी), सब कुछ ठीक उसी तरह काम करता था जैसा कि इसे करना चाहिए।क्यूस्ट्रिंग विशेष वर्णों का सही ढंग से इलाज क्यों नहीं करता है, जब कोई क्यूकोर आवेदन तत्काल नहीं किया जाता है?

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

QCoreApplication साथ आउटपुट (सब कुछ एकदम सही ढंग से काम करता है):

यहाँ कोड है लाइन, जहां QCoreApplication परिभाषित किया गया है बाहर टिप्पणी के बाद

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

आउटपुट (विशेष वर्ण नहीं हैं अब दिखाया गया है):

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

नोट, कि, qPrintabable(s) पर कॉल करने के बाद ही, विशेष वर्ण पहले से ही हटा दिए गए हैं। मैंने यह सुनिश्चित करने के लिए परीक्षण किया कि QDebug समस्या नहीं है।

मैंने यह भी जांच की कि फ़ाइल वास्तव में यूटीएफ -8 में एन्कोड की गई है या नहीं।

क्यूस्ट्रिंग विशेष वर्णों का सही ढंग से इलाज क्यों नहीं करता है, जब कोई QCoreApplication तत्काल नहीं किया गया है?

+0

यरी दिलचस्प सवाल ... मुझे लगता है कि कारण 'QTextCodec' या 'QTextStream' के भीतर हो सकता है, लेकिन मैं गलत हो सकता हूं। 'QDebug' एक 'QTextStream' का उपयोग करता है, लेकिन जैसा कि आपने देखा है,' qPrintable' (जो '.toLocal8Bit()। ConstData()' के लिए केवल एक शॉर्टेंड है) पहले से ही जादुई रूप से आपके गैर-असीसी वर्ण हटा देता है, या' '\ 0'', चूंकि यह एकमात्र स्पष्टीकरण है कि क्यों' strlen' वापस आना चाहिए 1. – leemes

+0

'' 0'' डालने का मामला नहीं है, क्योंकि मैंने अन्य तारों का परीक्षण '' '' के रूप में किया है, जहां अन्य अक्षरों का पालन किया जाता है एक विशेष चरित्र के बाद। वे हटाए नहीं गए हैं। दूसरे शब्दों में, यदि '' '' ''' '' '' है, तो 'QCoreAplication' का उपयोग न करने पर आउटपुट' "aa" 'है। – Misch

उत्तर

7

क्यूटी के स्रोत कोड के माध्यम से जाने के बाद, मैं इस कोड कहा जाता है भर में ठोकर खाई जब QCoreApplication निर्माण किया है:

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

दूसरे शब्दों में, "यूनिक्स" सिस्टम पर, QCoreApplication निर्माता setlocale के लिए एक कॉल कर रहा है (पाया locale.h में), जिसका उपयोग प्रोग्राम के वर्तमान लोकेल को सेट करने के लिए किया जाता है। यह अंततः qDebug से आउटपुट को प्रभावित करता है, जो QTextStream पर निर्भर करता है, जो अंत में इसका उपयोग करता है जो इसका उत्पादन करने के लिए सिस्टम-परिभाषित लोकेल है।

जब मैंने लिनक्स सिस्टम पर आपके कोड का परीक्षण किया, तो मुझे उसी परिणाम का सामना करना पड़ा जो आपने किया था। विंडोज सिस्टम पर, QCoreApplication निर्माण पर टिप्पणी करने से परिणाम पर कोई प्रभाव नहीं पड़ा। मैंने यह भी देखा कि printf के माध्यम से मूल स्ट्रिंग को प्रिंट करने से QCoreApplication का निर्माण किया गया था या नहीं, इसके बावजूद सही परिणाम दिया गया।

+0

तो क्या यह एक बग है, या क्यूटी निर्दिष्ट करता है कि किसी को अन्य क्यूटी घटकों या कक्षाओं का उपयोग करने से पहले 'क्यू (कोर) एप्लिकेशन' शुरू करना होगा? – Misch

+0

@ मिशक क्यूटी उन स्थितियों को निर्दिष्ट करता है जिनके तहत किसी को क्यू (कोर) एप्लिकेशन प्रारंभ करना होगा। Http://qt-project.org/doc/qt-4.8/qcoreapplication.html का संदर्भ लें। यह विशेष व्यवहार "लोकेल सेटिंग्स" अनुभाग के तहत दस्तावेज किया गया है। –

संबंधित मुद्दे