Empecé a escribir una aplicación de manipulación de texto muy básica en Qt, sin una GUI. Mi texto contenía caracteres especiales, pero de alguna manera no pude imprimir esos caracteres especiales, sin importar lo que hice. Entonces noté que después de agregar una instancia de QCoreApplication
(que había eliminado previamente, porque pensé que no la necesitaría), todo funcionó como debería.¿Por qué QString no trata los caracteres especiales correctamente cuando no se ha creado una instancia de QCoreApplication?
Aquí está el código:
#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;
}
salida con QCoreApplication
(todo funciona como debería):
"aää"
"aää"
"aää"
"aää"
"aää"
aää
3
5
de salida después de comentar la línea, donde QCoreApplication
se define (caracteres especiales no son se muestra más):
"a"
"a"
"a"
"a"
"a"
a
3
1
Nota, eso ya después de llamar al qPrintabable(s)
, los caracteres especiales ya se eliminaron. He probado esto para estar seguro, que QDebug
no es el problema.
También verifiqué si el archivo está realmente codificado en UTF-8.
¿Por qué QString no trata los caracteres especiales correctamente cuando no se ha creado una instancia de QCoreApplication
?
Yery pregunta interesante ... Supongo que la razón podría estar dentro de 'QTextCodec' o' QTextStream', pero podría estar equivocado. 'QDebug' usa un' QTextStream', pero como habrás notado, el 'qPrintable' (que es solo una abreviatura de' .toLocal8Bit(). ConstData() ') ya elimina mágicamente tus caracteres no ascii, o inserta un' '\ 0'', ya que esta es la única explicación de por qué 'strlen' debería devolver 1. – leemes
Insertar'' \ 0'' no es el caso, ya que he probado otras cadenas como '" aaa '', donde siguen otras letras después de un personaje especial. Ellos no son eliminados. En otras palabras, si 's' es' "aaa' ', la salida cuando no se usa' QCoreApplication' es '" aa "'. – Misch