第十课:Qt 字符编码和中文乱码相关问题

功能描述:最全的 Qt 字符编码相关知识以及中文乱码的原因与解决办法

一、字符编码种类

ASCII 

美国人对信息交流的编码,包括 26 个字母(大小写)、数字和标点符号等,用一个字节(8 位)表示这些字符,实际只编到了第 127 个,这就是 ASCII (American Standard Code for Information Interchange) 编码。

ASCII 扩展码

计算机传到其他国家,发现有些本国的字符在 ASCII 码中没有,就将这些字符编到 ASCII 剩余的位置(128 到 255),这就是 ASCII 扩展码。

gb2312

中文常用的汉字就 6000 多个,中国人采用 gb2312 编码,使用两个字节(16 位),有 65536 个编码位。前 127 个和 ASCII 一样,后面的是汉字的编码。原先的 ASCII 就是半角符号,后来新编的就是全角符号。“英文占一个字节,汉字占两个字节”,说的就是这套编码。

gbk

gb2312 + 生僻字 = gbk

gb10830

gbk + 少数民族文字 = gb10830

Unicode

国际标准化组织制定出一套包含全世界所有语言文字的编码,大家都用这套编码,免得乱七八糟的,谁也不认识谁,这套编码就是 Unicode。

utf

Unicode 只是一套标准,它只是规定了数字多少对应哪个字符,但它不是计算机内部可用的具体实现,就需要有给具体的方案,将数字和字符的对照表输入到计算机内让机器也认识,utf 就是 Unicode Transformation Format 的缩写,意为 Unicode 转换格式。

utf24

Unicode 最长的编码需要 24 位,用 3 个字节表示一个字符,这个方案就被称为 utf24。这个想法好是好,但是不符合实际情况。计算机一次读取的字节只能是 1、2、4、8 这样子,不能一次读 3个字节,所以 24 位的方案很快就被放弃了。

utf32

用 4 个字节表示一个字符,这个方案就被称为 utf32。优点是简单明确,不管是什么字符,全都按 4 位读取,简单明了。但缺点是浪费空间,本来最多 3 个字节就够了,但这每个字符至少浪费了一个字节。像英文这种一个字节就够,最低位是具体内容,其余 3 位都是 0,直接有 3 位是浪费的,也就是说一个 1GB 的英文文档,需要 4GB 的存储空间,生生的浪费的 3 倍。

utf16

有人提出用 16 位就够了,那些一个字节的两个字节的字符直接用,三个字节的通过某种算法可以使用两个字节来实现。使用 16 位来实现 Unicode 的码表,这套方案就是 utf16。

utf8

utf8 是一个变长方案,对于英文,只要一个字节就行,汉字则需要 3 个字节。

二、char * 和 QString 编码问题

char * 类型字符串是什么编码?

对于程序内部声明的字符串,char * 的编码取决于程序源文件的编码,源文件是什么编码,字符串就是什么编码。

对于程序外部传入的字符串,比如从 argv 中读取的字符串,其编码与源文件的编码无关,只看当前操作系统的编码。

QString 是什么编码?

Qt 的文档中明确指出,QString 内部使用的是 Unicode 编码,具体实现方案是 utf16。在使用char * 构造 QString 实例的时候,QString 默认将 char * 当作是 utf8 编码去构造,即:QString s(char *) 等价于 QString s = QString::fromUtf8(char*)。

同样是使用 char * 构造 QString,为什么有的时候是乱码,有的时候就不是乱码?这取决于你的char * 是什么编码了,如果是 utf8 的,就不会有乱码问题,如果是 gbk 的,就会出现乱码的情况。

三、字符串长度

QString 字符串长度

只要 QString 能够正常构造,没有乱码,不管是英文还是中文,都占一个长度。别忘了,QString 用的是 utf16 方案,一个长度占两个字节。

char * 字符串长度

