基于 C# 的文本文件的编码识别

基于 C# 的文本文件的编码识别

  • 前言
  • 一、有 BOM 文件头
  • 二、无 BOM 文件头
  • 三、简体中文汉字编码
  • 四、C# 程序对编码的识别
    • 1、文件选择按钮代码:
    • 2、获取文件编码,有 BOM 的文件识别
    • 3、获取文件编码,UTF8 无 BOM 文件的识别
    • 4、获取文件编码,UTF16 无 BOM 文件的识别
    • 5、获取非 UTF8、UTF16、UTF32 文件的 ASCII 和中文编码
  • 五、获得各种编码的汉字
  • 六、获得各种编码的代码页和名称
  • 七、程序通过验证
  • 八、源代码下载

前言

在 Windows 系统下,文本编码存在有无 BOM 的编码。BOM(Byte Order Mark),字节顺序标记,出现在文本文件头部,Unicode 编码标准中用于标识文件是采用哪种格式的编码。有文件 BOM 头的 Unicode 编码容易识别,无 BOM 文件头的要在文件中查找字节顺序来判断 Unicode 编码。

Unicode 称为 Unicode 16 LE
BigEndianUnicode 称为 Unicode 16 BE
Unicode32 称为 Unicode 32 LE
Unicode32BE 称为 Unicode 32 BE

一、有 BOM 文件头

文件编码文件头 0-3 字节顺序 BOM 标记汉字字节组成以“中文”为例的编码(尾含回车)
Unicode0xFF,0xFE,必非0,视中英文定一个汉字 2 字节,“中文”二字共 4 字节2D 4E 87 65 0D 00 0A 00
BigEndianUnicode0xFE,0xFF,视中英文定,必非0一个汉字 2 字节,“中文”二字共 4 字节4E 2D 65 87 00 0D 00 0A
UTF320xFF,0xFE,0,0一个汉字 4 字节,“中文”二字共 8 字节2D 4E 00 00 87 65 00 00 0D 00 00 00 0A 00 00 00
UTF32BE0,0,0xFE,0xFF一个汉字 4 字节,“中文”二字共 8 字节00 00 4E 2D 00 00 65 87 00 00 00 0D 00 00 00 0A
UTF80xEF,0xBB,0xBF一个汉字3字节,“中文”二字共6字节E4 B8 AD E6 96 87 0D 0A

汉字混搭对比示例说明:

文件编码字符串十六进制
Unicode 16 LELOVE C#\r\n中文FF FE 4C 00 4F 00 56 00 45 00 20 00 43 00 23 00 0D 00 0A 00 2D 4E 87 65
Unicode 16 BELOVE C#\r\n中文FE FF 00 4C 00 4F 00 56 00 45 00 20 00 43 00 23 00 0D 00 0A 4E 2D 65 87
Unicode 32 LELOVE C#\r\n中文FF FE 00 00 4C 00 00 00 4F 00 00 00 56 00 00 00 45 00 00 00 20 00 00 00
43 00 00 00 23 00 00 00 0D 00 00 00 0A 00 00 00 2D 4E 00 00 87 65 00 00
Unicode 32 BELOVE C#\r\n中文00 00 FE FF 00 00 00 4C 00 00 00 4F 00 00 00 56 00 00 00 45 00 00 00 20
00 00 00 43 00 00 00 23 00 00 00 0D 00 00 00 0A 00 00 4E 2D 00 00 65 87
UTF8LOVE C#\r\n中文EF BB BF 4C 4F 56 45 20 43 23 0D 0A E4 B8 AD E6 96 87

从上面有 BOM 头的编码可以看出:
Unicode 16 LE 与 Unicode 16 BE 的区别是每 2 个字节反序。
Unicode 32 LE 与 Unicode 32 BE 的区别是每 4 个字节反序。
Unicode 16 英语字符区间内,一个英文字母为单字节,占用一个 00 字节;Unicode 32 占用空间更大,一个英文字母占用 4 个 00 字节;UTF8文件越大占用空间越小。几乎没有 00 字节。

二、无 BOM 文件头

