qt初入门6:QChar和QString相关接口练习

简单了解编码:
​ latin1(ISO 8859-1)字符集是对ASCII基本字符集的扩展,都是1字节编码。
Unicode编码有多重存储方案,utf-8使用1~4字节编码,最少1字节;utf-16使用2-4字节编码,最少2字节。

主要练习Qchar,QString,Qstring和数值的转换,以及资源文件的加载和显示居中处理。

QChar主要练习一下unicode编码,和ASCII字符串编码c字符的转换。

QString字符串主要练习不同编码形式的初始化,除了静态直接初始化,也有对应成员初始化,以及常用的成员函数。

加载资源文件,spinbox控件练习,文本控制居中练习。

1:QChar练习

1.1 主要关注QChar的字符编码,初始化,以及和正常字符的转换。

//简单整理Qchar相关知识 QChar占两个字节,主要表示unicode字符,需要知道ascii,ISO-8859-1 (Latin1) 和uncode字符之间的转换
//其他的QChar相关静态函数和成员函数都是基础使用 比较,判空白字符,转大小写,数字字母等
void Widget::on_pbn_qchar_clicked()
{//首先是基础的QChar的用法练习,初始化可以参考构造函数//QChar类表示一个Unicode字符, 即可以存汉字, 占用字节大小也可以QString str = "hello, 北京";
//    QChar dst0('青'); //高版本的应该可以这样初始化QString dst = "青岛";QChar dst0 = dst[0];QChar dst1 = dst[1].unicode(); //可以直接用对应的unicode初始化 比如dst[1].unicode()ui->pte_Display->setPlainText(dst +QString::asprintf("\t对应的Unicode编码 = 0x%X  0x%X。", dst0.unicode(), dst1.unicode()));//验证Qchar占用两个字节,但是实际上转成unicode字符,汉字才是两个字节for(short int i=0; i<str.size(); i++){QChar ch = str.at(i);char16_t unicode = ch.unicode();  //获取QChar字符的UTF-16编码值ui->pte_Display->appendPlainText(QString(ch)+"\t大小:"+QString::number(sizeof (ch))+QString::asprintf("\tunicode编码:0x%X",unicode));}//QChar使用utf-16处理字符,可以标识unicode字符,练习字符之间的转换QChar chP = QChar::fromLatin1('P'); //Latin1:ISO-8859-1 8位扩展的ASCII
//    QChar chTest = QChar::fromUcs2(0x5C9B);   //'岛' qt6的版本可用?ui->pte_Display->appendPlainText("QChar \""+QString(chP)+"\"转成ASCII字符:"+QChar(chP.toLatin1()));
}

1.2:demo运行结果

在这里插入图片描述

2:QString联系

2.1 :QString的不同初始化