char * 的长度需要看具体的编码了,gbk 是英文一个长度,汉字两个长度,这里一个长度占一个字节。utf8 是英文一个长度,汉字三个长度,这里的一个长度也是一个字节。

所以,不要太相信你的 strlen 函数,关键是得看你是什么编码。

四、QTextCodec::setCodecForLocale 的真正含义

这个函数真正的作用只是告诉你的程序,当前程序内部使用的字符编码是什么。这个函数无法对外部传入和内部声明的字符串产生影响,和系统的编码或者源文件的编码无关。

经测试,这个函数只对 QString 的 Local8bit 函数有影响。如果用这个函数将程序编码设置为 gbk,那么 Local8bit 就是 gbk,如果设置的编码是 utf8,Local8bit 就是 utf8。用了这个函数解决了中文乱码问题一定是因为使用了 QString 的 toLocal8bit 或者 fromLocal8bit,否则这个函数不会对中文乱码问题有任何影响。

假设你的系统是 gbk 的编码,进程默认使用的编码也是 gbk,这时候拿到一个 utf8 的 char *,然后用 fromLocal8bit 来构造 QString,这时候的 Local8bit 是 gbk,但 char 是 utf8,用 gbk 的规则去构造 utf8 的编码就乱码了。

五、char * 转 QString

utf8 的 char * 转 QString

如果 char *是 utf8 的,QString 默认将 char * 当 utf8 处理,用 QString s(char *) 或者 QString s = QString::fromUtf8(char*) 直接构造就行了。

gbk 的 char * 转 QString

如果 char * 是 gbk 的,需要先用 QTextCodec::setCodecForLocale 将 Local8bit 设置成 gbk,再使用 fromLocal8bit 来构造。

QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));

QString s = QString::fromLocal8bit(char*);

不确定编码的 char * 转 QString

在实际编程的时候,经常不确定这个 char * 是 utf8 的还是 gbk 的,这时候可以用下面的方法进行构造。这段代码的含义是,先将 char * 转成 utf8,看是否成功,不成功再转成 gbk。

char * c = "abcdefg";
QTextCodec::ConverterState state;
QString s = QTextCodec::codecForName("UTF-8")->toUnicode(c, strlen(c), &state);
if(state.invalidChars > 0)
{s = QTextCodec::codecForName( "GBK" )->toUnicode(c);
}

 在 Qt5 中使用 QString::QStringLiteral 这个宏来处理中文乱码问题,这个宏是官方提供专门处理乱码问题的。

tr() 不是处理中文乱码的,这个函数是用来处理多语言问题的

六、Windows 系统本地字符集编码

在 windows 命令行终端模式下,输入命令:chcp

如上图,我的活动代码页为 936,意思是“中国-简体中文 (GB2312)"

下表列出了所有支持的代码页及其国家(地区)或者语言:

代码页国家(地区)或语言
437美国
708阿拉伯文(ASMO 708)
720阿拉伯文(DOS)
850多语言(拉丁文 I)
852中欧(DOS)-斯拉夫语(拉丁文 II)
855西里尔文(俄语)
857土耳其语
860葡萄牙语
861冰岛语
862希伯来文(DOS)
863加拿大-法语
865日耳曼语
866俄语-西里尔文(DOS)
869现代希腊语
874泰文(Windows)
932日文(Shift-JIS)
936中国-简体中文(GB2312)
949韩文
950繁体中文(Big5)
1200Unicode
1201Unicode (Big-Endian)
1250中欧(Windows)
1251西里尔文(Windows)
1252西欧(Windows)
1253希腊文(Windows)
1254土耳其文(Windows)
1255希伯来文(Windows)
1256阿拉伯文(Windows)
1257波罗的海文(Windows)
1258越南文(Windows)
20866西里尔文(KOI8-R)
21866西里尔文(KOI8-U)
28592中欧(ISO)
28593拉丁文 3 (ISO)
28594波罗的海文(ISO)
28595西里尔文(ISO)
28596阿拉伯文(ISO)
28597希腊文(ISO)
28598希伯来文(ISO-Visual)
38598希伯来文(ISO-Logical)
50000用户定义的
50001自动选择
50220日文(JIS)
50221日文(JIS-允许一个字节的片假名)
50222日文(JIS-允许一个字节的片假名-SO/SI)
50225韩文(ISO)
50932日文(自动选择)
50949韩文(自动选择)
51932日文(EUC)
51949韩文(EUC)
52936简体中文(HZ)
65000Unicode (UTF-7)
65001Unicode (UTF-8)