文件编码文件头 0-4 字节顺序 BOM 标记汉字字节组成以“中文”为例的编码(尾含回车)
Unicode一个汉字 2 字节,“中文”二字共 4 字节2D 4E 87 65 0D 00 0A 00
BigEndianUnicode一个汉字 2 字节,“中文”二字共 4 字节4E 2D 65 87 00 0D 00 0A
UTF32一个汉字 4 字节,“中文”二字共 8 字节2D 4E 00 00 87 65 00 00 0D 00 00 00 0A 00 00 00
UTF32BE一个汉字 4 字节,“中文”二字共 8 字节00 00 4E 2D 00 00 65 87 00 00 00 0D 00 00 00 0A
UTF8一个汉字3字节,“中文”二字共6字节E4 B8 AD E6 96 87 0D 0A
ANSI一个汉字 2 字节,“中文”二字共 4 字节D6 D0 CE C4 0D 0A

汉字混搭对比示例说明:

文件编码字符串十六进制(无BOM头部字节识别码,可从字节排序识别)
Unicode 16 LELOVE C#\r\n中文4C 00 4F 00 56 00 45 00 20 00 43 00 23 00 0D 00 0A 00 2D 4E 87 65
Unicode 16 BELOVE C#\r\n中文00 4C 00 4F 00 56 00 45 00 20 00 43 00 23 00 0D 00 0A 4E 2D 65 87
Unicode 32 LELOVE C#\r\n中文4C 00 00 00 4F 00 00 00 56 00 00 00 45 00 00 00 20 00 00 00 43 00 00 00
23 00 00 00 0D 00 00 00 0A 00 00 00 2D 4E 00 00 87 65 00 00
Unicode 32 BELOVE C#\r\n中文00 00 00 4C 00 00 00 4F 00 00 00 56 00 00 00 45 00 00 00 20 00 00 00 43
00 00 00 23 00 00 00 0D 00 00 00 0A 00 00 4E 2D 00 00 65 87
UTF8LOVE C#\r\n中文4C 4F 56 45 20 43 23 0D 0A E4 B8 AD E6 96 87

从上面没有有 BOM 头的编码可以看出,与有 BOM 头的编码相比,只是少了文件头的 BOM 标识。

三、简体中文汉字编码

中文编码(按新旧顺序)代码页汉字字符串以“中文”为例的编码
Unicode 321200中文2D 4E 87 65
Unicode 32 BE1201中文4E 2D 65 87
Unicode1200中文2D 4E 00 00 87 65 00 00
Unicode BE1201中文00 00 4E 2D 00 00 65 87
UTF865001中文E4 B8 AD E6 96 87
GB18030CP54936中文D6 D0 CE C4
GBKCP936中文D6 D0 CE C4
GB2312CP20936中文D6 D0 CE C4
HZ-GB2312CP52936中文D6 D0 CE C4
BIG5CP950中文A4 A4 A4 E5

四、C# 程序对编码的识别

//声明引用指令名称空间
using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Forms;

1、文件选择按钮代码:

    private void button1_Click(object sender, EventArgs e){OpenFileDialog Openfiledialog = new OpenFileDialog();Openfiledialog.InitialDirectory = Application.StartupPath;Openfiledialog.Filter = "文本文件(*.TXT)|*.TXT|所有文件(*.*)|*.*";Openfiledialog.Title = "打开文件";Openfiledialog.Multiselect = true;Openfiledialog.FilterIndex = 0;dataGridView1.Columns.Clear();DataGridViewColumn col;DataGridViewRow row;DataGridViewCell cell = new DataGridViewTextBoxCell();string[] HeaderText = { "文件", "编码" };for (int i = 0; i < 2; i++){col = new DataGridViewColumn();col.HeaderText = HeaderText[i];col.CellTemplate = cell;col.HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;dataGridView1.Columns.Add(col);dataGridView1.DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;}if (Openfiledialog.ShowDialog() == DialogResult.OK){string[] FilePath = Openfiledialog.FileNames;foreach (string file in FilePath){row = new DataGridViewRow();cell = new DataGridViewTextBoxCell();cell.Value = file;row.Cells.Add(cell);cell = new DataGridViewTextBoxCell();cell.Value = GetEncoding(file).WebName;row.Cells.Add(cell);dataGridView1.Rows.Add(row);}}dataGridView1.AutoResizeColumns();}