void Widget::on_pbn_qstring_clicked()
{//涉及不同的编码,所以这里简单了解一下QString不同编码的初始化方式,然后都有对应的转换方法QString str = "";//fromCFString 没了解过CFStringRef 不考虑//fromLocal8Bit 是本地Gb字符集转unicode   QString默认是Unicode//主要用于外部传入的文件  字符数组 这里一般提前知道对应字符的编码方式QString src_str = "你好";QByteArray data_qbytearr = src_str.toLocal8Bit();QString str_qbytearr = QString::fromLocal8Bit(data_qbytearr);QString str_char = QString::fromLocal8Bit(data_qbytearr.data(), data_qbytearr.size());ui->pte_Display->setPlainText("fromLocal8Bit QByteArray转qstring:"+str_qbytearr);ui->pte_Display->appendPlainText("fromLocal8Bit str_char转qstring:"+str_char);QString src_str1 = "你好";char data_char[20] = {0}; //这里本来想直接用char* 发现有异常memcpy(data_char, src_str1.toLocal8Bit().data(), strlen(src_str1.toLocal8Bit().data()));str_char = QString::fromLocal8Bit(data_char, strlen(data_char));ui->pte_Display->appendPlainText("fromLocal8Bit str_char转qstring:"+str_char);//fromLatin1 主要就是字符到QString的转换了  我的理解是一般就是我们理解的ASCIIdata_qbytearr.clear();data_qbytearr.push_back("hello,world;");str_qbytearr = QString::fromLatin1(data_qbytearr); //反转可以用std::string str_std = str_qbytearr.toLatin1().toStdString();ui->pte_Display->appendPlainText("QString转std::string:"+QString(str_std.c_str()));str_char = QString::fromLatin1(data_qbytearr.data(),data_qbytearr.size());ui->pte_Display->appendPlainText("fromLatin1 QByteArray转qstring:"+str_qbytearr);ui->pte_Display->appendPlainText("fromLatin1 str_char转qstring:"+str_char);//fromNSString 是其他平台上的接口//fromRawData 这个用法感觉用不到  参考手册demo了static QChar std_unicode[] = { 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x9752, 0x5c9b};//Hello,青岛int size = sizeof(std_unicode) / sizeof(QChar);QString qstr_dst = QString::fromRawData(std_unicode, size);ui->pte_Display->appendPlainText("fromRawData QChar*转qstring:"+qstr_dst +"size:"+QString::number(size));//打印地址的练习qDebug()<<"addr :"<<qPrintable(qstr_dst); //qPrintable 将QString转换成char*字符串而已qDebug("Address of QChar array: %p", qstr_dst.data());qDebug("Address of QChar array: %p", reinterpret_cast<void*>(std_unicode));std_unicode[0] = 0x9752;//如果修改了Qchar中的值  QString中并未改变ui->pte_Display->appendPlainText("fromRawData QChar*转qstring:"+qstr_dst +"size:"+QString::number(size));const char* std_str_test = "test std::string";ui->pte_Display->appendPlainText("fromStdString std::string转qstring:"+QString::fromStdString(std_str_test));std::u16string u16str = u"Hello, 世界";ui->pte_Display->appendPlainText("fromStdU16String std::u16string转qstring:"+QString::fromStdU16String(u16str));std::u32string u32str = U"Hello, 世界";ui->pte_Display->appendPlainText("fromStdU32String std::u32string转qstring:"+QString::fromStdU32String(u32str));std::wstring wstr = L"Hello, 世界";ui->pte_Display->appendPlainText("fromStdWString std::wstring转qstring:"+QString::fromStdWString(wstr));//UTF-32unsigned int ucs4[] = {0x0048, 0x0065, 0x006c, 0x006c, 0x006f,0x002c, 0x0020, 0x4e16, 0x754c}; // "Hello, 世界" in UCS-4ui->pte_Display->appendPlainText("fromUcs4 utf-32转qstring:"+QString::fromUcs4(ucs4, sizeof(ucs4) / sizeof(unsigned int)));const char* utf8char = "\xe4\xbd\xa0\xe5\xa5\xbd";  // UTF-8编码的字符串 你好ui->pte_Display->appendPlainText("fromUtf8 utf-8转qstring:"+QString::fromUtf8(utf8char, strlen(utf8char)));const char16_t * utf16char = u"你好";int u16size = 0;while (utf16char[u16size] != u'\0') {++u16size;}ui->pte_Display->appendPlainText("fromUtf16 utf-16转qstring:"+QString::fromUtf16(utf16char, u16size));wchar_t* wideStr = L"Hello, 你好!"; // 宽字符字符串
//    QString dst111;
//    dst111.toWCharArray(wideStr);  //成员函数也可以ui->pte_Display->appendPlainText("fromWCharArray wchar_t转qstring:"+QString::fromWCharArray(wideStr, wcslen(wideStr)));//字符串比较 localeAwareCompareqstrFunc();
}

2.2:常用接口练习

contains包含,fill填充, push_back,push_front,prepend,insert插入,replace修改,chop删空格,QStringRef只读引用

