QT:QString 字符串和中文字符编码

时间:2023-01-31 07:47:44

QString 字符串和中文字符编码

QT内部的编码方式 Unicode (utf-16)
linux平台默认使用:utf-8
windows平台默认使用:gbk2312/gbk/gbk18030

QString内部使用Unicode编码,使用双引号的字符串,通过转换构造函数,可以将utf-8编码字符转换为Unicode的使用,也可以正常显示utf-8编码的字符串。
早期的Qt4版本不会做这样的转换,那么显示中文将乱码,获取在Windows开发qt程序,一般使用gbk的编码,显示中文也将是乱码。

<tips>
VMware虚拟机共享与ubuntu共享文件夹:
【虚拟机】-【设置】-【选项】-【共享文件夹】-【添加】-新建目录file
ubuntu虚拟系统中vi终端下访问windows共享目录路径:
" /mnt/hgfs/... "  /mnt/hgfs/file
【注】最好不要用中文路径,使用英文路径。

如果出现"乱码解决方案":
QTextCodec类可以实现将其他编码方式(gbk)转换成(Unicode)。
eg:
 // "中文字符串" 直接使用将是乱码
 QByteArray encodedString = "中文字符串";
 // 构建编码器对象,参数为当前所使用的编码方式
 QTextCodec *codec = QTextCodec::codecForName("GBK");
 // 使用编码对象调用成员函数 toUnicode 完成转换后,就可正常显示
 QString string = codec->toUnicode(encodedString);

/* 代码演示 */
#include <QApplication>
#include <QLabel>
#include <QTextCodec>
int main (int argc, char** argv) {
// 创建一个Qt的应用程序对象
QApplication app (argc, argv);
// 1) 构造编码对象 【目前ubuntu下vim的默认编码为utf-8】
QTextCodec* coder = QTextCodec::codecForName ("utf-8");
// 创建一个标签对象
// 2) 将要显示的字符串转换为Unicode编码
QLabel label (coder->toUnicode ("你好, Qt!"));
// 显示标签对象
label.show ();
// 让我的程序进入事件循环
return app.exec ();
}

练习:
 构建QPushButton按钮对象,按钮对象内容“按我”;
 1)用vi编辑器写源代码,构建(6步),结果可以直接显示中文
 2)将程序Button.cpp拷贝到Windows共享目录
  共享目录创建方式参见刚才的<tips>
 3)使用记事本打开,另存为,编码方式选择ANSI编码(中文GBK)
 4)将ANSI编码方式的源代码拷贝回ubuntu替换原来的代码
 5)再次make构建运行,结果将是乱码
 6)设置编码对象(GBK),转换为Qt内部的Unicode编码,再次make,结果将正常的显示中文。

/** 练习代码 **/
#include <QApplication>
#include <QPushButton>
#include <QTextCodec>
int main (int argc, char** argv) {
QApplication app (argc, argv);
QTextCodec* coder = QTextCodec::codecForName ("GBK");
QPushButton button (coder->toUnicode ("按我"));
button.show ();
return app.exec ();
}