.cpp 或 .h 文件从 window 上传到 Ubuntu 后会显示乱码,原因是因为 ubuntu 环境设置默认是 utf-8,Windows 系统本地字符集默认编码为 GBK

在简体中文 windows 系统下,ANSI编码代表 GBK/GB2312 编码

七、中文乱码现象

如果在 Qt Creator 中无法输入中文,则选择“编辑”>Select Encoding…>GBK…”或“UTF8+BOM”,点击“按编码重新载入”,此时就可以输入中文了。

列举最常用的 3 个编译器(微软 VC++ 的 cl 编译器MinGW 中的 g++Linux 下的 g++),源代码分别采用 GBK 和无 BOM 的 UTF-8 以及有 BOM 的 UTF-8 这 3 种编码进行保存,发生的现象如下表所示:       

★★★★★

情况1:指的是 Local 字符集为 GBK

情况2:指的是 Local 字符集为 UTF-8

源代码的编码编译器显示正常显示乱码
GBKwin vs cl情况1情况2
win MinGW-g++情况1情况2
linux g++情况1情况2
UTF-8(无 BOM)win vs cl

编译失败

error C2001:常量中有换行符

编译失败

error C2001:常量中有换行符

win MinGW-g++情况2情况1
linux g++情况2情况1
UTF-8(有 BOM)win vs cl

情况1