//简单字符串操作函数整理
void Widget::qstrFunc()
{QString qstr = "hello, world! 主要测试qString的一些常用函数。";QString qstr_st = "hello, world!";QString qstr_ed = "函数。";if(qstr.contains(qstr_st)) //第二个参数大小写敏感或者不敏感,以及其他的重载函数可以研究{ui->pte_Display->appendPlainText(qstr +"中包含字符串:"+qstr_st);}if(!qstr_st.contains(qstr_ed)) //第二个参数大小写敏感或者不敏感,以及其他的重载函数可以研究{ui->pte_Display->appendPlainText(qstr_st +"中不包含字符串:"+qstr_ed);}ui->pte_Display->appendPlainText(qstr_st +"字符串个数:"+QString::number(qstr_st.count()));ui->pte_Display->appendPlainText("endsWith测试:"+ QString((qstr.endsWith(qstr_ed))?"true":"false"));ui->pte_Display->appendPlainText("startsWith测试:"+ QString((qstr.startsWith(qstr_st))?"true":"false"));QString qstr_fill;qstr_fill.fill(QChar('P'), 5);ui->pte_Display->appendPlainText("fill填充测试:"+ qstr_fill);qstr_fill = "PXYZE";ui->pte_Display->appendPlainText(qstr_fill+"字符串front 测试:"+ qstr_fill.front());ui->pte_Display->appendPlainText(qstr_fill+"字符串back 测试:"+ qstr_fill.back());if(qstr_fill.front() == QChar('P')){qstr_fill.remove(0,1);}ui->pte_Display->appendPlainText(qstr_fill+"字符串remove 测试:"+ qstr_fill);qstr_fill.push_back('D');qstr_fill.prepend("prepend");qstr_fill.push_front("F");qstr_fill.insert(0, "Insert"); //简单测试,可以参考对应重载函数qstr_fill.replace(0,3,"res");ui->pte_Display->appendPlainText("字符串插入测试:"+ qstr_fill);ui->pte_Display->appendPlainText(qstr_fill+"字符串indexof(prepend)测试:"+ QString::number(qstr_fill.indexOf("prepend")));ui->pte_Display->appendPlainText(qstr_fill+"字符串lastIndexOf(prepend)测试:"+ QString::number(qstr_fill.lastIndexOf("prepend")));ui->pte_Display->appendPlainText(qstr_fill+"字符串对齐测试:"+ qstr_fill.leftJustified(8, '_'));ui->pte_Display->appendPlainText(qstr_fill+"字符串left截断字符测试:"+ qstr_fill.left(5));ui->pte_Display->appendPlainText(qstr_fill+"字符串right截断测试:"+ qstr_fill.right(5));QString qstr_simplified= "  hello,  my  test!  ";ui->pte_Display->appendPlainText(qstr_simplified+"字符串去除 头尾空格并合并多个空格测试:"+ qstr_simplified.simplified());ui->pte_Display->appendPlainText(qstr_simplified+"长度:"+ QString::number(qstr_simplified.size())+" "+QString::number(qstr_simplified.capacity())+QString::number(qstr_simplified.count()));qstr_simplified.shrink_to_fit(); //压缩空间  在QString中好像没啥用ui->pte_Display->appendPlainText(qstr_simplified+"压缩后长度:"+ QString::number(qstr_simplified.size())+" "+QString::number(qstr_simplified.capacity())+QString::number(qstr_simplified.count()));qstr_simplified = "hello,mytest!";qstr_simplified.chop(2); //移出最后两个字符ui->pte_Display->appendPlainText(qstr_simplified+"字符串chop去除最后两个字符测试:"+ qstr_simplified+"   chopped 测试:"+qstr_simplified.chopped(2) );qstr_simplified.replace(0,3,"DDDD");//从0开始3个字符替换为DDDD  可以参考其他重载函数ui->pte_Display->appendPlainText(qstr_simplified+"字符串 replace测试:"+ qstr_simplified);//left  right  以及引用测试qstr_simplified = "hello,mytest!";ui->pte_Display->appendPlainText(qstr_simplified+"字符串 left测试:"+ qstr_simplified.left(5));ui->pte_Display->appendPlainText(qstr_simplified+"字符串 right测试:"+ qstr_simplified.right(5));QStringRef qstr_ref = qstr_simplified.midRef(3, 4);QStringRef qstr_ref1 =  qstr_simplified.rightRef(5);QStringRef qstr_ref2 =  qstr_simplified.leftRef(5);ui->pte_Display->appendPlainText(qstr_simplified+"字符串 引用测试:"+qstr_ref +" "+ qstr_ref1 +" "+qstr_ref2);//QStringRef 是QString的只读引用   使用时确保源QString不会变qstr_simplified.replace(qstr_simplified.size()-3, 2, "OO");ui->pte_Display->appendPlainText("字符串 引用测试:"+ qstr_simplified + " "+qstr_ref1); //引用也发生 变化了
}

