IDE/VS项目属性中的 <字符集> 配置项,它到底是干什么用的?

news2024/12/29 16:21:47

文章目录

  • 概述
  • 对配置项的基础测试
    • VS默认的字符集配置
    • Unicode字符集和多字节字符集
    • 是否影响文本编辑器
  • 使VS像记事本那样显示文件编码
  • VS下编译UTF-8无BOM的代码文件
    • VS可以搞定ANSI和带BOM的源代码文件
    • VS搞不定UTF-8无BOM的源代码文件
    • 乱码字符是怎么翻译出来的?
    • 猜猜看
    • 再起航
  • 使VS/MSVC可以正确解析UTF-8代码文件
  • 难不成 VS项目属性字符集配置是执行字符集
  • Windows API 之 A 和 W 接口
  • 总结

概述

在整理 《QtCreator 下使用MSVC编译器》这篇文章时,回想起当年并没有彻底搞明白 “项目属性 -> 常规 -> 项目默认值 -> 字符集” 配置项的作用。且我坚信,搞明白此问题,那么 Qt + MSVC集成开发环境下的一些原有问题将会不攻自破。于是单独拎出来整理啦此篇文章。整理此篇文章时,我卡壳了,期间去整理发布了 《IDE /字符编码与文本文件(如cpp源代码文件)》,关于字符编码识别技术、BOM等基本内容可以参考其中的相关描述。

对配置项的基础测试

在此之前,我整理了《IDE /Qt Creator 文本编辑器之文件编码设置》,因此参考其中的,文件编码配置项的功能测试情况,对 VS项目属性 - 常规 - 字符集 配置项进行测试。

VS默认的字符集配置

当你在VS下新建不同类型的项目时,生成的默认配置值是不同的,如我们新建的Qt项目,
在这里插入图片描述
如我们新建的控制台应用程序,
在这里插入图片描述
如上,新建不同类型的项目,其默认的字符集配置值是不一样。新建控制台应用程序,默认选择的是使用Unicode字符集,我挺意外的。另外经过实际的测试,如果此处没有选择任何配置,或选择了 “未设置”,那么VS编译器又会作何处理? 这个问题压到后面的章节来解答。

Unicode字符集和多字节字符集

在之前的文章《IDE /C4819: 该文件包含不能在当前代码页(936)中表示的字符》中,已经对此配置项的下拉选项进行过简短的说明。

Unicode字符集几乎涵盖了全球范围的已知字符,包括各种语言的字符、符号、标点符号等。这里指定字符集,但是并没有指定字符集的具体的字符编码方式。因此,如果这里选择了适用Unicode字符集,则代码文件的编码格式必须为Unicode字符集下的UTF-8、UTF-16、UTF-32等编码方案。Unicode字符集的优势在于它提供了一种统一的字符表示方式,可以表示几乎所有语言的字符,有利于跨语言和跨平台的文本处理和交换。

多字节字符集通常用于处理特定语言的字符,如中文(GBK、GB18030)、日文(Shift-JIS)、韩文(EUC-KR)等。VS应该会识别操作系统的语言环境,从而选择特定的多字节字符集,如选择GB18030字符集,此时对于GB2312、GBK、GB18030编码格式的代码文件,解析都是没有问题的。
默认情况下,如果此处为空或者是未设置,则MSVC编译器使用多字节字符集,即本地字符集GB18030。

这里选择的字符集是指源字符集。

是否影响文本编辑器

在 《IDE /Qt Creator 文本编辑器之文件编码设置》一文中,我们见证了 Qt Creator 文本编辑器-文件编码配置是如何影响代码文件的字符编码格式的。所以很想知道,VS下的这个字符集配置项,是否有类似功能。如下,经理了摸着石头过河的阶段,时间不充裕的,可以跳过。

