QTextEdit显示中文乱码解决,中文GB2312转Unicode,QString、QByteArray 转换,16进制显示,toUtf8与toLocal8Bit区别

QString、QByteArray 的等效转换:

QByteArray = QString.toUtf8();// 转换为Unicode字符集编码,多字节编码,单个中文占3~4个字节

QByteArray = QString.toLocal8Bit();// 转换为GB2312/GBK字符集编码,单个中文占2个字节

 

QString = QByteArray;

 

QString、QByteArray asc2转换为16进制显示:

QByteArray可以直接转换为16进制显示:QByteArray.toHex()

 

QString不能直接转换为16进制显示,要先转换为QByteArray,再16进制显示:

QString.toUtf8().toHex()// 转换为Unicode字符集编码

QString.toLocal8Bit().toHex()// 转换为GB2312/GBK字符集编码

 

QString的16进制显示转换为 asc2显示:

QString txtBuf = "616263414243";// "abcABC"的16进制显示

QString/QByteArray str1 = QByteArray::fromHex(txtBuf.toUtf8());// 这种转换方式可忽略掉中间空格

 

QTextEdit显示GB2312中文:

GB2312/GBK/GB18030区别:https://www.zhihu.com/question/19677619

GB2312/GBK采用双字节编码。GB18030采用多字节编码,每个字可以由 1 个、2 个或 4 个字节组成。

GB2312的中文是2字节,unicode/UTF8/16的中文是3~4个字节。而Qt控件的QString都是以unicode编码的,所以gb2312编码的中文不能直接放到QString里,会显示乱码,需要做下转换:

// 将GB2312编码转换成unicode,并用QTextEdit显示

QString str = "中文";

QString sendData = QTextCodec::codecForName("GB2312")->toUnicode(str.toLocal8Bit());// 使用toLocal8Bit()转换为GB2312编码,再用QTextCodec将GB2312转换为Unicode

ui->txtSend->setText(sendData);// 中文显示正常

 

综合例程:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>
#include <QTextCodec>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QString str = "中文";
    // QString 与 QByteArray 相互转换
    QString sendData_1 = str.toUtf8();// 中文正常显示。sendData_1/2/x 类型为 QByteArray 也是一样的效果
    QString sendData_2 = str.toLocal8Bit();// 中文显示乱码

    // 将原码转换为16进制。为了看清内存中存储的数据内容
    QString sendData_3 = str.toUtf8().toHex().toUpper();// Unicode字符集中的"中文"编码,多字节编码,单个中文占3~4个字节
    QString sendData_4 = str.toLocal8Bit().toHex().toUpper();// GB2312/GBK字符集中的"中文"编码,双字节编码,单个中文占2个字节

    // 将QString由16进制,转换为原码,且这种方式可以忽略中间的空格
    QString sendData_5 = QByteArray::fromHex(str.toUtf8().toHex());// 中文正常显示
    QString sendData_6 = QByteArray::fromHex(str.toLocal8Bit().toHex());// 中文显示乱码

    // 将GB2312编码转换成unicode
    QString sendData_7 = QTextCodec::codecForName("GB2312")->toUnicode(str.toLocal8Bit());// 中文正常显示
    QString sendData_8 = QTextCodec::codecForName("GB2312")->toUnicode(QByteArray::fromHex(str.toLocal8Bit().toHex()));// 中文正常显示

    ui->txtSend_1->setText(sendData_1);
    ui->txtSend_2->setText(sendData_2);
    ui->txtSend_3->setText(sendData_3);
    ui->txtSend_4->setText(sendData_4);
    ui->txtSend_5->setText(sendData_5);
    ui->txtSend_6->setText(sendData_6);
    ui->txtSend_7->setText(sendData_7);
    ui->txtSend_8->setText(sendData_8);
}

MainWindow::~MainWindow()
{
    delete ui;
}

 

运行结果:

### 关于 `QByteArray` 的使用方法 `QByteArray` 是 Qt 框架中的一个重要类,主要用于处理字节数组。它可以存储原始的二进制数据以及以 8 位字符编码表示的文本字符串[^3]。 #### 创建 `QByteArray` 可以通过多种方式创建一个 `QByteArray` 对象: - **创建空的 `QByteArray`** ```cpp QByteArray byteArray1; ``` 这会创建一个空的 `QByteArray` 实例[^1]。 - **通过字符串初始化** ```cpp QByteArray byteArray2("Hello, World!"); ``` 这里我们用 C 风格字符串 `"Hello, World!"` 初始化了一个新的 `QByteArray` 实例[^1]。 - **指定大小并填充特定字符** ```cpp QByteArray byteArray3(10, 'a'); ``` 这段代码创建了一个长度为 10 并且每个位置都填充值 `'a'` 的 `QByteArray`[^1]。 #### 数据转换 `QByteArray` 和其他类型的对象之间可以相互转换,比如 `QString` 进行互: - **从 `QString` 转换到 `QByteArray` (UTF-8 编码)** ```cpp QString str = "Hello, Qt!"; QByteArray byteArray = str.toUtf8(); ``` 此操作将 `QString` 中的内容按照 UTF-8 编码规则化为字节流形式存入 `byteArray` 中[^2]。 - **从 `QByteArray` 回 `QString`** ```cpp QString str2 = QString::fromUtf8(byteArray); ``` 该语句实现了反向过程——把之前保存好的字节数组重新解析成可读取的人类语言文字串[^2]。 #### 常见功能展示 以下是几个常用的关于 `QByteArray` 处理的例子: - **追加新内容至已有数组末端** ```cpp QByteArray arrayA("Qt "); arrayA.append("is great."); // 结果: "Qt is great." ``` - **查找子序列首次出现的位置** ```cpp int index = byteArray.indexOf("World"); if(index != -1){ qDebug() << "Substring found at position:" << index; } else{ qDebug() << "Substring not found."; } ``` - **替换部分区域内的值** ```cpp byteArray.replace(7,5,"Universe"); // 将原字符串中第7个字符起连续五个单位替换成"Universe" ``` 以上就是有关如何运用 `QByteArray` 来完成基本任务的一些指导说明[^3]。 ### 示例程序 下面给出一段完整的例子来综合应用上面提到的知识点: ```cpp #include <QCoreApplication> #include <QDebug> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // Create and initialize byte arrays. QByteArray emptyByteArry; QByteArray helloWorld("Hello, World!"); // Convert between QString & QByteArray. QString originalStr = "Original String"; QByteArray utf8Bytes = originalStr.toUtf8(); QString convertedBackString = QString::fromUtf8(utf8Bytes); qInfo() << "Converted Back String:" << convertedBackString; return a.exec(); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值