1.默认编码
QString是Qt中用于处理字符串的类,它提供了丰富的功能和灵活性。在使用QString时,需要注意以下几个方面:
-
编码问题:QString默认使用UTF-16编码,因此需要确保在处理字符串时正确处理编码问题。如果需要将QString转换为其他编码格式(如UTF-8、GBK等),可以使用
toUtf8()
、toLocal8Bit()
等函数进行转换。 -
内存管理:QString内部使用引用计数来管理内存,当一个QString对象被复制或赋值时,它的引用计数会增加。当引用计数减少到0时,QString会自动释放内存。因此,在使用QString时,需要注意避免不必要的拷贝和赋值操作,以减少内存泄漏的风险。
-
性能优化:由于QString内部使用了Unicode编码,因此在处理大量字符串时可能会影响性能。为了提高性能,可以考虑使用QByteArray或QList<char>等底层数据结构来存储和处理字符串。
-
国际化支持:QString提供了对Unicode的支持,可以方便地处理多语言文本。在使用QString时,需要注意正确处理不同语言的字符集和编码问题,以确保文本的正确显示和处理。
-
安全性:由于QString可以包含任意字符,因此在处理用户输入或其他不可信的数据时,需要注意防止注入攻击等安全问题。可以使用
QString::fromUtf8()
等函数将外部数据转换为QString,并使用QString::trimmed()
等函数去除首尾空格等不安全字符。
总之,在使用QString时,需要注意编码问题、内存管理、性能优化、国际化支持和安全性等方面的问题,以确保程序的正确性和稳定性。
2.QString编码
QString调用toUtf8
(),toLocal8Bit
()转换编码存储在QByteArray里。
toLocal8Bit
()转换为本地系统的默认编码方式,如下查看windows系统的默认编码,
在Windows系统中,可以通过执行chcp
命令来查看当前活动的代码页信息。
具体步骤如下:
-
打开命令提示符(按下Win + R键,输入
cmd
并回车)。 -
在命令提示符窗口中,输入
chcp
并回车。 -
系统将显示当前的活动代码页,例如936表示GBK编码。
此外,如果需要更改系统的区域设置以使用不同的编码格式,如UTF-8,可以按照以下步骤操作:
-
打开控制面板,选择“区域和语言”选项。
-
点击“管理”标签页,然后选择“更改系统区域设置”。
-
从列表中选择需要的编码格式,如UTF-8,并应用更改。
-
重启计算机以使更改生效。
通过这些方法,您可以查看和调整Windows系统中的编码设置。
我自己查阅的是GBK编码。
3.输入工具
输入工具(如搜狗拼音输入法)通常需要检测编辑器或应用程序的编码格式,以确保它们输出的数据与编辑器期望的编码格式一致。这是因为不同的编码格式对字符的表示方式不同,如果编码不匹配,可能会导致显示错误或乱码。
当用户在编辑器中点击输入框并开始输入时,输入法通常会检测当前焦点的窗口或控件所使用的编码格式。输入法可以通过操作系统提供的API来获取这些信息。例如,在Windows系统中,输入法可以通过IMM(Input Method Manager)API来获取当前线程的代码页和语言设置。
一旦输入法确定了目标编码格式,它就会将其输出的字符串转换为该格式。例如,如果编辑器要求UTF-8编码,那么输入法会将其输出的字符串转换为UTF-8格式。
需要注意的是,不同的输入法对编码格式的支持程度可能不同。一些输入法可能只支持一种或几种特定的编码格式,而其他输入法可能能够自动检测并适应多种编码格式。
当输入法无法确定编码格式时,默认使用Unicode编码。
总的来说,为了确保数据的准确传输和显示,输入法和编辑器之间的编码格式匹配是非常重要的。在使用输入法时,应该确保其输出的编码格式与编辑器或应用程序的期望格式一致。
4.编辑器编码
QString str = "Hello Qt"; 在 Qt Creator 中,所有源程序文件都默认使用 UTF-8 编码进行保存,所以,赋值语句右侧的 “Hello Qt”是一个 C 语言标准的 const char *类型的UTF-8字符串,以“\0”作为结束符。QString 会使用 其静态函数 fromUtf8()将这个 const char *类型的数据自动转换为 UTF-16 编码的字符串。
在使用Qt Creator时,编辑器的编码设置确实会影响QString处理字符串的方式。当使用UTF-8编码保存源程序文件时,Qt会自动将该字符串转换为UTF-16编码。这是因为QString类内部使用UTF-16编码来存储和处理字符串。
然而,如果编辑器设置为GBK编码,那么在使用QString时需要注意字符编码的转换问题。由于GBK编码与UTF-16编码不兼容,因此需要手动将字符串从GBK编码转换为UTF-16编码。这可以通过调用QString的fromLocal8Bit()函数来实现。
如下案例更具体的说明,我们设置编辑器为GBK的编码格式
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QString str = QString::fromLocal8Bit("你好");
QString str2 = "你好"; // QString把GBK的数据当作Unicode编码进行处理
qDebug()<<"str:"<<str;
qDebug()<<"str2:"<<str2;
}
MainWindow::~MainWindow()
{
delete ui;
}
返回结果
str: "你好"
str2: "????"
如上代码是GBK编码,用户手动调用QString::fromLocal8Bit()才能正确的显示“你好”,我们在上面通过指令已经查阅了本系统的默认编码是GBK,因此Local8Bit就是GBK格式。
如果不使用QString::fromLocal8Bit(),QString会把GBK的数据当作Unicode编码进行处理,因此输出“????”
总结
代码是Unicode编码的,我们不用做其他的处理。
QString内部使用utf-16编码格式也叫Unicode编码格式,意味着用户必须给Unicode格式的数据给QString,如果数据是GBK格式的,用户需要使用QString::fromLocal8Bit()转换为Unicode编码。
注意:Local8Bit它代表本系统的编码,有可能不是GBK编码,上述我使用了windos指令验证了我的windos使用GBK编码,因此Local8Bit == GBK。
5.案例进一步分析
编辑器还是使用GBK编码
按下按钮后,显示用户输入的数据。
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QString str = QString::fromLocal8Bit("你好");
QString str2 = "你好";
qDebug()<<"str:"<<str;
qDebug()<<"str2:"<<str2;
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
QString text = ui->lineEdit->text();
qDebug()<<text;
}
让我来分析整个过程,用户点击输入框输入法在没有检测到编码格式时默认使用Unicode编码。那么此时用户输入的数据是Unicode编码的。那么QLineEdit使用QString来存储,会将输入的数据转换为UTF-16来处理。
单击按钮后显示QString里的数据,由于QString使用的就是Unicode编码,所以回显数据到显示屏是使用Unicode码点的,因此就可以正确显示数据了。
总结
代码是Unicode编码的,我们不用做其他的处理。
QString内部使用utf-16编码格式也叫Unicode编码格式,意味着用户必须给Unicode格式的数据给QString,如果数据是GBK格式的,用户需要使用QString::fromLocal8Bit()转换为Unicode编码。
注意:Local8Bit它代表本系统的编码,有可能不是GBK编码,上述我使用了windos指令验证了我的windos使用GBK编码,因此Local8Bit == GBK。
打印QString时,是使用Unicode码点来显示数据的。