— 20230701 --Begin–
在VS2017下测试新建Qt项目,
我们新建 名为 EncodeM 的 Qt Widget 应用项目,其默认的字符集配置是未进行任何选择的"空",前边已经有过截图。我们打开工程下的 encodem.h、encodem.cpp、encodem.ui、main.cpp文件,查看它们的编码方式均为 UTF-8 Without BOM 编码格式。至于其中的原理,这里不再赘述,请参考《IDE /字符编码与文本文件(如cpp源代码文件)》
在 encodem.h 文件中输入一行中文注释 “//文件竟然是UTF-8无BOM格式的”,然后保存文件,重新查看该文件的编码方式。哟,变成了GB2312编码格式。
将,字符集配置为 “使用多字节字符集”,
在 encodem.cpp 文件中输入一行中文注释 “//文件竟然是UTF-8无BOM格式的”,然后保存文件,变GB2312编码格式。
将,字符集配置为 “使用Unicode字符集”,
在 mian.cpp 文件中输入一行中文注释 “//文件竟然是UTF-8无BOM格式的”,然后保存文件。依然变GB2312编码格式。
添加,新建项,C++类,ClassX,
ClassX.h、ClassX.cpp 依然全部是 UTF-8无BOM 格式,在它们中添加中文字符后保存,现象同上。即使现在是选择了字符集配置为 “使用Unicode字符集”。相比QtCreator的文本编辑器-文件编码的效用,这里是毫无卵用的。至此,便有理由推测,VS项目属性 - 字符集设置,不对文件编辑器有影响。

在VS2017下测试新建Win控制台项目,
新建 名为 EncodeD 的 Visual C++ Windows 桌面 控制台应用程序项目,查看EncodeD.cpp文件的编码,如下,
在这里插入图片描述
此时的默认文件编码是 UTF-8 带BOM 编码格式的,该编码格式才是VS的原生啊。添加,新建项,C++类,ClassX,ClassX.h、ClassX.cpp 全部是 UTF-8无BOM 格式,在它们中添加中文字符后保存,会变成GB2312编码格式。即使该新项目时被IDE默认选择了 “使用Unicode字符集” 配置。
— 20230701 --End–

这期间,我在整理 《IDE /字符编码与文本文件(如cpp源代码文件)》,快完成它的时候,心里敞亮了许多。

–后期测试- 20230712 --Begin–
我又重新进行了一次实验。新建名为 EncodeZ 的 Visual C++ Windows 桌面 控制台应用程序项目,
在这里插入图片描述
与前期测试结果相同,EncodeZ.cpp 是UTF-8带BOM文件。然后我们还是添加新建项,C++类,ClassH,它们还会被识别为UTF-8,原因我们都在《IDE /字符编码与文本文件(如cpp源代码文件)》中说明了。接着,我们复制 ClassH.h 为 ClassH_bak_1.h 和 ClassH_bak_2.h,然后操作如下:
1、使用记事本在ClassH_bak_1.h中添加 “//中国汉字” 字符串
2、使用Notepad++在ClassH_bak_2.h中添加 “//中国汉字” 字符串
3、使用VS文本编辑器,在ClassH.h中添加 “//中国汉字” 字符串
全部保存后,重新打开加载它们,可得,ClassH_bak_1.h和ClassH_bak_2.h是UTF-8编码的,ClassH.h是ANSI编码的。在《IDE /字符编码与文本文件(如cpp源代码文件)》的一个结论是: “文本文件以什么编码格式打开,编辑后,便会以什么编码保存”,记事本、Notepad、QtCreator都是这样的,我想以上述例子来反正,VS文本编辑器是以本地编码格式GB2312或GB18030来加载显示的代码文件。

在上述测试基础之上,我将 ClassH_bak_1.h 和 ClassH_bak_2.h 直接拖入到VS文本编辑器中,都能正确打开加载和显示,不会有QtCreator文本编辑器那样的字符编码不匹配的告警。这说明,VS文本编辑器以本地编码加载文件不成功的时候,会自动的去索引尝试其他编码格式。这是文本编辑器的基本功能,就像记事本程序那样。
–后期测试- 20230712 --End–