2.3:demo运行结果

在这里插入图片描述

2.4:QString和数值之间的转换

和整数十进制,二进制,十六进制的转换;

和浮点数的转换,以及设置位数。

以及arg成员函数,asprintf,vasprintf

//为测试vasprintf  构造对应的参数 va_list
QString fun(char* msg,...){va_list ap;va_start(ap, msg);QString buf = QString::vasprintf(msg, ap);va_end(ap);return buf;
}
//简单整理QString和数值转换相关知识
void Widget::on_pbn_strnum_clicked()
{QString qstr = QString::asprintf("asprintf 测试:%d %s.", 2, "test");ui->pte_Display->setPlainText("asprintf测试:"+qstr);char fmt[] = "vasprintf 测试:%d %s.";ui->pte_Display->appendPlainText("vasprintf测试:"+fun(fmt, 2,"test"));ui->pte_Display->appendPlainText("arg测试:"+QString("arg 测试 %1 %2 %3").arg(int(1)).arg(ushort(2)).arg(QString("test")));
//    qstr.squeeze();  //QString用不到  释放不用内存qstr = "hello,test!";QString qstr_swap;qstr_swap.swap(qstr);ui->pte_Display->appendPlainText("swap测试: src:"+qstr+" dst:"+qstr_swap);qstr.resize(5, 'A');ui->pte_Display->appendPlainText("resize测试: "+qstr +" size:"+QString::number(qstr.size())+" "+QString::number(qstr.capacity())+" "+QString::number(qstr.length()));qstr.reserve(10);ui->pte_Display->appendPlainText("reserve测试: "+qstr+" size:"+QString::number(qstr.size())+" "+QString::number(qstr.capacity())+" "+QString::number(qstr.length()));ui->pte_Display->appendPlainText("isEmpty测试: "+QString(qstr.isEmpty()?"true":"false"));ui->pte_Display->appendPlainText("isNull测试: "+QString(qstr.isNull()?"true":"false"));ui->pte_Display->appendPlainText("isLower测试: "+QString(qstr.isLower()?"true":"false"));ui->pte_Display->appendPlainText("isUpper测试: "+QString(qstr.isUpper()?"true":"false"));ui->pte_Display->appendPlainText("isRightToLeft测试: "+QString(qstr.isRightToLeft()?"true":"false"));//简单测试一下迭代器遍历QString::const_iterator itr =  qstr.begin();while(itr!=qstr.end()){qDebug()<<"qstr:"<<*itr;++itr;}//字符串和数值的转换  setnum 或者arg   QString::number  asprintf  vasprintfQString qstr_num;int int_num = 0;bool ok = false;qstr_num.setNum(18, 10);ui->pte_Display->appendPlainText("setNum 十进制测试: "+qstr_num);int_num = qstr_num.toInt(&ok);ui->pte_Display->appendPlainText("toInt 十进制测试: "+QString::number(int_num));qstr_num.setNum(18, 2);ui->pte_Display->appendPlainText("setNum 二进制测试: "+qstr_num);int_num = qstr_num.toInt(&ok,2);ui->pte_Display->appendPlainText("toInt 二进制测试: "+QString::number(int_num));qstr_num.setNum(18, 16);ui->pte_Display->appendPlainText("setNum 十六进制测试: "+qstr_num);int_num = qstr_num.toInt(&ok, 16);ui->pte_Display->appendPlainText("toInt 十六进制测试: "+QString::number(int_num));//setnum处理浮点数double  num= 1245.2783;qstr_num.setNum(num,'f',5); //小数点后5位, str= "1245.27830"ui->pte_Display->appendPlainText("setNum 浮点数小数点后5位测试: "+qstr_num);qstr_num.setNum(num,'E',5);ui->pte_Display->appendPlainText("setNum 浮点数小数点后5位测试: "+qstr_num);qstr_num.setNum(num,'g',5);ui->pte_Display->appendPlainText("setNum 整数小数共5位测试: "+qstr_num);qstr_num.setNum(num,'g',3);ui->pte_Display->appendPlainText("setNum 整数小数共3位测试: "+qstr_num);//字符串转数值float float_num = qstr_num.toFloat(&ok);ui->pte_Display->appendPlainText("toFloat 字符串转浮点数测试: "+QString::number(float_num));//其他static QChar std_unicode[] = { 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x2c, 0x9752, 0x5c9b};//Hello,青岛int size = sizeof(std_unicode) / sizeof(QChar);qstr_num.setRawData(std_unicode, size);ui->pte_Display->appendPlainText("setRawData 测试: "+qstr_num);qstr_num.setUnicode(qstr.unicode(), qstr.size());ui->pte_Display->appendPlainText("setUnicode 测试: "+qstr_num);const ushort  utf16char[] = {0x0048, 0x0065, 0x006C, 0x006C, 0x006F, 0x0020, 0x0057, 0x006F, 0x0072, 0x006C,0x0064, 0};int u16size = 0;while (utf16char[u16size] != u'\0') {++u16size;}ushort *data1 = const_cast<ushort*>(utf16char);qstr_num.setUtf16(data1, u16size);ui->pte_Display->appendPlainText("setUtf16 测试: "+qstr_num);
}

