Ho iniziato a scrivere un'applicazione di manipolazione del testo molto semplice in Qt, senza una GUI. Il mio testo conteneva caratteri speciali, ma in qualche modo non ero in grado di stampare quei caratteri speciali, non importa quello che facevo. Ho poi notato che dopo aver aggiunto un'istanza QCoreApplication
(che avevo precedentemente rimosso, perché pensavo che non avrei avuto bisogno), tutto ha funzionato esattamente come dovrebbe.Perché QString non tratta correttamente caratteri speciali, quando non è stata creata un'istanza di QCoreApplication?
Ecco il codice:
#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;
}
uscita con QCoreApplication
(tutto funziona come dovrebbe):
"aää"
"aää"
"aää"
"aää"
"aää"
aää
3
5
uscita dopo aver commentato la riga, dove QCoreApplication
definito (i caratteri speciali non sono mostrato più):
"a"
"a"
"a"
"a"
"a"
a
3
1
Nota, che già dopo aver chiamato qPrintabable(s)
, i caratteri speciali sono già stati rimossi. Ho verificato questo per sicurezza, che QDebug
non è il problema.
Ho anche controllato se il file è realmente codificato in UTF-8.
Perché QString non tratta correttamente caratteri speciali, quando è stato istanziato il numero QCoreApplication
?
Yery domanda interessante ... Immagino che la ragione potrebbe essere all'interno di 'QTextCodec' o' QTextStream', ma potrei sbagliarmi. 'QDebug' usa un' QTextStream', ma come hai notato, 'qPrintable' (che è solo una scorciatoia per' .toLocal8Bit(). ConstData() ') rimuove magicamente i tuoi caratteri non-ascii, o inserisce un' '\ 0'', poiché questa è l'unica spiegazione per cui 'strlen' deve restituire 1. – leemes
L'inserimento di'' \ 0'' non è il caso, poiché ho testato altre stringhe come '" aäa "', dove seguono altre lettere dopo un personaggio speciale. Non vengono rimossi. In altre parole, se 's' è' "aäa" ', l'output quando non si usa' QCoreApplication' è '" aa "'. – Misch