2、获取文件编码,有 BOM 的文件识别

       /// <summary>获取文件的编码格式</summary>/// <param name="file_name">文件</param>/// <returns>文件的编码类型</returns>private static Encoding GetEncoding(string file_name){//文件的字符集在Windows下有两种,一种是ANSI,一种Unicode。//对于Unicode,Windows支持了它的三种编码方式,//一种是小尾编码(Unicode),一种是大尾编码(BigEndianUnicode),一种是UTF - 8编码。if (file_name == null){throw new ArgumentNullException(nameof(file_name));}FileStream fs = new FileStream(file_name, FileMode.Open, FileAccess.Read);long FsLeng = fs.Length;if (FsLeng < 0){throw new ArgumentOutOfRangeException(nameof(FsLeng));}byte[] bytes = new byte[FsLeng];if (fs.Length < 3)//小于BOM文件头3字节{fs.Close();return Encoding.ASCII;}fs.Read(bytes, 0, bytes.Length);fs.Close();if (bytes[0] == 0xFF && bytes[1] == 0xFE && (bytes[2] != 0 || bytes[3] != 0))//Unicode BOM标记{return Encoding.Unicode;}else if (bytes[0] == 0xFE && bytes[1] == 0xFF && (bytes[2] != 0 || bytes[3] != 0))//BigEndianUnicode BOM标记{return Encoding.BigEndianUnicode;}else if (bytes[0] == 0xFF && bytes[1] == 0xFE && bytes[2] == 0 && bytes[3] == 0)//UTF32 BOM标记{return Encoding.UTF32;}else if (bytes[0] == 0x00 && bytes[1] == 0x00 && bytes[2] == 0xFE && bytes[3] == 0xFF)//UTF32BE BOM标记{return Encoding.GetEncoding("utf-32BE");}else if (bytes[0] == 0xEF && bytes[1] == 0xBB && (bytes[2] == 0xBF))//UTF8 BOM标记{return Encoding.UTF8;}else//无BOM标记{Encoding encoding = CheckUtf16Ascii(bytes, bytes.Length);//识别无BOM标记的UTF16if (encoding == null)//不是无BOM标记的UTF16{if (IsOnlyAscii(bytes))//只有ASCII字符{return Encoding.ASCII;//纯 ASCII }if(IsUTF8Bytes(bytes))识别无BOM标记的UTF8{return Encoding.UTF8; //无BOM标记的UTF8}else //排除所有 UTF16、UTF8、纯ASCII,剩下的就是中文状态的文本文件{if (IsBIG5(bytes)){return Encoding.GetEncoding("BIG5");//一代繁体编码}              else if (IsGB2312(bytes))//一代简体中文编码{return Encoding.GetEncoding("GB2312");}else if (IsGBK(bytes))//二代中文编码(包含简体、繁体中文){return Encoding.GetEncoding("GBK");}else if (IsGB18030(bytes))//三代中文编码,四代中文编码为全球通 UTF 码中文{return Encoding.GetEncoding("GB18030");}else{return Encoding.Default;//无法识别,设定默认为系统编码}}else{return encoding;//无BOM标记的UTF16}}}