2.5:demo运行结果(居中显示)

在这里插入图片描述

3:spinbox的练习

3.1:简单练习数值转换:

void Widget::init()
{//这里spinbox相关设置字体 长宽 等各种函数可以探索ui->spinbox_bin->setStepType(QAbstractSpinBox::AdaptiveDecimalStepType); //自适应步长ui->spinbox_bin->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed); //水平扩展,垂直固定ui->spinbox_bin->setRange(0, 65535);ui->spinbox_dec->setRange(0, 65535);ui->spinbox_hex->setRange(0, 65535);ui->spinbox_bin->setDisplayIntegerBase(2);ui->spinbox_dec->setDisplayIntegerBase(10);ui->spinbox_hex->setDisplayIntegerBase(16);ui->spinbox_dec->setValue(10);
}void Widget::on_spinbox_hex_valueChanged(int arg1)
{ui->spinbox_bin->setValue(arg1);ui->spinbox_dec->setValue(arg1);
}

3.2:demo运行结果

在这里插入图片描述

4:处理居左,居中,居右显示

void Widget::on_pbn_left_clicked()
{ui->spinbox_bin->setAlignment(Qt::AlignLeft);//使用时Qt版本比较低  qt6可以用setAlignment吧QTextDocument *doc = ui->pte_Display->document();doc->setDefaultTextOption(QTextOption(Qt::AlignLeft));ui->pte_Display->setDocument(doc);
}void Widget::on_pbn_center_clicked()
{ui->spinbox_bin->setAlignment(Qt::AlignCenter);QTextDocument *doc = ui->pte_Display->document();doc->setDefaultTextOption(QTextOption(Qt::AlignCenter));ui->pte_Display->setDocument(doc);
}void Widget::on_pbn_right_clicked()
{ui->spinbox_bin->setAlignment(Qt::AlignRight);QTextDocument *doc = ui->pte_Display->document();doc->setDefaultTextOption(QTextOption(Qt::AlignRight));ui->pte_Display->setDocument(doc);
}

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

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

相关文章

数据湖技术之发展现状篇

