这个需求是源于使用LATEX排版中文时出现的。CJK宏包对中文字体的支持比较麻烦,已经不再推荐使用,但是,一些老项目还在用,不想动它。CJK自带的UTF-8编码字体gbsn和gkai只包含GB2312字符集,这就导致有些生僻字会出现无法显示的情况。对于一些检测报告,要是姓名有生僻字没有显示出来的话,这会导致很严重的后果。所以想要有个预警机制,判断姓名里面是否包含生僻字,也就是判断一个汉字是否在GB2312汉字编码字符集里面。iconv函数用于在不同字符编码之间进行转换,可将一个字符串从一种字符编码转换成另一种字符编码,比如将UTF-8编码的字符串转换成GBK编码的字符串。错误控制运算符@将屏蔽iconv函数可能产生的notice提示。实现代码<?php function isGB2312($char) { if (@iconv('UTF-8', 'GB2312', $char)) { echo $char . ":在GB2312里面\n"; } else { echo $char . ":不在GB231
Socket简称套接字,是进程之间通信的一个工具,进程之间想要进行网络通信需要Socket。Socket负责进程之间的网络数据传输,好比数据的搬运工。服务端开发import socket # 创建socket对象 socket_server = socket.socket() # 绑定IP和端口 socket_server.bind(("localhost", 8888)) # 监听端口,listen方法接收一个整数参数,表示接收的连接数量 socket_server.listen(1) # 等待客户端连接,accept是个阻塞方法 print("等待客户端连接...") conn, address = socket_server.accept() print(f"接收到客户端连接,信息是:{address}") while True: # 接收客户端信息,recv接收的参数是缓冲区大小,recv返回值是bytes对象 data = conn.recv(1024).decode("UTF-8&qu
数据容器可以从以下视角进行简单分类:是否支持下标索引支持:列表、元组、字符串 - 序列类型不支持:集合、字典 - 非序列类型是否支持重复元素支持:列表、元组、字符串 - 序列类型不支持:集合、字典 - 非序列类型是否可以修改支持:列表、集合、字典不支持:元组、字符串通用操作这5类数据容器都支持for循环遍历。通用方法len(容器):统计元素个数max(容器),min(容器):统计最大、最小元素通用转换功能list(容器):转换为列表str(容器):转换为字符串tuple(容器):转换为元组set(容器):转换为集合通用排序功能sorted(容器, reverse=True)将给定容器进行排序,reverse=True表示降序。
跨域问题CORS(Cross-Origin Resource Sharing,跨源资源共享),也叫跨域资源共享,是一种基于HTTP头的机制,该机制通过允许服务器标示除了它自己以外的其他源(域、协议或端口),使得浏览器允许这些源访问加载自己的资源。出现跨域问题的主要原因是同源策略的限制。同源策略是浏览器的一种安全策略,是浏览器的行为,而且只针对fetch、xhr请求。只要协议、主机、端口之一不一致,就不同源。响应头解决要实现CORS很简单,只需在服务端添加响应头:Access-Control-Allow-Origin: *代理解决前端服务器若是用express的话,只需安装一个插件:npm i http-proxy-middleware --save-dev,然后在express服务器启动代码中加入:import {createProxyMiddleware} from 'http-proxy-middleware' // ... app.use('/api', createProxyMiddleware({ target: 'http://localhost:8080', chan
template标签是HTML5中引入的一种新标签,用于定义可复制的模板。它允许在文档中定义一段包含HTML结构的模板,但不会在页面加载时显示其内容,加载后通过使用JavaScript来显示它。实例<!DOCTYPE html> <html lang="zh-CN"> <head> <style> .title { margin-bottom: 10px; font-size: 30px; color: #333; text-align: center; } .row { background-color: #fff; display: flex; justify-content: center; } .col { border: 1px solid #f0f0f0; width: 15%;
核心步骤子组件中:props通过value接收,事件触发input父组件中:v-model给组件直接绑数据src\components\BaseSelect.vue文件:<template> <div> <select :value="value" @change="handleChange"> <option value="101">北京</option> <option value="102">上海</option> <option value="103">广州</option> <option value="104">深圳</option> </select> </div> </template> <script>
非父子组件通信事件总线非父子组件之间,进行简易消息传递,可以使用事件总线(Event Bus)。使用步骤:创建一个都能访问的事件总线(空Vue实例,放到utils/EventBus.js)A组件(接收方)监听Bus实例的事件(订阅消息)B组件(发送方)触发Bus实例的事件(发布消息)src\utils\EventBus.js文件:// 1. 创建一个都能访问的事件总线(空Vue实例) import Vue from 'vue' const Bus = new Vue() export default Bussrc\components\BaseA.vue文件:<template> <div> A组件(接收方) <p>{{ msg }}</p> </div> </template> <script> import Bus from '../utils/EventBus' export default { created() { // 2. A组件(接收方)监听Bu
Vue CLI是Vue官方提供的一个全局命令工具。可以快速创建一个开发Vue项目的标准化基础架子,集成了webpack配置。使用脚手架的好处是:开箱即用,零配置内置babel等工具标准化使用步骤全局安装脚手架:npm i -g @vue/cli查看版本:vue --version创建项目架子:vue create vue-demo,不喜欢用命令行界面创建项目的话,可通过图形化界面向导来创建项目:vue ui启动项目:cd vue-demo然后npm run serve修改配置webpack文档地址:https://webpack.js.org/configuration/dev-server/修改vue.config.js文件:const { defineConfig } = require('@vue/cli-service') module.exports = defineConfig({ transpileDependencies: true, devServer: { port: 8080, // 修改端口 // 添加代理 proxy: {
Vue生命周期过程中,会自动运行一些函数,被称为生命周期钩子,让开发者可以在特定阶段运行自己的代码。创建阶段(准备数据)beforeCreate()、created()挂载前阶段(渲染模板)beforeMount()、mounted()更新阶段beforeUpdate()、updated()卸载阶段beforeDestroy()、destroyed()
NVMNode Version Manager是Node.js版本管理器,可以轻松地在不同的Node.js版本之间进行切换。通过它可以安装和切换不同版本的Node.js,为了解决Node.js各种版本存在不兼容现象可以通过它安装和切换不同版本。官网:https://github.com/nvm-sh/nvmWindow安装NVM for Windows:https://github.com/coreybutler/nvm-windows/到官网下载nvm-steup.exe,双击运行安装。使用查看当前使用的Node.js版本:nvm current。查看所有Node.js版本,*表示当前使用的版本:nvm ls。查看可安装列表:nvm list available。设置国内镜像设置npm_mirror:nvm npm_mirror https://npmmirror.com/mirrors/npm/。设置node_mirror:nvm node_mirror https://npmmirror.com/mirrors/node/。安装Node.js版本安装最新稳定版:nvm insta
设计模式一个问题通常有n种解法,其中肯定有一种解法是最优的,这个最优的解法被人总结出来了,称之为设计模式。设计模式有20多种,对应20多种软件开发中会遇到的问题。单例模式确保一个类只有一个对象。写法:把类的构造器私有定义一个类变量记住类的一个对象定义一个类方法,返回对象Python实现a.py文件:class Tools: pass tool = Tools()b.py文件:from a import tool t1 = tool t2 = tool print(t1) print(t2)工厂模式当需要大量创建一个类的实例的时候,可以使用工厂模式。即,从原生的使用类的构造去创建对象的形式,迁移到,基于工厂提供的方法去创建对象的形式。Python实现class Person: pass class Teacher(Person): pass class Student(Person): pass class Factory: def get_person(self, p_type): if p_type == "
Bootstrap是美国Twitter公司的设计师Mark Otto和Jacob Thornton合作基于HTML、CSS、JavaScript开发的简洁、直观、强悍的前端开发框架,使得Web开发更加快捷。用Bootstrap构建快速、响应式布局的网站。它提供的功能包括:基于Sass进行编译和定制、内置的网格系统和组件、强大的JavaScript插件等。Bootstrap中文网:https://www.bootcss.com/Bootstrap v5已经不依赖jQuery了。下载下载Bootstrap生产文件:https://v5.bootcss.com/docs/getting-started/download/布局断点断点(Breakpoints)是响应式设计的组成部分。通过断点可以控制何时可以在特定视口(viewport)或设备尺寸下调整布局。断点类标识尺寸Extra smallNone<576pxSmallsm≥576pxMediummd≥768pxLargelg≥992pxExtra largexl≥1200pxExtra extra largexxl≥1400px容器
简介LESS是一个CSS预处理器,文件后缀是less。扩充了CSS语言,使CSS具备一定的逻辑性、计算能力。注意: 浏览器不识别LESS代码,目前阶段,网页要引入对应的CSS文件。使用VS Code插件:Easy LESS,保存LESS文件后自动生成对应的CSS文件。运算加、减、乘直接书写计算表达式,除法需要添加小括号。.box { width: 100 + 20px; width: 100 - 20px; width: 100 * 20px; width: (100 / 2rem); }对应的css代码:.box { width: 120px; width: 80px; width: 2000px; width: 50rem; }嵌套.father { color: red; .son { color: blue; a { color: pink; // & 表示当前选择器,写到谁的大括号里面就表示谁 &:hover { color: orange;
Emmet是代码的简写方式,是快速编写HTML和CSS代码的有效方法。HTML类选择器:标签名.类名id选择器:标签名#id名同级标签:div+p父子级标签:div>p多个相同标签:span*3有内容的标签:div{内容}CSS大多数简写方式为属性单词首字母。
字体字体族a { font-family: Microsoft YaHei, Heiti SC, sans-serif; }font-family属性值可以书写多个字体名,各个字体名用逗号隔开,执行顺序是从左向右依次查找。font-family属性最后设置一个字体族名,网页开发建议使用无衬线字体族(Sans-Serif)。通用字体族:Serif 衬线体Sans-Serif 无衬线体Cursive 手写体Fantasy 夸张体Monospace 等宽字体使用Web Fonts:@font-face { font-family: 'CustomFont'; src: url(https://example.com/CustomFont.woff2) format('woff2'); }font复合属性复合属性连写的font格式:font:font-style font-weight font-size/line-height font-family;必须按顺序书写,并且字号和字体值(后两个)必须书写,否则font属性不生效。文本行高p { line-height: 1.6;
一个网页由哪些部分组成(网页标准)?内容(骨骼)- HTML样式(皮肤)- CSS行为(动作)- JavaScriptHTML+CSS=植物人,HTML+CSS+JavaScript=人。HTML开发者平时用的最多的网站MDN:https://developer.mozilla.org/zh-CN/docs/Web/HTMLHTML的英文全称是 Hyper Text Markup Language,即超文本标记语言,超文本可以是图片、标题、链接、表格等等。HTML语法标签和属性不区分大小写,推荐小写空标签可以不闭合,比如 input、meta属性值推荐用双引号包裹某些属性值可以省略,比如 required、readonly语义化标签:h1-h6:语义 (含义) 标题p:语义 (含义) 段落div:没有语义语义化标签默认的效果不重要,语义最重要!内容划分:headernavmainarticleasidefooter标题h1标签在一个网页中只能用一次,用来放新闻标题或网页的logoh2~h6没有使用次数的限制h1~h6不能互相嵌套文本格式化为文本添加特殊格式,以突出重点。常见的文本格式:
基本使用默认情况下常量、类和函数名都放在全局空间下。命名空间通过namespace来声明,必须定义在文件头部,并在declare(strict_types=1) 语句下面。文件a.php<?php namespace A; function test() { echo 'test-A'; }文件b.php<?php namespace B; function test() { echo 'test-B'; }文件index.php<?php include 'a.php'; include 'b.php'; A\test(); B\test();引入方式非限定名称调用类时没有指定命名空间时,将使用当前命名空间。限定名称类似于文件系统中的相对路径。文件a.php<?php namespace A\B; class Test { public static function test() { echo __METHOD__; } }文件b.php<?php namespace A; include 'a.php'
$this self:: parent::$this是当前对象的引用,一般出现在方法里,用于获取类的成员属性,或执行类的成员方法。self::是对本类的引用,用于获取当前类的静态成员属性或静态成员方法。parent::是对父类的引用。用于调用父类的方法或属性。类常量使用const来定义类常量,使用self::来调用类常量。<?php class A { const YES = 1; public function aa() { return self::YES; } } echo (new A)->aa(); //1方法重写子类可以重写父类的方法,但使用final声明的方法,将禁止在子类中重写父类方法。抽象类具有抽象方法的类为抽象类,抽象方法即为没有内容的空方法,要求子类进行完善内容,抽象类不能实例化,只能继承。继承一个抽象类的时候,方法的可见性必须和抽象类中一样(或者更为宽松)。如果抽象类中某个抽象方法被声明为protected,那么子类中实现的方法就应该声明为protected或者public,而不能定义private。<?
microtime返回当前时间戳以及微秒数。<?php function runtime($start = null, $end = null) { static $cache = []; if (is_null($start)) { return $cache; } elseif (is_null($end)) { return $cache[$start] = microtime(true); } else { $end = $cache[$end] ?? microtime(true); return round($end - $cache[$start], 3); } } runtime('for'); for ($i = 0; $i < 10000000; $i++) { $i++; } runtime('forEnd'); echo 'for循环用的时间:' . runtime('for', 'forEnd');strtotime将任何英文文本日期时
面向过程<?php $servername = 'localhost'; $username = 'root'; $password = 'root'; try { $conn = mysqli_connect($servername, $username, $password); echo '连接成功'; } catch (Exception $e) { die('连接失败:' . $e->getMessage()); } mysqli_close($conn);面向对象<?php $servername = 'localhost'; $username = 'root'; $password = 'root'; try { $conn = new mysqli($servername, $username, $password); echo '连接成功'; } catch (Exception $e) { die('连接失败:' . $e->getMessage()); } $conn->clos
strlen()获取字符串长度。获取多字节字符串的长度使用mb_strlen()函数:<?php $s = 'abc'; $s2 = '张三'; echo strlen($s); //3 echo strlen($s2); //6 echo mb_strlen($s2, $encoding = 'utf8'); //2strpos()在字符串内查找一个字符或一段指定的文本,返回第一次出现的位置或false。stripos()同上,但不区分大小写strrpos()同上上,返回最后一次出现的位置或falsestrripos()同上,但不区分大小写explode()把字符串打散成数组,implode()把数组拼接成字符串。<?php $str = 'ab cd ef'; $str2 = explode(' ', $str); $str3 = implode('-', $str2); print_r($str2); print_r($str3);strtoupper()把字符串转换为大写,strtolower()把字符串转换为小写,ucfirst()将单词的首字母转换为大写,lcf
三毛
头发渐少,仅剩三根