【问题标题】:Qt convert unicode entitiesQt 转换 unicode 实体
【发布时间】:2015-06-11 16:42:58
【问题描述】:

在 QT 5.4 和 C++ 中,我尝试解码具有 unicode 实体的字符串。

我有这个 QString:

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

我想将此字符串转换为:fileÖÇŞİĞÜİçöşiğüı.txt

我尝试了QStringtoUtf8fromUtf8 方法。还尝试逐字符解码。

有没有办法使用Qt转换它?

【问题讨论】:

  • 可能您的控制台未配置为打印 Unicode。如果您在 Windows 提示符下执行,试试这个stackoverflow.com/questions/2492077/…
  • 谢谢。是的 windows 控制台也有 unicode 问题,但我需要在我的 cpp 代码中对其进行解码。
  • 您的字符串文字包含 Unicode 转义,这些字符可能不适合 8 位。在所有 Qt 平台上,char 是 8 位。您可能需要一个宽泛的文字:L"file\u00d6\u00c7\u015e\u0130..."
  • offtopic:对我来说,这个字符串看起来应该是应用程序配置设置,而不是硬编码。

标签: c++ windows qt visual-studio-2012 unicode


【解决方案1】:
#include <QTextDocument>

QTextDocument doc;

QString string = "file\u00d6\u00c7\u015e\u0130\u011e\u00dc\u0130\u00e7\u00f6\u015fi\u011f\u00fc\u0131.txt";
doc.setHtml(string);                   // to convert entities to text
QString result = doc.toPlainText();    // result = "fileÖÇŞİĞÜİçöşiğüı.txt"

如果您有 CONSOLE 应用,则无用 QTextDocument 需要 GUI 模块。

【讨论】:

  • 只是另一种方式
  • QStringLiteral 不要使用 QString 作为参数,所以如果你有 QString 就使用这种方式
【解决方案2】:

我刚刚测试了这段代码:

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();
}

这是 ubuntu 上的 Qt 5.4,所以看起来您的问题仅与某些操作系统有关。

【讨论】:

    【解决方案3】:

    Qt 提供了一个名为QStringLiteral 的宏来正确处理字符串文字。

    这是一个完整的工作示例:

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

    如上述 cmets 所述,您确实需要打印到支持这些字符的控制台才能使其正常工作。

    【讨论】:

    • 这适用于文本参数。当我将 QString 作为参数传递时,这不起作用。 QString string1 = "file\u00d6\u00c7\u015e\u0130\u011e\u00dc\u0130\u00e7\u00f6\u015fi\u011f\u00fc\u0131.txt";QString string2 = QStringLiteral(string);
    • 顾名思义,它用于字符串文字。所以在你的例子中你应该像这样包装你的:QString string1 = QStringLiteral("file\u00d6\u00c7\u015e\u0130\u011e\u00dc\u0130\u00e7\u00f6\u015fi\u011f\u00fc\u‌​0131.txt");
    猜你喜欢
    • 1970-01-01
    • 2015-03-07
    • 1970-01-01
    • 2015-07-15
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多