一. 大数据处理架构&#xff1a; 大数据处理架构的发展过程具体可以分为三个主要阶段&#xff1a;批处理架构、混合处理架构&#xff08;Lambda、Kappa架构&#xff09;、湖仓一体。首先是随着Hadoop生态相关技术的大量应用&#xff0c;批处理架构应运而生&#xff0c;借助离线…

Python在无人飞天航母

Python在无人飞天航母研发开发中发挥着重要的作用。无人飞天航母是一种未来战争装备&#xff0c;可以完成各种任务&#xff0c;包括反潜、侦查、打击、支援等。Python作为一种高级编程语言&#xff0c;具有以下重要性&#xff1a; 快速原型开发&#xff1a;Python具有简洁的语法…

中国新能源汽车持续跑出发展“加速度”,比亚迪迎来向上突破

2023年已经过去&#xff0c;对于汽车圈而言&#xff0c;2023年是中国车市的分水岭&#xff0c;在这一年&#xff0c;中国汽车工业70年以来首次进入全球序列&#xff0c;自主品牌强势霸榜&#xff0c;销量首次超过合资车。要知道&#xff0c;这是自大众于1984年进入中国市场成立…

sql server 2008 安装问题

1、sql server 2008 安装程序支持文件后安装界面就消失&#xff1a; 打开cmd以管理员身份运行 复制或者手动输入以下命令&#xff1a;secedit /configure /cfg %windir%\inf\defltbase.inf /db defltbase.sdb /verbose运行完成后&#xff0c;重新安装 卸载需删除注册表这几个…

【面试】测试开发面试题

帝王之气&#xff0c;定是你和万里江山&#xff0c;我都护得周全 文章目录 前言1. 网络原理get与post的区别TCP/IP各层是如何传输数据的IP头部包含哪些内容TCP头部为什么有浮动网络层协议1. 路由协议2. 路由信息3. OSPF与RIP的区别Cookie与Session&#xff0c;Token的区别http与…

计算方法实验1:熟悉MATLAB 环境

一、问题描述 熟悉MATLAB 环境。 二、实验目的 了解Matlab 的主要功能&#xff0c;熟悉Matlab 命令窗口及文件管理&#xff0c;Matlab 帮助系统。掌握命令行的输入及编辑&#xff0c;用户目录及搜索路径的配置。了解Matlab 数据的特点&#xff0c;熟悉Matlab 变量的命名规则&a…

Android 基础技术——m3u8格式与mp4格式的区别

笔者希望做一个系列&#xff0c;整理 Android 基础技术&#xff0c;本章是关于 m3u8格式与mp4格式的区别 m3u8是苹果公司推出的视频播放标准&#xff0c;是m3u的一种&#xff0c;只是编码格式采用的是UTF-8。 m3u8准确来说是一种索引文件&#xff0c;使用m3u8文件实际上是通过它…

什么是Java中的NIO?NIO与IO有什么区别?

什么是Java中的NIO&#xff1f;NIO与IO有什么区别&#xff1f; Java NIO&#xff0c;全称New IO&#xff0c;是Java 1.4版本中引入的一种新的IO处理方式。NIO与IO虽然有相同的作用和目的&#xff0c;但实现方式却大不相同。在传统的IO中&#xff0c;数据读取和写入是以字节流或…

MAVEN(1)

分模块开发与设计 分模块开发意义 将原始模块按照功能拆分成若干个子模块&#xff0c;方便模块间相互调用&#xff0c;接口共享 步骤示例 这里以之前开发的SpringMVC_ssm中的domain模块为例 第一步、创建Maven模块 父项改为none&#xff0c;文件存储位置需要做出相应调整 …

Android App开发-简单控件(3)——常用布局

3.3 常用布局 本节介绍常见的几种布局用法&#xff0c;包括在某个方向上顺序排列的线性布局&#xff0c;参照其他视图的位置相对排列的相对布局&#xff0c;像表格那样分行分列显示的网格布局&#xff0c;CommonLayouts以及支持通过滑动操作拉出更多内容的滚动视图。 3.3.1 线…

flink源码分析 - 简单解析命令行参数