最后的结论,
VS项目属性 - 常规 - 项目默认设置 - 字符集,该配置,其功能与VS文件编辑器采用何种编码来加载文本文件、保存文本文件并没有半毛钱的关系!
后来为重新审视 Qt Creator + MSVC 组成的集成开发环境时,也更加认识到这一点,Qt Creator 文本编辑器文件编码配置 和 MSVC编译器配置,是完全不同的方向。而 VS字符集配置就是针对MSVC编译器的配置之一。VS并没有提供如 Qt Creator 文本编辑器文件编码配置这样的功能。
结合 《IDE /字符编码与文本文件(如cpp源代码文件)》中的相关分析,往 “文件以什么编码格式打开加载,编辑操作后便会以什么编码保存” 这个结论上靠拢的话,我们可以认为VS总是默认首先以本地编码格式加载文本类型的代码文件。如此,当你使用VS编辑器打开那些只用ASCII字符的文件时,若有中文字符输入和保存操作,则相关文件必定 “变为” ANSI编码。

使VS像记事本那样显示文件编码

默认情况下,Visual Studio 是不会直接显示代码文件的编码格式的。然而可以通过一些插件或扩展来实现在 Visual Studio 中显示代码文件的编码格式。例如,“File Encoding Info” 插件。该插件可以在 Visual Studio 的状态栏中显示当前打开文件的编码格式。从VS工具菜单中打开扩展和更新窗口,搜索下载安装即可。
在这里插入图片描述
经过实际测试,当前版本的此插件,质量欠佳。
在这里插入图片描述
不仅显示格式不漂亮,而且分析出来的文件编码类型是不对。实测,无论代码文件是UTF-8带BOM还是GB2312,均被此插件识别为显示为 Unicode(UTF-8) 格式。因此,我果断卸载了,并幻想着以后能自己写一个插件。

VS下编译UTF-8无BOM的代码文件

如下是在好几年前记录下来的,那个时候还在用VS2013 集成开发环境,或者是在用没加装update3的VS2015集成开发环境。原本此记录还有些别的描述,因为已经无从追查,怕引起其他歧义,我删除了当时的文字描述,只保留了测试代码和测试步骤。

#include <iostream>

using namespace std;
int main()
{
    std::cout << "我爱你中国!\r\n";
    system("pause");
    return 0;
}

依稀还记得,这个测试应该是在试图把QtCreator上的工程搬移到VS下时进行的。因为通常QtCreator下创建的代码文件都是UTF-8无BOM的编码格式,在将这些源代码直接拿到VS编译时,遇到了乱码的问题。

新测试过程如下,在VS2017下新建空项目,新建main.cpp文件,输入上述代码段,保存。VS给项目默认配置了"使用多字节字符集";main.cpp文件编码格式被存储为ANSI格式,这个我们也了然于心。

VS可以搞定ANSI和带BOM的源代码文件

测试1 基于 ANSI编码的 main.cpp 文件 + 使用多字节字符集
编译项目,测试运行,当然可以在控制台上正确输出中文字符。

测试2 基于 ANSI编码的 main.cpp 文件 + 配置使用Unicode字符集
编译项目,测试运行,依然可以在控制台上正确输出中文字符。可按照理论分析,此时应该乱码才对?先压制下求知欲,待会再说。

测试3 基于 UTF-8带BOM编码的 main.cpp 文件 + 配置使用Unicode字符集
转变 main.cpp文件编码类型,保存,重新编译测试。依然可以在控制台上正确输出中文字符。

测试4 基于 UTF-8带BOM编码的 main.cpp 文件 + 配置使用多字节字符集
重新编译测试。依然可以在控制台上正确输出中文字符。

测试5 基于 UTF-16-BE编码的 main.cpp 文件
分别测试,置使用Unicode字符集、配置使用多字节字符集,均可以在控制台正确输出中文字符。

VS搞不定UTF-8无BOM的源代码文件

测试6 基于 UTF-8无BOM编码的 main.cpp 文件
这正是当年我记录下来的测试配置,当时试图把一些QtCreator的源代码文件搬到VS中进行重新编译。我知道此时的运行会存在中文乱码。今天我们就彻底来分析到底是这个乱码是如何产生的。

置使用Unicode字符集,运行输出,
在这里插入图片描述

配置使用多字节字符集,运行输出,
在这里插入图片描述
测试分析至此。似乎觉得,项目属性字符集配置,并没有影响到编辑器对代码文件的解析过程,