情况2(有 #pragma 预处理)

情况2(有 #pragma 预处理)
win MinGW-g++情况2情况1
linux g++情况2情况1

源代码的编码:“菜单” -> “工具” -> “选项” -> “文本编辑器” -> “行为” -> “文件编码” -> “默认编码”

常用的选项有以下几个:

System (简体中文 windows 系统默认指的是 GBK 编码)

GBK/windows-936-2000/CP936/MS936/windows-936

UTF-8

Local 字符集:取决于 QTextCodec * codec = QTextCodec::codecForName();

当使用 Visual C++ 编译程序的时候,它会分析源文件采用何种编码,有 BOM 标识符则可以正确识别其编码是 UTF-8,若没有 BOM 标识符则认为其使用本地字符集编码(Local 字符集)。

如果源文件是 UTF-8+BOM 的编码方式,还需要在头文件加入:

#if defined(_MSC_VER) && (_MSC_VER >= 1600)
#pragma execution_character_set("utf-8")
#endif

或者在 .pro 文件中添加:

QMAKE_CXXFLAGS += /utf-8

如果源文件是 UTF-8+无 BOM 的编码方式,则一定不能加 #pragma execution_character_set(“utf-8”),不然会产生乱码。

当 QTextCodec::codecForName("utf-8") 时:

QString::fromLocal8Bit 和 QString::fromUtf8 是等效的。

当 QTextCodec::codecForName("gbk") 时:

QString::fromLocal8Bit 和 QString::fromUtf8 是不等效的。

★★★★★

如果该工程不需要跨平台使用(只在 Win),那么工程设置请使用 GBK 的编码方式;

如果该工程要跨平台使用(Win+Linux),那么工程设置请使用 UTF-8+BOM 的编码方式,Local 字符集设置为 UTF-8

UTF-8 和 GBK 其实对英文和数字都是一样的 ASCII 单字节编码,所以源文件用英文和数字是肯定不乱码,主要是汉字之类的本地语言文字编码显示容易出错。

Windows 系统里一般的记事本、编辑器、VC++ 开发环境等都是默认用 GBK 汉字编码,而  Linux 和 Qt 都是默认用 UTF-8 国际文字编码,所以文本显示乱码一般都是这个原因。

八、“UTF-8 无 BOM 格式”和 “UTF-8 带 BOM 格式”的区别

BOM—Byte Order Mark,就是字节序标记

UTF-8 带 BOM 格式,就是在文件头添加了 3 个 bits 的 b'\xef\xbb\xbf'字符

通常编程,特别是 Linux 下编程建议使用 “UTF-8 无 BOM 格式”,这种不含 BOM 的 UTF-8 才是标准形式,由于含有 BOM 的 UTF-8 常常和 Linux 系统经常使用的 #! 冲突。

若是在 windows 下编程,建议使用 “UTF-8 带 BOM 格式”,这样比较好。

如今只有微软还在坚持使用带 BOM 格式的 UTF-8,由于它便于较快的与不少本地编码,如 gbk,ascii 相区分。总之,微软为了向前兼容性,一直坚持使用带 BOM 格式的 UTF-8。

九、查看 Qt Creator 源文件的编码格式

点击菜单 “工具” -> “选项” -> “文本编辑器”,右边选择“显示”,看到下图:

选中 “Display file encoding”,然后点击 “OK” 按钮,就可以在编辑器右上角看到当前文件的编码格式:

十、解决中文乱码的方法

总结下,解决中文乱码的方法:

其中,源代码的编码:“菜单” -> “工具” -> “选项” -> “文本编辑器” -> “行为” -> “文件编码” -> “默认编码”;Local字符集:取决于QTextCodec *codec = QTextCodec::codecForName();

必须保证源文件的编码和显示文字的编码保持一致,否则中文乱码

放了方便起见,通常将源文件的编码和显示文字的编码设置保持一致。

如果没有设置 Local 字符集,则使用默认系统的字符编码方式,windows 下是 GBK 编码,Linux 下是 UTF-8 编码。

直接输入文字,QString 默认将 char * 当作是 UTF-8 编码去构造。

情况1:如果是msvc 2013/2015/2017等编译器

(1) 源文件编码设置为 GBK

  • Local字符集设置为 GBK

采用 QString::fromLocal8Bit() 对中文进行转码,则显示正常,否则乱码;因为设置了本地字符集为 GBK 编码,fromLocal8Bit() 就是将中文转换为 GBK 编码。

  • 没有设置 Local 字符集

如果没有设置 Local 字符集编码方式,则 Qt 采用默认的系统字符编码方式 GBK,和上述 “Local字符集设置为GBK” 转码方法相同。

  • Local 字符集设置为其它编码方式,如 UTF-8

中文显示乱码,因为无法将显示文字的编码方式设为 GBK。

(2) 源文件编码设置为 UTF-8(无 BOM)

大概率报错:编译失败,error C2001: 常量中有换行符

有时候能显示出来,如果没报错:

  • Local 字符集设置为 UTF-8

直接输入中文(QString 默认将 char * 当作是 UTF-8 编码去构造)、采用 QString::fromLocal8Bit()(此时本地字符集为 UTF-8)、采用 QString::fromUtf8() 都能显示正常。

  • 没有设置 Local 字符集

如果没有设置 Local 字符集编码方式,则 Qt 采用默认的系统字符编码方式 GBK,QString::fromLocal8Bit()(此时本地字符集为 GBK)则显示乱码,直接输入、采用QString::fromUtf8() 都能显示正常。

  • Local 字符集设置为其它编码方式,如 GBK

和上述“没有设置 Local 字符集”相同,QString::fromLocal8Bit()(此时本地字符集为 GBK)则显示乱码,直接输入、采用 QString::fromUtf8() 都能显示正常。

(3) 源文件编码设置为 UTF-8(有 BOM)

  • Local 字符集设置为 UTF-8

需要先进行以下设置:

在 main 函数头文件下面添加以下语句

#if defined(_MSC_VER) && (_MSC_VER >= 1600)
#pragma execution_character_set("utf-8")
#endif

或者在 .pro 文件中添加

QMAKE_CXXFLAGS += /utf-8

设置完成后,直接输入中文(QString 默认将 char * 当作是 UTF-8 编码去构造)、采用QString::fromLocal8Bit()(此时本地字符集为 UTF-8)、采用 QString::fromUtf8() 都能显示正常。

  • 没有设置Local字符集

直接输入、采用 QString::fromUtf8() 都显示乱码,QString::fromLocal8Bit()显示正常

如果进行以下设置,则直接输入、采用 QString::fromUtf8() 都显示正常,而 QString::fromLocal8Bit() 显示乱码。

在 main 函数头文件下面添加以下语句

#if defined(_MSC_VER) && (_MSC_VER >= 1600)
#pragma execution_character_set("utf-8")
#endif

或者在 .pro 文件中添加

QMAKE_CXXFLAGS += /utf-8
  • Local 字符集设置为其它编码方式,如 GBK

和上述“没有设置 Local 字符集”相同,直接输入、采用 QString::fromUtf8() 都显示乱码,QString::fromLocal8Bit() 显示正常

如果进行以下设置,则直接输入、采用 QString::fromUtf8() 都显示正常,而 QString::fromLocal8Bit() 显示乱码。

在 main 函数头文件下面添加以下语句

#if defined(_MSC_VER) && (_MSC_VER >= 1600)
#pragma execution_character_set("utf-8")
#endif

或者在 .pro 文件中添加

QMAKE_CXXFLAGS += /utf-8

情况2:如果是MinGW编译器

(1) 源文件编码设置为 GBK

  • Local 字符集设置为 GBK

采用 QString::fromLocal8Bit() 对中文进行转码,则显示正常,否则乱码;因为设置了本地字符集为 GBK 编码,fromLocal8Bit() 就是将中文转换为 GBK 编码。

  • 没有设置 Local 字符集

如果没有设置 Local 字符集编码方式,则 Qt 采用默认的系统字符编码方式 GBK,和上述 “Local 字符集设置为 GBK” 转码方法相同。

  • Local 字符集设置为其它编码方式,如 UTF-8

中文显示乱码,因为无法将显示文字的编码方式设为 GBK。

(2) 源文件编码设置为 UTF-8(无 BOM)

  • Local 字符集设置为 UTF-8

直接输入中文(QString 默认将 char * 当作是 UTF-8 编码去构造)、采用 QString::fromLocal8Bit()(此时本地字符集为 UTF-8)、采用 QString::fromUtf8() 都能显示正常。

  • 没有设置 Local 字符集

如果没有设置 Local 字符集编码方式,则 Qt 采用默认的系统字符编码方式 GBK,QString::fromLocal8Bit()(此时本地字符集为 GBK)则显示乱码,直接输入、采用 QString::fromUtf8() 都能显示正常。

  • Local 字符集设置为其它编码方式,如 GBK

和上述“没有设置 Local 字符集”相同,QString::fromLocal8Bit()(此时本地字符集为 GBK)则显示乱码,直接输入、采用 QString::fromUtf8() 都能显示正常。

(3) 源文件编码设置为 UTF-8(有 BOM)

UTF-8 有 BOM和无 BOM 对 MinGW 编译器没有影响。

  • Local 字符集设置为 UTF-8

直接输入中文(QString 默认将 char * 当作是 UTF-8 编码去构造)、采用 QString::fromLocal8Bit()(此时本地字符集为 UTF-8)、采用 QString::fromUtf8() 都能显示正常。

  • 没有设置 Local 字符集

如果没有设置 Local 字符集编码方式,则 Qt 采用默认的系统字符编码方式 GBK,QString::fromLocal8Bit()(此时本地字符集为 GBK)则显示乱码,直接输入(等价于 QString::fromUtf8())、采用 QString::fromUtf8() 都能显示正常。

  • Local 字符集设置为其它编码方式,如 GBK

和上述“没有设置 Local 字符集”相同,QString::fromLocal8Bit()(此时本地字符集为 GBK)则显示乱码,直接输入、采用 QString::fromUtf8() 都能显示正常。

在 Qt5 中使用 QString::QStringLiteral 这个宏来处理中文乱码问题,这个宏是官方提供专门处理乱码问题的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/42793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

eNSP:VLAN-hybrid实验应用

实验要求: 拓扑图 配置 sw1: [sw1]vlan batch 2 to 6[sw1]int Ethernet 0/0/2 [sw1-Ethernet0/0/2]port link-type access [sw1-Ethernet0/0/2]port default vlan 2 [sw1-Ethernet0/0/2]int e 0/0/4 [sw1-Ethernet0/0/4]port link-ty access [sw1-Ethernet0/0/…

springBoot 配置文件 spring.mvc.throw-exception-if-no-handler-found 参数的作用

在Spring Boot应用中,可以通过配置文件来控制当找不到请求处理器(handler)时是否抛出异常。具体的配置参数是spring.mvc.throw-exception-if-no-handler-found。 默认情况下,该参数的值为false,即当找不到请求处理器时…

《Zookeeper》源码分析(十四)之 投票是如何发送与接收的

目录 MessengerWorkerSenderWorkerReceiver第5步:检验选票的epoch和version第6步:处理投票 Messenger Messenger管理接收到的消息以及待发送的消息,其源码如下: 它的源码比较简单,接下来着重介绍它维护的两个线程&a…

Docker 网络之 ipvlan 和 macvlan

Docker ipvlan 和 macvlan 引言 本文讲解了Docker 网络模式中的 ipvlan 和 macvlan 的区别,目前自己在生产环境中使用的 ipvlan 模式非常问题.也解决了实际业务问题. IPvlan L2 mode example ipvlan 无需网卡混杂模式 , 运行如下命令后可以生成一个 vlan 子接口 , 会和主网卡…

ElasticSearch的客户端操作

ElasticSearch的客户端操作 1、客户端介绍 官方文档地址: https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html 实际开发中,有多种方式操作Elasticsearch: 客户端工具:发送http请求(RESTful风格)操作…

Azure Blob存储使用

创建存储账户,性能选择标准即可,冗余选择本地冗余存储即可 容器选择类别选择专用即可 可以上传文件到blob中 打开文件可以看到文件的访问路径 4.编辑中可以修改文件 复制链接,尝试访问,可以看到没有办法访问,因为创建容器的时候选…

spring(15) SpringBoot启动过程

目录 一、过程简介二、过程流程图三、源码分析1、运行 SpringApplication.run() 方法2、确定应用程序类型3、加载所有的初始化器4、加载所有的监听器5、设置程序运行的主类6、开启计时器7、将 java.awt.headless 设置为 true8、获取并启用监听器9、设置应用程序参数10、准备环境…

LeetCode450. 删除二叉搜索树中的节点

450. 删除二叉搜索树中的节点 文章目录 [450. 删除二叉搜索树中的节点](https://leetcode.cn/problems/delete-node-in-a-bst/)一、题目二、题解方法一:递归(一种麻烦的方法)方法二:优化后的递归 一、题目 给定一个二叉搜索树的根…

论文阅读——Imperceptible Adversarial Attack via Invertible Neural Networks

Imperceptible Adversarial Attack via Invertible Neural Networks 作者:Zihan Chen, Ziyue Wang, Junjie Huang*, Wentao Zhao, Xiao Liu, Dejian Guan 解决的问题:虽然视觉不可感知性是对抗性示例的理想特性,但传统的对抗性攻击仍然会产…

每天一道leetcode:1129. 颜色交替的最短路径(图论中等广度优先遍历)

今日份题目: 给定一个整数 n,即有向图中的节点数,其中节点标记为 0 到 n - 1。图中的每条边为红色或者蓝色,并且可能存在自环或平行边。 给定两个数组 redEdges 和 blueEdges,其中: redEdges[i] [ai, bi…

Dubbo Spring Boot Starter 开发微服务应用

环境要求 系统:Windows、Linux、MacOS JDK 8 及以上(推荐使用 JDK17) Git IntelliJ IDEA(可选) Docker (可选) 项目介绍 在本任务中,将分为 3 个子模块进行独立开发&#xff…

计算机组成与设计 Patterson Hennessy 笔记(一)MIPS 指令集

计算机的语言:汇编指令集 也就是指令集。本书主要介绍 MIPS 指令集。 汇编指令 算数运算: add a,b,c # abc sub a,b,c # ab-cMIPS 汇编的注释是 # 号。 由于MIPS中寄存器大小32位,是基本访问单位,因此也被称为一个字 word。M…

webpack中常见的Loader

目录 1.webpack中的loader是什么?配置方式 2. loader特性3.常见的loader 1.webpack中的loader是什么? loader 用于对模块的"源代码"进行转换,在 import 或"加载"模块时预处理文件 webpack做的事情,仅仅是分…

爬虫逆向实战(三)--天某云登录

一、数据接口分析 主页地址:天某云 1、抓包 通过抓包可以发现登录接口是account/login 2、判断是否有加密参数 请求参数是否加密? 通过“载荷”模块可以发现password、comParam_signature、comParam_seqCode是加密的 请求头是否加密? 无…

cmake扩展(5)——file命令排除部分文件

在cmake中可以使用file命令获取需要的文件&#xff0c;并且支持正则/通配符&#xff0c;使用起来还是很方便的。 #语法file({GLOB | GLOB_RECURSE} <out-var> [...] [<globbing-expr>...])#example file(GLOB_RECURSE SOURCES "src/*.h" "src/*.cp…

HTTP与HTTPS的区别

面试常见问题&#xff0c;HTTPS优化总结易记版&#xff1a; 1、HSTS重定向技术&#xff1a;将http自动转换为https&#xff0c;减少301重定向 2、TLS握手优化&#xff1a;在TLS握手完成前客户端就提前向服务器发送数据 3、会话标识符&#xff1a;服务器记录下与某客户端的会…

Mac鼠标增强工具Smooze Pro

Smooze Pro是一款Mac上的鼠标手势增强工具&#xff0c;可以让用户使用鼠标手势来控制应用程序和系统功能。 它支持多种手势操作&#xff0c;包括单指、双指、三指和四指手势&#xff0c;并且可以自定义每种手势的功能。例如&#xff0c;您可以使用单指向下滑动手势来启动Expos视…

Linux 僵死进程

fork复制进程之后&#xff0c;会产生一个进程叫做子进程&#xff0c;被复制的进程就是父进程。不管父进程先结束&#xff0c;还是子进程先结束&#xff0c;对另外一个进程完全没有影响&#xff0c;父进程和子进程是两个不同的进程。 一、孤儿进程 现在有以下代码&#xff1a;…

前端基础(JavaScript语法)

前言&#xff1a;今天学习JavaScript的基本语法&#xff0c;包括变量、函数、对象、数组。 目录 JavaScript 变量 函数 对象 数组 JavaScript 变量 定义变量 判断语句 判断等于&#xff1a; 判断不等于&#xff1a;! if else语句 if(vavb){ console.log("…

springboot 整合swagger 入门 使用

1.前提 一定要看好版本。 Springboot ✚ Swagger各版本整理_swagger版本_qq_33334411的博客-CSDN博客 我的版本: <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</ver…