flink版本: flink-1.11.2 提取主类代码位置: org.apache.flink.api.java.utils.MultipleParameterTool#fromArgs 代码逻辑比较简单&#xff0c;此处不再赘述&#xff0c;在此记录方便后续使用 完整代码: /** Licensed to the Apache Software Foundation (ASF) under one* o…

浅聊 DNS 和 host

我们先来了解一下访问一个网站的基本流程 我们访问一个网站&#xff0c;自然就是访问网站的服务器&#xff0c;但是访问一个网站的服务器&#xff0c;自然要知道它的地址&#xff0c;服务器的地址就是一串数字&#xff0c;如 也就是我们说的 ip 地址&#xff0c;输入 i…

Redis的数据类型

目录 string 1.编码方式 2.应用场景 3.常用命令 hash 1.编码方式 2.应用场景 3.常用命令 list 1.编码方式 2.应用场景 3.常用命令 set 1.编码方式 2.应用场景 3.常用命令 zset 1.编码方式 2.应用场景 3.常用命令 如何理解Redis的编码方式 embs…

MySQL设计开发使用规范

数据库设计 库名 【强制】库的名称格式: 业务系统名称、业务系统名称子系统名。如: aimall , aimall_op【强制】创建数据库时必须显式指定字符集,并且字符集只能是是utf8或者utf8mb4【建议】库的名称必须控制在20个字符以内【强制】单实例表个数必须控制在2000个以内【强制】…

以太网交换基础VLAN原理与配置

目录 7.以太网交换基础 7.1.以太网协议 7.2.以太网帧介绍 7.3.以太网交换机 7.4.同网段数据通信全过程 8.VLAN原理与配置 8.1.VLAN的基本概念 8.2.VLAN的应用 7.以太网交换基础 7.1.以太网协议 以太网是当今现有局域网(Local Area Network,LAN)采用的最通用的通信协议…

Linux进程间通信方法和代码示例

Linux进程间通信&#xff08;IPC, Inter-Process Communication&#xff09;包括了多种不同的技术&#xff0c;例如管道&#xff08;pipe&#xff09;、信号&#xff08;signal&#xff09;、共享内存&#xff08;shared memory&#xff09;、消息队列&#xff08;message queu…

SpringBoot自定义全局异常处理器

文章目录 一、介绍二、实现1. 定义全局异常处理器2. 自定义异常类 三、使用四、疑问 一、介绍 Springboot框架提供两个注解帮助我们十分方便实现全局异常处理器以及自定义异常。 ControllerAdvice 或 RestControllerAdvice&#xff08;推荐&#xff09;ExceptionHandler 二、…

Python第 1 课 Python 介绍与安装

文章目录 第 1 课 Python 介绍与安装1.Python介绍1.1 面向对象概述1.2 Python 概述1.3 Python 特点 2.查看Python3.pyCharm 安装方法3.1 下载 pyCharm3.2 打开 pyCharm3.3 汉化 pyCharm3.4 pyCharm 的基本介绍和基本使用方法 第 1 课 Python 介绍与安装 1.Python介绍 1.1 面向…

Python爬虫库推荐

很多人学Python&#xff0c;都是从爬虫开始的&#xff0c;毕竟网上类似的资源很丰富&#xff0c;开源项目也非常多。 Python学习网络爬虫主要分3个大的版块&#xff1a; 抓取 &#xff0c; 分析 &#xff0c; 存储 当我们在浏览器中输入一个url后回车&#xff0c;后台会发生什…

消息中间件之八股面试回答篇:三、RabbitMQ如何解决消息堆积问题(100万条消息堆积)+RabbitMQ高可用性和强一致性机制+回答模板

RabbitMQ中的消息堆积问题 当生产者发送消息的速度超过了消费者处理消息的速度&#xff0c;就会导致队列中的消息堆积&#xff0c;直到队列存储消息达到上限。之后发送的消息就会成为死信&#xff0c;可能会被丢弃&#xff0c;这就是消息堆积问题。 解决消息堆积有三种种思路…