1、如果源代码文件是ANSI编码的,无论你配置了VS使用何种字符集,中文字符串总能被正确解析。
2、如果源代码文件是带BOM的,在不同VS字符集配置下,代码文件中的中文字符串同样的地总能被正确的解析。
3、唯独UTF-8无BOM,这种在其他地方推荐使用的文件编码格式,VS竟然不认。且,且,且,改变VS字符集配置并没有影响输出的乱码。

如上三条现象均将矛头指向一个客观 “从表面上看,VS字符集配置似乎没有影响到MSVC编译器加载代码文件时使用的编码”,因为无论是输出正确的字符,还是输出错误的字符,都看上去与VS字符集配置无关。

乱码字符是怎么翻译出来的?

既然,UTF-8无BOM格式的main.cpp文件编译后的程序,不能正确输出,那么,就搞它。我们使用WinHex打开UTF-8编码的main.cpp文本文件,
在这里插入图片描述
“空格” 的 UTF-8 编码是 20 //16进制数
“<” 的 UTF-8 编码是 3C
“引号” 的 UTF-8 编码是 0x22
“我” 的 UTF-8 编码是 E6 88 91
“爱” 的 UTF-8 编码是 E7 88 B1
“你” 的 UTF-8 编码是 E4 BD A0
“中” 的 UTF-8 编码是 E4 B8 AD
“国” 的 UTF-8 编码是 E5 9B BD

