• 使用QString类进行编码转换

    QString 类包含了大量关于文本字符串编码转换的函数,涉及之前提到的 UTF-8、UTF-16、UTF-32、本地语言编码 Local8Bit,还有标准 C++ 的普通字符串 StdString 和宽字符串 StdWString,对于其他编码转为 QString,采用的是 QString::from* 静态公有成员函数,这些静态函数返回一个转换好的 QString 对象以供使用。与之对应的是 QString 类对象的 to* 函数,QString 对象可以调用这些 to* 函数转出为其他编码格式的字符串。

    下面将 QString 类这些成对的函数列一个表,方便查阅:

    转入函数 转出函数 描述
    fromLocal8Bit toLocal8Bit 与操作系统及本地化语言相关,Linux 一般是 UTF-8 字符串,Windows 一般是 ANSI 多字节编码字符串。
    fromUtf8 toUtf8 与 UTF-8 编码的字符串相互转换。
    fromUtf16 utf16 和
    unicode
    与 UTF-16(UCS2)编码的字符串互相转换,utf16 函数与 unicode 函数功能一样, 注意没有 to 前缀,因为 QString 运行时的内码就是 UTF-16,字符的双字节采用主机字节序。
    fromUcs4 toUcs4 与 UTF-32(UCS4)编码的字符串互相转换,一个字符用四个字节编码,占空间多,应用较少。
    fromStdString toStdString 与 std::string 对象互相转换,因为 C++11 规定标准字符串 std::string 使用 UTF-8 编码,这对函数功能与上面 **Utf8 转码函数相同。
    fromStdWString toStdWString 与 std::wstring 对象相互转换,在 Linux 系统里宽字符是四字节的 UTF-32,在 Windows 系统里宽字符是两字节的 UTF-16。因为不同平台有歧义,不建议使用。
    fromCFString
    fromNSString
    toCFString
    toNSString
    仅存在于苹果 Mac OS X 和 iOS 系统。

    下面展示一个 qtcodec 例子,里面主要使用 QString 对象的转出函数,然后使用 cout 或 qDebug 打印相应的输出。请「猛击这里」下载源代码。

    下载后解压到比如 D:\QtDemo\qtcodec 文件夹,然后用 QtCreator 打开该项目,项目配置和上节示范的一样。 然后打开 qtcodec.cpp 文件,查看里面的内容: 

    //qtcodec.cpp
    #include <QApplication>
    #include <QTextBrowser>
    #include <QDebug>
    #include <iostream>
    using namespace std;
    
    void Testcout(const QString &str)
    {
        //Locale charset
        cout<<str.toLocal8Bit().data()<<endl;
    
        //UTF-8
        cout<<str.toUtf8().data()<<endl;
        cout<<str.toStdString()<<endl;
    
        //UTF-16, Windows Unicode, UCS2
        cout<<str.unicode()<<endl;
        cout<<str.utf16()<<endl;
        cout<<str.data()<<endl;
    
        //UTF-32, UCS4
        cout<<str.toUcs4().data()<<endl;
    
        //wchar_t: Windows = UTF-16; Linux/Unix = UTF-32
        wcout<<str.toStdWString();
    
        cout<<endl<<endl;
    }
    
    void TestqDebug(const QString &str)
    {
        //Locale charset
        qDebug()<<str.toLocal8Bit().data();
    
        //UTF-8
        qDebug()<<str.toUtf8().data();
        qDebug()<<str.toStdString().data();
    
        //UTF-16, Windows Unicode, UCS2
        qDebug()<<str.unicode();
        qDebug()<<str.utf16();
        qDebug()<<str.data();
    
        //UTF-32, UCS4
        qDebug()<<str.toUcs4().data();
    
        //wchar_t: Windows = UTF-16; Linux/Unix = UTF-32
        qDebug()<<str.toStdWString().data();
    
        //QString object
        qDebug()<<str;
    }
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        QString strText = QObject::tr("1234打印汉字");
        QTextBrowser tb;
        tb.setText(strText);
        tb.setGeometry(40, 40, 400, 300);
        tb.show();
        //Test cout
        Testcout(strText);
        //Test qDebug
        //TestqDebug(strText);
    
        return a.exec();
    }

    qtcodec.cpp 里面首先是头文件包含和名字空间使用,然后是三个函数:Testcout、TestqDebug 和 main 函数。Testcout 和 TestqDebug 函数里的内容参看上面表格,就不一一解释了。

    需要注意一条,QString 类对象可以通过 data 函数返回它实际的数据存储块指针,如 str.data(),在后面运行测试时可以看到该指针数值。

    注意两个测试函数不要同时启用,一次测试一个,另一个注释掉,这样查看它们运行结果更清楚,而不会混淆。

    先测试 Testcout 函数运行效果:

更多...

加载中...