2015-04-07 4 views
7

In QT 5.4 und C++ versuche ich eine Zeichenkette mit Unicode-Entities zu dekodieren.Qt konvertiert Unicode-Entities

Ich habe dieses QString:

QString string = "file\u00d6\u00c7\u015e\u0130\u011e\u00dc\u0130\u00e7\u00f6\u015fi\u011f\u00fc\u0131.txt"; 

Ich mag diese Zeichenfolge diese konvertieren: fileÖÇŞİĞÜİçöşiğüı.txt

Ich versuchte QString ‚s toUtf8 und fromUtf8 Methoden. Auch versucht, es Zeichen für Zeichen zu entschlüsseln.

Gibt es eine Möglichkeit, es mit Qt zu konvertieren?

+1

Wahrscheinlich ist Ihre Konsole nicht zum Drucken von Unicode konfiguriert. Wenn Sie Windows Prompt ausführen, versuchen Sie dies http://stackoverflow.com/questions/2492077/output-unicode-strings-in-windows-console-app – KuramaYoko

+0

Vielen Dank. Ja Windows-Konsole hat auch Unicode-Probleme, aber ich muss es in meinen cpp-Codes dekodieren. – trante

+0

Ihr String-Literal enthält Unicode-Escapes, Zeichen, die wahrscheinlich nicht in 8 Bits passen. Und auf al Qt-Plattformen ist 'char' 8 Bit. Sie werden wahrscheinlich ein breites Literal brauchen: 'L 'Datei \ u00d6 \ u00c7 \ u015e \ u0130 ..." ' – MSalters

Antwort

2

Ich habe gerade diesen Code getestet: nur

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    QString s = "file\u00d6\u00c7\u015e\u0130\u011e\u00dc\u0130\u00e7\u00f6\u015fi\u011f\u00fc\u0131.txt"; 
    qDebug() << s.length(); //Outputs: 22 
    qDebug() << s;   //Outputs: fileÖÇŞİĞÜİçöşiğüı.txt 
    return a.exec(); 
} 

Dies ist mit Qt 5.4 auf Ubuntu, so sieht es aus wie das Problem mit einigen OS ist.

7

Qt stellt ein Makro mit der Bezeichnung QStringLiteral für die korrekte Verarbeitung von Zeichenfolgenliteralen bereit.

Hier ist ein voll funktionierendes Beispiel:

#include <QString> 
#include <QDebug> 

int main(void) { 
    QString string = QStringLiteral("file\u00d6\u00c7\u015e\u0130\u011e\u00dc\u0130\u00e7\u00f6\u015fi\u011f\u00fc\u0131.txt"); 
    qDebug() << string; 

    return 0; 
} 

Wie in den obigen Kommentaren erwähnt, müssen Sie auf eine Konsole drucken, die diese Zeichen für diese Arbeit unterstützt.

+0

Dies funktioniert für Textargumente. Wenn ich einen QString als Argument übergebe, funktioniert das nicht. '' 'QString string1 =" Datei \ u00d6 \ u00c7 \ u015e \ u0130 \ u011e \ u00dc \ u0130 \ u00e7 \ u00f6 \ u015fi \ ​​u011f \ u00fc \ u0131.txt ";' '' '' 'QString String2 = QStringLiteral (String); '' ' – trante

+1

Wie der Name schon sagt, ist es * nur * für String-Literale gedacht. Also in Ihrem Beispiel sollten Sie Ihre wie folgt verpackt haben: 'QString string1 = QStringLiteral (" file \ u00d6 \ u00c7 \ u0015e \ u0130 \ u011e \ u00dc \ u0130 \ u00e7 \ u00f6 \ u015fi \ ​​u011f \ u00fc \ u0131.txt ");' – MrEricSir