使用QString类进行编码转换
QString 类包含了大量关于文本字符串编码转换的函数,涉及之前提到的 UTF-8、UTF-16、UTF-32、本地语言编码 Local8Bit,还有标准 C++ 的普通字符串 StdString 和宽字符串 StdWString,对于其他编码转为 QString,采用的是 QString::from* 静态公有成员函数,这些静态函数返回一个转换好的 QString 对象以供使用。与之对应的是 QString 类对象的 to* 函数,QString 对象可以调用这些 to* 函数转出为其他编码格式的字符串。
下面将 QString 类这些成对的函数列一个表,方便查阅:
下面展示一个 qtcodec 例子,里面主要使用 QString 对象的转出函数,然后使用 cout 或 qDebug 打印相应的输出。请「猛击这里」下载源代码。
下载后解压到比如 D:\QtDemo\qtcodec 文件夹,然后用 QtCreator 打开该项目,项目配置和上节示范的一样。 然后打开 qtcodec.cpp 文件,查看里面的内容:
需要注意一条,QString 类对象可以通过 data 函数返回它实际的数据存储块指针,如 str.data(),在后面运行测试时可以看到该指针数值。
注意两个测试函数不要同时启用,一次测试一个,另一个注释掉,这样查看它们运行结果更清楚,而不会混淆。
先测试 Testcout 函数运行效果:
QtCreator 输出面板会自动捕获命令行输出,对于命令行(控制台)输出,其字体颜色是黑色的。查看上面输出可以发现,在 Windows 命令行里是只有第一个本地化字符串能正常显示汉字,其他的不是指针就是乱码。所以在与 Windows 命令行进行输入输出沟通时,应该使用 fromLocal8Bit (获取命令行输入)和 toLocal8Bit(输出到命令行)。
顺便提一下,Windows 系统里的 API 通常有两套同名的,比如 LoadLibrary 函数,这个名字只是一个宏定义,在 VC++ 环境,对于 ANSI 多字节程序,它真实函数是 LoadLibraryA,对于 Unicode 程序,它真实函数是 LoadLibraryW。如果读者以后遇到需要和 Windows API 函数打交道时,对于输入输出有乱码的,可以类似的测试一下 QString 的转码函数,对于 ANSI 多字节程序的 API,一般可以用 fromLocal8Bit 和 toLocal8Bit 函数进行沟通;对于 Unicode 程序的 API,可以用 fromUtf16 和 utf16 进行沟通,多试试就可以了。
对 Unix/Linux 系统就没那么多事,因为默认都是 UTF-8 的字符串。
接下来,我们把 main 函数里的 Testcout 函数调用注释掉,将第二个 TestqDebug 函数启用,测试第二个函数的显示效果:
qDebug 可以正确显示 Utf8 、StdString 编码的字符串,当然还能智能打印 QString 对象的内容,会用双引号包起来。一般直接使用
命令行里看不到 cout 的输出,有方法可以查看,就是通过管道命令:
QtCreator 输出面板捕获的命令行输出与上图汉字显示是一致的,所以以后都可以直接用 QtCreator 输出面板来查看命令行输出,不用从命令行自己查看输出的。
QString 类中关于字符编码的函数都放到本节列举并测试了,后面就不重复介绍了。下一节我们学习 QString 常见的使用方式,QString 是 Qt 程序的基础,可以说每个 Qt 程序都会用到的,所以大家先不要着急学习图形控件编程,要先打好基础。
下面将 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 函数运行效果:
QtCreator 输出面板会自动捕获命令行输出,对于命令行(控制台)输出,其字体颜色是黑色的。查看上面输出可以发现,在 Windows 命令行里是只有第一个本地化字符串能正常显示汉字,其他的不是指针就是乱码。所以在与 Windows 命令行进行输入输出沟通时,应该使用 fromLocal8Bit (获取命令行输入)和 toLocal8Bit(输出到命令行)。
顺便提一下,Windows 系统里的 API 通常有两套同名的,比如 LoadLibrary 函数,这个名字只是一个宏定义,在 VC++ 环境,对于 ANSI 多字节程序,它真实函数是 LoadLibraryA,对于 Unicode 程序,它真实函数是 LoadLibraryW。如果读者以后遇到需要和 Windows API 函数打交道时,对于输入输出有乱码的,可以类似的测试一下 QString 的转码函数,对于 ANSI 多字节程序的 API,一般可以用 fromLocal8Bit 和 toLocal8Bit 函数进行沟通;对于 Unicode 程序的 API,可以用 fromUtf16 和 utf16 进行沟通,多试试就可以了。
对 Unix/Linux 系统就没那么多事,因为默认都是 UTF-8 的字符串。
接下来,我们把 main 函数里的 Testcout 函数调用注释掉,将第二个 TestqDebug 函数启用,测试第二个函数的显示效果:
qDebug 可以正确显示 Utf8 、StdString 编码的字符串,当然还能智能打印 QString 对象的内容,会用双引号包起来。一般直接使用
qDebug()<<对象名;
这种方式就可以了,qDebug()会智能打印 Qt 对象和常规的 C++ 数据类型。
小窍门
最后教读者一个小窍门,在 Windows 里的 Qt 命令行下运行第一个 Testcout 函数的测试结果:命令行里看不到 cout 的输出,有方法可以查看,就是通过管道命令:
qtcodec.exe | more
这样就能看到输出了:QtCreator 输出面板捕获的命令行输出与上图汉字显示是一致的,所以以后都可以直接用 QtCreator 输出面板来查看命令行输出,不用从命令行自己查看输出的。
QString 类中关于字符编码的函数都放到本节列举并测试了,后面就不重复介绍了。下一节我们学习 QString 常见的使用方式,QString 是 Qt 程序的基础,可以说每个 Qt 程序都会用到的,所以大家先不要着急学习图形控件编程,要先打好基础。
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算