如上,高亮的 [20 3C 3C 20 22] 编码值就是代码文件中,“我爱你中国” 字符串前的 [ << " ] 文本内容。我们也能使用WinHex看到 “我爱你中国” 的UTF-8编码值,都能对的上。(上图,WinHex软件配置使用ANSI字符编码)

因此可以断定,VS编译器,把UTF-8无BOM的源代码文件,当做ANSI编码的文件来加载了。我们进一步来分析验证下,以打破心结。“鎴戠埍浣犱腑鍥斤紒” 这些生僻字,都在汉字编码中有自己的位置吗?

“鎴” 字是存在的,
在这里插入图片描述
进入国家标准全文公开系统,在搜索框中输入" 字符集、信息交换用汉字编码字符集、GB18030 " 等关键字,可以找到相关标准,在线预览或者下载。在GB2312中找不到这个字。我下载了GB18030-2005版本(Win10在2015年发布,这是最相近的版本;GB18030-2022尚未正式启用)。在GB18030-2005版本中可以找到其对应的编码是,
在这里插入图片描述
但是93B4这个编码,并无法匹配上WinHex中显示的 E6 88 编码值 。头大啦,不想搞了。

在 Unicode官网的 Code Charts 中搜索 93B4,
在这里插入图片描述
打开文件U4E00.pdf,可以找到,
在这里插入图片描述

再尝试,
使用Windows接口,将Unicode码点转换成,UTF-8编码值,

#include <Windows.h>

int main() {
    // Unicode 码点
    wchar_t unicodeCodePoint = L'\u93B4';  //输出 E9 8E B4

    // 转换为 UTF-8 编码
    int bufferSize = WideCharToMultiByte(CP_UTF8, 0, &unicodeCodePoint, 1, NULL, 0, NULL, NULL);
    char* utf8Buffer = new char[bufferSize];
    WideCharToMultiByte(CP_UTF8, 0, &unicodeCodePoint, 1, utf8Buffer, bufferSize, NULL, NULL);

    for (int i = 0; i < bufferSize; i++)
        printf("UTF-8:0x%.2x\n", (char)utf8Buffer[i]);

    delete[] utf8Buffer;
    system("pause");
    return 0;
}

码点 u+93B4 转换成的UTF-8编码值为 E9 8E B4,没有与WinHex中显示的编码值匹配。

通常,
当一个编码值在特定字符集的编码表中找不到对应的字符时,文本编辑器或其他输出设备通常会使用一些默认的替代字符或占位符来表示这些无法解析的编码值。常见的替代字符包括问号 “?”、方块 “□”、空格 " " 或其他特殊符号。具体的展示方式取决于编辑器或设备的实现,可能存在一些差异。

放弃,

“鎴戠埍浣犱腑鍥斤紒” 这些生僻字,到底是根据哪个字符编码翻译出来的啊!不搞了,留给以后得自己吧。剩下的,当下没有搞明白的,将放到 《字符串/多字节宽字节之间的转换与字符编码的关联》中继续奋战。

猜猜看

虽然我最终没有在GB1080-2005中成功匹配示例程序中打印出来生僻字,但是在控制台中的打印结果与在WinHex使用ANSI ASCII字符编码时显示的内容字符,是几乎完全一样的,都包含 “鎴戠埍浣犱腑鍥斤” 字符。因此有理由推测,VS将UTF-8无BOM的代码文件当做ANSI字符编码来读取了
如果如上猜测是正确的,那么VS编译器读取代码文件时的步骤大概如下,
如果有BOM,则按照BOM指定的编码类型来加载,如果没有则一律安装ANSI来加载。UTF-8无BOM正中入坑。

再起航

虽然我还是没有明确地解决上述问题,但我选择了曲线救国。

新建一个1.txt文本文件(UTF-8无BOM编码),在其中输入 “鎴” 保存,使用WinHex打开,看见 E9 8E B4。
新建一个2.txt文本文件(ANSI编码),在其中输入 “鎴” 保存,使用WinHex打开,确实看见 EE B6。
新建一个3.txt文本文件(GB2312编码),在其中输入 “鎴” 保存。记事本打开它,显示编码格式为ANSI。使用WinHex打开,确实看见 EE B6.
新建一个4.txt文本文件(GB2312编码),在其中输入 “中国汉字” 保存。记事本打开它,显示编码格式为ANSI。

因此,可以完全确定 E6 88 就是 本地编码中的汉字 “鎴” 。VS的MSVC编译器就是把UTF-8无BOM的源代码文件当ANSI来搞了。

使VS/MSVC可以正确解析UTF-8代码文件

办法是有的,之前也做过尝试。在《IDE /C4819: 该文件包含不能在当前代码页(936)中表示的字符》文中也有提及。主要参考microsoft 设置源字符集、设置执行字符集、将源字符集和执行字符集设置为 UTF-8 等官方帮助文档。

在以前VS2015或更低版本的时候,我是用过如下指令的,将其放在cpp的开头,我记得测试是生效的,但是如今VS2017已经不识别此指令,可能是废弃了。

//原本是支持的
#pragma execution_charset_set("utf-8")
//打我记事就没有此指令
#pragma source_charset_set("utf-8")

按照上文中官方帮助提示,进行如下设置,/source-charset:utf-8
在这里插入图片描述
在上述配置下,确实是生效的。此时VS可以正确编译UTF-8无BOM的源代码文件,不会有乱码。且无论,VS字符集配置成什么类型,都不影响。

难不成 VS项目属性字符集配置是执行字符集

在起初我推测VS项目属性字符集配置是源字符集配置,这与思维定式有关,因为我一开始错误的想把这个配置往QtCreator文本编辑器配置功能上靠拢。
但是经过上文几个章节的测试和分析,它不像是源字符集配置,倒像是执行字符集配置。在我更细致的了解到执行字符集的含义后,也更加坚定了此想法,为此我做了如下测试。

将“我爱你中国”写入文本文件,分别保存为ANSI格式和UTF-8格式,使用WinHex查看其二进制编码值,
在这里插入图片描述
在这里插入图片描述
microsoft 设置执行字符集 文中提到,
在将源代码编译位可执行文件时,编译器会将源代码中的字符转换成可执行程序中的二进制数据。由于不同字符集采用不同的编码方式,因此在编译时必须确定所使用的编码方式,以便程序运行时可以正确读取和显示字符。
细细品味,上述过程与我们前边大篇幅讨论的“编译器词法分析前使用何种方式加载代码二进制文件为字符数据”的这个过程,它们使用字符集的目的是相反的。上述过程,是将字符转换为二进制数据,而之前讨论的是如何将二进制数据加载为字符。

将 main.cpp 存储为 UTF-8-BOM 编码, 选择字符集设置为 使用多字节字符集,使用WinHex查看生成的可执行文件,
注:使用菜单栏 - 搜索 - 查找16进制数值,“CED2” ,注意不要加空格。
在这里插入图片描述
结论1,
UTF-8-BOM 编码的代码文件,在使用使用多字节字符集配置的情况下,编出来的可执行程序中。原本代码文件中的UTF-8编码的字符串,现以其ANSI编码的二进制编码值存在于VsCode.exe这个可执行程序中。

继续测试,
在上文基础上,改变VS字符集设置为 使用Unicode字符集,使用WinHex查看生成的可执行文件,
我原本猜测的结果是,二进制的可执行文件中,“我爱你中国” 会以Unicode码点值或者UTF-16编码值存在。但结果却是,它们依然是ANSI编码值。将程序编译为Release版本来进行分析,依然如此。

继续测试,
在项目属性 C/C++命令行中 配置 /execution-charset:utf-8,重新编译,查看,
在这里插入图片描述
分析可知,上述对执行字符集的配置是生效的,可执行文件中的字符串,此刻已经是UTF-8存储的啦。同时,这也说明,VS项目属性中的字符集配置,不对编译器执行字符编码配置有影响。
其他,
在 QtCreator 下的pro工程文件中,理论上使用 QMAKE_CXXFLAGS += /source-charset:utf-8 /execution-charset:utf-8 后,可以向MSVC编译器传递编译参数,但是我当时没有测试成。这个有机会再搞。

至此,可得。VS项目属性中的字符集配置,不是源字符集设置,也不是执行字符集设置。那么,它到底是啥?

Windows API 之 A 和 W 接口

以CreateDirectory这个WinAPI为例子,我们都知道它有两个定义,

#ifdef UNICODE
#define CreateDirectory  CreateDirectoryW
#else
#define CreateDirectory  CreateDirectoryA
#endif // !UNICODE

看到 UNICODE 这个宏了没有,难不成 VS项目属性字符集配置,只是影响了该宏的定义?

#include <iostream>
#include <Windows.h>

using namespace std;
int main()
{
#ifdef UNICODE
    std::cout << "我爱你Unicode!\r\n";
#else
    std::cout << "我爱你ANSI!\r\n";
#endif // !UNICODE

    LPCWSTR folderPath = L"D:\\path\\to\\your\\folder";

    if (CreateDirectory(folderPath, NULL)) {
        // ...
    }
    else {
        // ....
    }

    system("pause"); return 0;
}

保持 main.cpp 源代码文件为 UTF-8-BOM 编码格式,先配置使用Unicode字符集,
在这里插入图片描述

可以看到此时 UNICODE 被定义,CreateDirectory 实为 CreateDirectoryW,程序可正常编译。

修改VS字符集配置为 使用多字节字符集,
在这里插入图片描述
可以看到此时 UNICODE 未被定义,CreateDirectory 实为 CreateDirectoryA,程序编译报错,
E0167 “LPCWSTR” 类型的实参与 “LPCSTR” 类型的形参不兼容 VsCodeT E:\TestEncode\VsCodeT\main.cpp 15

总结

至此,算是尘埃落定了吧。VS项目属性 - 常规 -项目默认配置 - 字符集配置,这鸟东西就是影响了 编译器预处理器宏 UNICODE 是否被定义。
如果你没有使用WinAPI的与字符串有关的那些接口,该宏的作用似乎不是很多。估计这也是新建Qt项目时,没有去指定它的原因吧。我们再新建个Qt项目,测试下其在不配置该VS字符集配置项时,UNICODE是否被定义了。结果是,VS新建的Qt项目,VS字符集配置为空,其实默认是 使用Unicode字符集,而不是 使用多字节 字符集,如下。
在这里插入图片描述
在即将结束此文整理的那天,我也在 设置执行字符集 这篇文章中找到了确切的VS如何加载代码文件的过程:
在这里插入图片描述
默认情况下,Visual Studio会检测字节顺序标记(Byte Order Mark,BOM)来确定源文件是否使用编码的Unicode格式,如UTF-16或UTF-8。如果没有找到字节顺序标记,源文件将被假定为使用当前用户代码页进行编码,除非通过 /source-charset 选项指定了字符集名称或代码页。


写在最后,
现在来看,标题中的问题仅仅是一个小问题,但是为了彻底搞明白它,前后跨越了3年,累计花费了10小时以上的时间。这个过程中扯出来很多其他关联的问题,收获还是蛮多的。文章中若有不合理的地方,欢迎批评指正。

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

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

相关文章

解决windows上端口占用问题

在开发中总会碰到端口占用问题&#xff0c;最后导致我们项目或服务无法正常启动。 解决方案如下&#xff1a; # 1.根据端口号查进程 例如8082端口 netstat -aon | findstr :8082 # 2.根据进程id查应用名 tasklist|findstr "11376" # 3.根据pid删除进程 taskkill …

检测到错误页面web应用服务器版本信息泄露

详细描述 Web服务器未能正确处理异常请求导致Web服务器版本信息泄露&#xff0c;攻击者收集到服务器信息后可进行进一步针对性攻击。 解决办法 临时修复建议如下&#xff1a; 1、关闭web服务器错误提示。 2、关闭运行平台的错误提示。 3、建立错误机制&#xff0c;不要把真实…

python numpy axis=0,1,2, 分清楚

理解维度问题&#xff0c;记忆右边图片坐标的0,1&#xff0c;2&#xff0c; 就记住了计算方向问题&#xff0c;每个矩阵想象一张图片&#xff0c;多个图片叠加&#xff0c; 哪个维度做&#xff0c;哪个维度就被降维度1&#xff0c;默认无 所以 &#xff08;4,3&#xff0c;2&am…

linux系统管理:常用命令和技巧

目录 0 前言 1 sudo and su 1.1 su: 切换用户 1.2 sudo: 切换用户 2 权限设置&#xff1a;chmod, chown 2.1 chmod&#xff1a;访问权限设置 2.2 chown&#xff1a;设置文件或目录的主人 2.3 chgrp&#xff1a;设计文件或者目录属于哪个组 2.4 查询组成员 2.5 查询某…

搭建微服务工程 【详细步骤】

一、准备阶段 &#x1f349; 本篇文章用到的技术栈 mysqlmybatis[mp]springbootspringcloud alibaba 需要用到的数据库 订单数据库: SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for shop_order -- --------------…

Nacos服务注册和配置中心(Config,Eureka,Bus)1

SCA(Spring Cloud Alibaba)核心组件 Spring Cloud是若干个框架的集合&#xff0c;包括spring-cloud-config、spring-cloud-bus等近20个子项目&#xff0c;提供了服务治理、服务网关、智能路由、负载均衡、断路器、监控跟踪、分布式消息队列、配置管理等领域的解决方案,Spring C…

Kafka 深度剖析

1、应用场景 1.1 kafka场景 Kafka最初是由LinkedIn公司采用Scala语言开发&#xff0c;基于ZooKeeper&#xff0c;现在已经捐献给了Apache基金会。目前Kafka已经定位为一个分布式流式处理平台&#xff0c;它以 高吞吐、可持久化、可水平扩展、支持流处理等多种特性而被广泛应用…

Docker安装SonarQube

1.查看稳定版本的SonarQube&#xff0c;注意7.9之后的版本不在支持Mysql。使用PostgreSQL Download | SonarQube | Sonar 2.拉取PostgreSQL和SonarQube docker pull postgres docker pull sonarqube:9.9-community community代表社区版 3.在下面的目录下创建docker-compose…

云计算运维工程师简历怎么写?带简历案例

求职岗位&#xff1a;云计算运维工程师 职位要求&#xff1a; 1&#xff09;熟悉Linux操作系统的和管理与维护&#xff0c;有Linux操作系统性能监控和优化工作经验&#xff1b; 2&#xff09;熟悉日常服务器的数据备份、迁移、扩容等技术工作&#xff0c;能够解决相应运维工作…

H3C-Cloud Lab实验-NAT实验

实验拓扑图&#xff1a; IP地址规划&#xff1a; 实验需求&#xff1a; 1. 按照图示配置 IP 地址 2. 私网 A 通过 R1 接入到互联网&#xff0c;私网 B 通过 R3 接入到互联网 3. 私网 A 内部存在 Vlan10 和 Vlan20&#xff0c;通过 R1 上单臂路由访问外部网络 4. 私网 A 通过…

(数学)+(二分)

cf826-C. Place for a Selfie 给n条直线和m条开口向上的抛物线&#xff0c;问对于每条抛物线来说&#xff0c;存不存在和它不相交的直线&#xff0c;存在的话&#xff0c;输出直线的斜率。 直线与抛物线联立&#xff0c;(b-k)^2-4ac<0则不相交&#xff0c;|b-k|越小越好&…

操作系统16:文件共享和文件保护

目录 1、文件共享 &#xff08;1&#xff09;基于有向无循环图实现文件共享 1.1 - 有向无循环图 DAG(Directed Acyclic Graph) 1.2 - 利用索引结点 &#xff08;2&#xff09;利用符号链接实现文件共享 2、文件保护 &#xff08;1&#xff09;保护域(Protection Domain)…

自动化测试需要学什么【附学习路线和学习教程】

目录 一、接口自动化测试 1、HTTP和HTTPS协议 2、接口文档 3、接口测试工具Jmeter和Postman 5、总结 二、UI自动化测试 1 、Web自动化测试 1.1 Selenium 1.3 总结 2 App自动化测试 2.1 应该选择哪款工具&#xff1f; 三、持续集成 四、总结 随着自动化测试行业的薪…

关于nginx学习记录(二)

系列文章目录 第一章 Nginx 学习入门——Nginx的概述及安装 第二章 Nginx学习入门——Nginx常用命令及nginx.conf配置了解 目录 系列文章目录 一、Nginx 操作常用的命令 二、Nginx 配置文件 1. nginx配置文件位置:/usr/local/nginx/conf 2.nginx.conf配置文件组成: ⑴ 全…

ASL/CS系列音视频转换方案芯片,Typec拓展坞方案芯片

音视频单转方案芯片&#xff1a; CS5565 Typec转HDMI 8K 60HZ转换方案 可替代RTD2173 PS196 CS5801 HDMI转eDP/DP方案 可替代LT6711 CS5212 DP转VGA转换方案 可PIN TO PIN 替代RTD2166 CS5211 E…

Python+Appium自动化测试之元素等待方法与重新封装元素定位方法

目录 一&#xff0c;元素等待方法 1&#xff0c;强制等待 2&#xff0c;隐式等待 3&#xff0c;显式等待 二&#xff0c;重新封装元素定位方法 在appium自动化测试脚本运行的过程中&#xff0c;因为网络不稳定、测试机或模拟器卡顿等原因&#xff0c;有时候会出现页面元素加…

python_day8_综合案例

综合案例&#xff0c;全球GDP排行榜 1、知识点补充&#xff1a;sort()方法 sort()方法&#xff1a; 列表.sort(key选择排序依据的函数,reverseTrue|False) my_list [[a, 33], [b, 55], [c, 11]]def choose_sort_key(element):return element[1] # 列表中每个元素传进来&am…

动态规划01背包之494 目标和(第10道)

题目&#xff1a; 给你一个整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 或 - &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; 例如&#xff0c;nums [2, 1] &#xff0c;可以在 2 之前添加 &#xff0c;在 1 之前添加 -…

C语言知识扫盲

文章目录 1,各种类型所占字节数2,main函数是可以传入参数的3,C语言中extern的用法4,gettop()函数5&#xff0c;C/C中枚举类型enum使用 1,各种类型所占字节数 类型16位32位64位char111short int222int244unsigned int244float444double888long448long long888unsigned long448 …

QUIC协议原理分析

Quic 相比现在广泛应用的 http2tcptls 协议有如下优势 [2]&#xff1a; 减少了 TCP 三次握手及 TLS 握手时间。改进的拥塞控制。避免队头阻塞的多路复用。连接迁移。前向冗余纠错。 队头阻塞 队头阻塞主要是 TCP 协议的可靠性机制引入的。TCP 使用序列号来标识数据的顺序&am…