QString编码

1.默认编码

QString是Qt中用于处理字符串的类,它提供了丰富的功能和灵活性。在使用QString时,需要注意以下几个方面:

  1. 编码问题:QString默认使用UTF-16编码,因此需要确保在处理字符串时正确处理编码问题。如果需要将QString转换为其他编码格式(如UTF-8、GBK等),可以使用toUtf8()toLocal8Bit()等函数进行转换。

  2. 内存管理:QString内部使用引用计数来管理内存,当一个QString对象被复制或赋值时,它的引用计数会增加。当引用计数减少到0时,QString会自动释放内存。因此,在使用QString时,需要注意避免不必要的拷贝和赋值操作,以减少内存泄漏的风险。

  3. 性能优化:由于QString内部使用了Unicode编码,因此在处理大量字符串时可能会影响性能。为了提高性能,可以考虑使用QByteArray或QList<char>等底层数据结构来存储和处理字符串。

  4. 国际化支持:QString提供了对Unicode的支持,可以方便地处理多语言文本。在使用QString时,需要注意正确处理不同语言的字符集和编码问题,以确保文本的正确显示和处理。

  5. 安全性:由于QString可以包含任意字符,因此在处理用户输入或其他不可信的数据时,需要注意防止注入攻击等安全问题。可以使用QString::fromUtf8()等函数将外部数据转换为QString,并使用QString::trimmed()等函数去除首尾空格等不安全字符。

总之,在使用QString时,需要注意编码问题、内存管理、性能优化、国际化支持和安全性等方面的问题,以确保程序的正确性和稳定性。

2.QString编码

QString调用toUtf8(),toLocal8Bit()转换编码存储在QByteArray里。

toLocal8Bit()转换为本地系统的默认编码方式,如下查看windows系统的默认编码,

在Windows系统中,可以通过执行chcp命令来查看当前活动的代码页信息。

具体步骤如下:

  1. 打开命令提示符(按下Win + R键,输入cmd并回车)。

  2. 在命令提示符窗口中,输入chcp并回车。

  3. 系统将显示当前的活动代码页,例如936表示GBK编码。

此外,如果需要更改系统的区域设置以使用不同的编码格式,如UTF-8,可以按照以下步骤操作:

  1. 打开控制面板,选择“区域和语言”选项。

  2. 点击“管理”标签页,然后选择“更改系统区域设置”。

  3. 从列表中选择需要的编码格式,如UTF-8,并应用更改。

  4. 重启计算机以使更改生效。

通过这些方法,您可以查看和调整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码点来显示数据的。

  • 20
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2023框框

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值