3、获取文件编码,UTF8 无 BOM 文件的识别

 private static bool IsUTF8Bytes(byte[] data){int charByteCounter = 1;  //计算当前正分析的字符应还有的字节数byte curByte; //当前分析的字节.for (int i = 0; i < data.Length; i++){curByte = data[i];if (charByteCounter == 1){if (curByte >= 0x80){//判断当前while (((curByte <<= 1) & 0x80) != 0){charByteCounter++;}//标记位首位若为非0 则至少以2个1开始 如:110XXXXX...........1111110X if (charByteCounter == 1 || charByteCounter > 6){return false;}}}else{//若是UTF-8 此时第一位必须为1if ((curByte & 0xC0) != 0x80){return false;}charByteCounter--;}}if (charByteCounter > 1){throw new Exception("非预期的byte格式");}return true;}

4、获取文件编码,UTF16 无 BOM 文件的识别

 private static Encoding CheckUtf16Ascii(byte[] buffer, int size){if (buffer == null){throw new ArgumentNullException(nameof(buffer));}if (size < 0){throw new ArgumentOutOfRangeException(nameof(size));}if (size < 2){return null;}// 将大小减小1,这样我们就不必担心字节对的边界检查size--;const double threshold = 0.5; // 允许一些非英语ISO-8859-1子集的UTF-16字符,同时仍检测编码。const double limit = 0.1;var leAsciiChars = 0;var beAsciiChars = 0;var pos = 0;while (pos < size){byte ch1 = buffer[pos++];byte ch2 = buffer[pos++];// 偶数计数为空if (ch1 == 0 && ch2 != 0){beAsciiChars++;}// 奇数计数空值if (ch1 != 0 && ch2 == 0){leAsciiChars++;}}// 恢复大小size++;double leAsciiCharsPct = leAsciiChars * 2.0 / size;double beAsciiCharsPct = beAsciiChars * 2.0 / size;if (leAsciiCharsPct > threshold && beAsciiCharsPct < limit){return Encoding.Unicode;}if (beAsciiCharsPct > threshold && leAsciiCharsPct < limit){return Encoding.BigEndianUnicode;}// 无法识别的编码return null;}

5、获取非 UTF8、UTF16、UTF32 文件的 ASCII 和中文编码

        private static bool IsOnlyAscii(byte[] bytes){if (bytes == null){throw new ArgumentNullException(nameof(bytes));}for (int i = 0; i < bytes.Length; i++){if (bytes[i] > 127) return false;//小于127的只有ASCII字符}return true;}static bool IsBIG5(byte[] bytes){string input = Encoding.GetEncoding("BIG5").GetString(bytes);var regex = new Regex("[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|[\xa1-\xfe])");//检查是否都匹配BIG5编码区间return regex.IsMatch(input);}private static bool IsGBK(byte[] bytes){string input = Encoding.GetEncoding("GBK").GetString(bytes);// 正则表达式匹配所有汉字字符var regex = new Regex(@"[\u4E00-\u9FA5]"); // 检查输入字符串中的所有字符是否都匹配GBK编码区间return regex.IsMatch(input);}private static bool IsGB2312(byte[] bytes){string input = Encoding.GetEncoding("GB2312").GetString(bytes);var regex = new Regex(@"[\uB0A1-\uF7FE\u8140-\uA4D0]"); // 检查输入字符串中的所有字符是否都匹配GB2312编码区间return regex.IsMatch(input);}private static bool IsGB18030(byte[] bytes){string input = Encoding.GetEncoding("GB18030").GetString(bytes);var regex = new Regex(@"[\u4E00-\u9FA5\uE7C7-\uE7F3]");// 检查输入字符串中的所有字符是否都匹配GB18030编码区间return regex.IsMatch(input);}

五、获得各种编码的汉字

            Console.WriteLine ("GB2312汉字区 B0-F7,A1-FE");for (int i = 176; i < 248; i++)//GB2312汉字区,首字节 B0-F7, 第二字节 A1-FE{for (int j = 161; j < 255; j++){Console.Write("{0},{1},{2},{3} ", i, j,i.ToString("X")+ j.ToString("X"), GB18030.GetString(new byte[] { (byte)i, (byte)j }).ToString());}Console.Write("\r\n");}Console.WriteLine("");Console.WriteLine("CJK3汉字区 81-A0,40-FE");for (int i = 129; i < 161; i++)//CJK3汉字区 81-A0,40-FE{for (int j = 64; j < 255; j++){Console.Write("{0},{1},{2},{3} ", i, j, i.ToString("X") + j.ToString("X"), GB18030.GetString(new byte[] { (byte)i, (byte)j }).ToString());}Console.Write("\r\n");}Console.WriteLine("");Console.WriteLine("CJK4汉字区 AA-FE,40-FE");for (int i = 170; i < 255; i++)//CJK4汉字区 AA-FE,40-FE{for (int j = 64; j < 161; j++){Console.Write("{0},{1},{2},{3} ", i, j, i.ToString("X") + j.ToString("X"), GB18030.GetString(new byte[] { (byte)i, (byte)j }).ToString());}Console.Write("\r\n");}Console.WriteLine("");Console.WriteLine("BIG5基本汉字区 A4-C6,40-7E");for (int i = 164; i < 199; i++)//BIG5汉字区 A4-C6,40-7E{for (int j = 64; j < 126; j++){Console.Write("{0},{1},{2},{3} ", i, j, i.ToString("X") + j.ToString("X"), BIG5.GetString(new byte[] { (byte)i, (byte)j }).ToString());}Console.Write("\r\n");}Console.WriteLine("");Console.WriteLine("BIG5补充汉字区 C9-F9,40-D5");for (int i = 201; i < 250; i++)//BIG5汉字区 C9-F9,40-D5{for (int j = 64; j < 214; j++){Console.Write("{0},{1},{2},{3} ", i, j, i.ToString("X") + j.ToString("X"), BIG5.GetString(new byte[] { (byte)i, (byte)j }).ToString());}Console.Write("\r\n");}

六、获得各种编码的代码页和名称

            using (StreamWriter writer = new StreamWriter(Application.StartupPath + "\\EncodingCodePage.TXT", false, Encoding.Default)){EncodingInfo[] encodings = Encoding.GetEncodings();writer.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}", "编码代码页", "编码名称", "编码头名称", "编码WEB名称", "Windows系统编码代码页");foreach (var encodingInfo in encodings){Encoding encoding = Encoding.GetEncoding(encodingInfo.CodePage);writer.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}", encodingInfo.CodePage, encodingInfo.Name, encoding.HeaderName, encoding.WebName, encoding.WindowsCodePage);}}

七、程序通过验证

在这里插入图片描述

八、源代码下载

https://download.csdn.net/download/zyyujq/89805828

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

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

相关文章

【在Linux世界中追寻伟大的One Piece】System V共享内存

目录 1 -> System V共享内存 1.1 -> 共享内存数据结构 1.2 -> 共享内存函数 1.2.1 -> shmget函数 1.2.2 -> shmot函数 1.2.3 -> shmdt函数 1.2.4 -> shmctl函数 1.3 -> 实例代码 2 -> System V消息队列 3 -> System V信号量 1 -> Sy…

成都睿明智科技有限公司抖音电商服务靠谱吗?

在这个电商风起云涌的时代&#xff0c;抖音作为短视频直播的超级流量池&#xff0c;正深刻改变着人们的购物习惯。无数商家蜂拥而至&#xff0c;渴望在这片蓝海中找到属于自己的岛屿。而提及抖音电商服务&#xff0c;成都睿明智科技有限公司无疑是一个备受瞩目的名字。那么&…

掌控物体运动艺术:图扑 Easing 函数实践应用

现如今&#xff0c;前端开发除了构建功能性的网站和应用程序外&#xff0c;还需要创建具有吸引力且尤为流畅交互的用户界面&#xff0c;其中动画技术在其中发挥着至关重要的作用。在数字孪生领域&#xff0c;动画的应用显得尤为重要。数字孪生技术通过精确模拟现实世界中的对象…

OpenCV与AI深度学习 | YOLOv11来了:将重新定义AI的可能性

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;YOLOv11来了&#xff1a;将重新定义AI的可能性 Ultralytics YOLOv11的问世标志着人工智能领域&#xff0c;尤其是计算机视觉领域的一个突破性时…

quiz: python网络爬虫之规则1

下面答错了&#xff1a; B c 8A&#xff0c; 9A

大数据-152 Apache Druid 集群模式 配置启动【下篇】 超详细!

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

Golang | Leetcode Golang题解之第440题字典序的第K小数字

题目&#xff1a; 题解&#xff1a; func getSteps(cur, n int) (steps int) {first, last : cur, curfor first < n {steps min(last, n) - first 1first * 10last last*10 9}return }func findKthNumber(n, k int) int {cur : 1k--for k > 0 {steps : getSteps(cu…

MongoDB微服务部署

一、安装MongoDB 1.在linux中拉去MongoDB镜像文件 docker pull mongo:4.4.18 2. 2.创建数据挂载目录 linux命令创建 命令创建目录: mkdir -p /usr/local/docker/mongodb/data 可以在sshclient工具查看是否创建成功。 进入moogodb目录&#xff0c;给data赋予权限777 cd …

交通场景多目标检测系统源码分享

交通场景多目标检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

【机器学习】13-决策树2——决策树生成、剪枝

机器学习13-决策树2——决策树生成、剪枝 数据集划分为子集&#xff0c;构建出一棵树状结构。 文章目录 机器学习13-决策树2——决策树生成、剪枝前言1. 信息增益&#xff08;ID3算法&#xff09;&#xff08;Iterative Dichotomiser 3&#xff09;&#xff1a;选择信息增益最…

Qemu开发ARM篇-7、uboot以及系统网络连接及配置

文章目录 1、uboot及linux版本网络设置1、宿主机虚拟网卡创建2、uboot使用tap0网卡3、启动测试 2、访问外网设置 在上一篇Qemu开发ARM篇-6、emmc/SD卡AB分区镜像制作并通过uboot进行挂载启动中&#xff0c;我们制作了AB分区系统镜像&#xff0c;并成功通过uboot加载kernel以及d…

详解Java中的Collection单列集合(从底层到用法超详细解析和细节分析)

⭕在 Java 中&#xff0c;集合框架是开发过程中最常用的数据结构之一&#xff0c;其中 Collection 接口是整个集合框架的基础。Collection 是处理单列数据的接口&#xff0c;它定义了一些通用的操作&#xff0c;允许对一组对象进行操作。今天我们将深入介绍 Java 中的单列集合 …

docker学习笔记(1.0)

docker命令 下载镜像相关命令 检索&#xff1a;docker search 比如&#xff1a;docker search nginx 是查看有没有nginx镜像 后面的OK表示是不是官方镜像&#xff0c;如果有就是官方镜像&#xff0c;如果没有就是第三方的。 下载&#xff1a;docker pull 比如&#xff1a…

【09】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-Class类基础全解(属性、方法、继承复用、判断)

序言&#xff1a; 本文详细讲解了关于我们在程序设计中所用到的class类的各种参数及语法。 笔者也是跟着B站黑马的课程一步步学习&#xff0c;学习的过程中添加部分自己的想法整理为笔记分享出来&#xff0c;如有代码错误或笔误&#xff0c;欢迎指正。 B站黑马的课程链接&am…

Windows开发工具使用技巧

在 Windows 上进行开发时&#xff0c;有许多工具和技巧可以提升开发效率和用户体验。以下是一些常用的开发工具和技巧&#xff1a; 常用开发工具 1. Visual Studio Code (VS Code) - 插件管理&#xff1a;利用扩展市场&#xff08;Extension Marketplace&#xff09;安装各种…

centos磁盘逻辑卷LVM创建

centos磁盘逻辑卷LVM创建 一、磁盘逻辑卷LVM说明二、centos磁盘使用情况三、LVM安装指南1.LVM工具安装1. yum list lvm2. yum search lvm3. yum search pvcreate4. yum list lvm25. yum install lvm2 2.创建物理卷2.1磁盘情况查看2.2创建物理卷&#xff08;PV&#xff09; 3.创…

【CKA】一、基于角色的访问控制-RBAC

1、基于角色的访问控制-RBAC 1. 考题内容&#xff1a; 2. 答题思路&#xff1a; 这道题就三条命令&#xff0c;建议直接背熟就行。 也可以查看帮助 kubectl create clusterrole -h kubectl create serviceaccount -h kubectl create rolebinding -h 注意&#xff1a; 1、资…

windows 桌面采集音频

头文件&#xff1a; #ifndef __CAPTURE_AUDIO__ #define __CAPTURE_AUDIO__#include <functional> #include <windows.h> #pragma comment(lib, "winmm.lib")class CaptureAudio { public:CaptureAudio();~CaptureAudio();public:bool Init(const std::…

uniapp中uni.request的统一封装 (ts版)

文章目录 前言一、我们为什么要去封装&#xff1f;二、具体实现1.创建一个请求封装文件&#xff1a;2.封装 uni.request&#xff1a;3.如何去使用&#xff1f; 总结 前言 在uniapp中如何去更简洁高效的发送我们的请求&#xff0c;下面就介绍了uni.request()二次封装。 一、我们…

C++ | Leetcode C++题解之第446题等差数列划分II-子序列

题目&#xff1a; 题解&#xff1a; class Solution { public:int numberOfArithmeticSlices(vector<int> &nums) {int ans 0;int n nums.size();vector<unordered_map<long long, int>> f(n);for (int i 0; i < n; i) {for (int j 0; j < i;…