【Qt】QString与QChar的源码学习及二者与Unicode的关系【2023.04.20】

news/2024/11/25 21:17:26/

简介

本文是关于QString乱码的一些补充。主要就两点,QChar、QString底层存储的字符都是16进制的Unicode编码。会结合源码进行“刨根问祖”。

QChar
QChar对应16位的Unicode字符集。

The QChar class provides a 16-bit Unicode character.

In Qt, Unicode characters are 16-bit entities without any markup or structure. This class represents such an entity. It is lightweight, so it can be used everywhere. Most compilers treat it like a unsigned short.

// 源码QChar.h
class Q_CORE_EXPORT QChar 
{
public:    friend Q_DECL_CONSTEXPR bool operator==(QChar, QChar) Q_DECL_NOTHROW;friend Q_DECL_CONSTEXPR bool operator< (QChar, QChar) Q_DECL_NOTHROW;ushort ucs;//一个QChar就是一个ushort变量
};

QString
因为QString存储的是QChar,而QChar是16位、2字节的Unicode字符。对于大于65535的Unicode字符,则存储在连续的两个QChar中。

The QString class provides a Unicode character string.

QString stores a string of 16-bit QChars, where each QChar corresponds one Unicode 4.0 character. (Unicode characters with code values above 65535 are stored using surrogate pairs, i.e., two consecutive QChars.)

//源码QString.htypedef QTypedArrayData<ushort> QStringData;
class Q_CORE_EXPORT QString
{
public:typedef QStringData Data;//...
public:typedef Data * DataPtr;inline DataPtr &data_ptr() { return d; }
}

源码路径

在QT安装目录,我的是这个路径:C:\Qt\Qt5.6.3.32\5.6.3\Src\qtbase\src\corelib\tools

结合代码调试分析

以下程序验证中文字符串在QString中以Unicode的编码保存。

#include <QtCore/QCoreApplication>#include <QString>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QString str;str = QString::fromStdWString(L"杨奶粉");auto data = str.data();return a.exec();
}

1.中文字符串“杨奶粉”存储到QString

2.通过str获取QChar数组指针

在这里插入图片描述

3.QChar与Unicode编码的比对。注意:调试器内存中看到的数据高位在高地址,低位在低地址。

在这里插入图片描述


参考文献:

1.“About the Unicode Character Database”
2. QString Class | Qt Core 6.5.0


http://www.ppmy.cn/news/49737.html

相关文章

Redis问题

一、认识Redis 1. 什么是 Redis&#xff1f; Redis 是一种基于内存的数据库&#xff0c;对数据的读写操作都是在内存中完成&#xff0c;因此读写速度非常快&#xff0c;常用于缓存&#xff0c;消息队列、分布式锁等场景。Redis 提供了多种数据类型来支持不同的业务场景&#…

Springboot结合线程池的使用

1.使用配置文件配置线程的参数 配置文件 thread-pool:core-size: 100max-size: 100keep-alive-seconds: 60queue-capacity: 1配置类 Component ConfigurationProperties("thread-pool") Data public class ThreadPoolConfig {private int coreSize;private int ma…

zabbix配置钉钉机器人告警

1.在钉钉上创建一个钉钉群组 2.在群组中添加一个机器人 3.配置zabbix server调用钉钉接口的代码(使用python) 查看是否有python环境 python --version 找到zabbix 的AlertScriptsPath目录路径 cat /etc/zabbix/zabbix_server.conf|grep AlertScriptsPath 将调用钉钉接口的py…

Python解析CANoe录制的blf文件asc文件通用方法

Python解析CANoe录制的blf文件&asc文件通用方法 一、背景 由于很多时候我们在录制日志文件的时候更愿意选择BLF文件,至少目前我见到的很多公司都是使用的BLF文件来作为最后的日志文件,相比较ASC文件,BLF文件属于二进制文件,所以没有办法通过文本编辑器直接读写,所以本…

【计算机基本原理-数据结构】八大数据结构分类

【计算机基本原理-数据结构】八大数据结构分类 1&#xff09;数组2&#xff09;链表3&#xff09;队列4&#xff09;栈5&#xff09;树6&#xff09;图7&#xff09;堆8&#xff09;散列表(哈希表) 数据结构是计算机存储、组织数据的方式。一种好的数据结构可以带来更高的运行或…

请收下这些软件测试学习干货,不看后悔一辈子

学习软件测试的过程中会遇到很多很多的困难和挑战&#xff0c;只有跨过这些困难和挑战&#xff0c;才有机会挑战软件测试领域的高薪offer。今天我们就来梳理一下&#xff0c;学习软件测试的过程中&#xff0c;我们一般都会遇到哪些困难&#xff0c;我们又当如何克服这些困难。 …

java版工程项目管理系统源代码-功能清单 图文解析

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…

Vue CLI 服务

使用命令 在一个 Vue CLI 项目中&#xff0c;vue/cli-service 安装了一个名为 vue-cli-service 的命令。你可以在 npm scripts 中以 vue-cli-service、或者从终端中以 ./node_modules/.bin/vue-cli-service 访问这个命令。 这是你使用默认 preset 的项目的 package.json&…