#134
展开↯#135
作者:广西南宁市
UniApp vue 分享图片 合成画布 图片合并 小程序 二维码 推广海报
#,广西南宁市,2022-09-13,10:46:38, Canvas 绘制圆形图片、绘制圆角矩形图片
制作圆形和圆角矩形并不是一个方法,但大同小异
圆形使用的是:arc()
圆角使用的是:arcTo()
圆形:利用 Canvas 先画出一个圆形,然后将图片定位到圆形中心位置进行剪切,将超出圆形的部分去掉,就会形成一个圆形
圆角:利用 Canvas 先画出一个圆角矩形,然后将图片定位到圆角矩形位置进行剪切,将超出圆形的部分去掉,就会形成一个圆角矩形
区别在于,圆角需要我们一段一段的自己画出来,而圆形有现成的方法只用设置想要的值即可
#,广西南宁市,2022-09-13,10:55:45, canvas文字超过宽自动换行
#,广西南宁市,2022-09-13,21:03:48, 小程序自定义组件中使用canvas不生效
canvas组件注册无效,这个因为createCanvasContext方法是有两个参数,
在page页面默认传了一个this,在组件里面需要手动传this。
<template>
<view>
<canvas v-if="!canvas_src" style="width: 375px; height: 605px;margin-top:-1000px;position: absolute;top:-1000px;z-index: -1;" canvas-id="myCanvas" id="myCanvas"></canvas>
<view class="tkxj_0"></view>
<view class="tkxj_1" v-if="canvas_src">
<u-image :src="canvas_src" mode="heightFix" height="70vh" style="display:inline-block;"></u-image>
<view class="ggbb_1" @click="close();">X</view>
<view class="ggbb_2" @click="save_img();">保存图片</view>
</view>
</view>
</template>
<script>
export default {
name: 'add-img',
props: {
data_l:{
type:Object,
default:()=>{}
},
acv_index: {
type: Number,
default: 0
},
bgColor: {
type: String,
default: '#efefef'
},
// 宽度,单位任意
width: {
type: [String, Number],
default: '100%'
},
add_img_src: {
type: Boolean,
default: false
},
// 是否懒加载,微信小程序、App、百度小程序、字节跳动小程序
lazyLoad: {
type: Boolean,
default: true
},
// 背景颜色,用于深色页面加载图片时,为了和背景色融合
// close: {
// type: Function,
// default: ()=>{}
// },
bgColor: {
type: String,
default: '#f3f4f6'
},
getConfig:{
type:Object,
default:()=>{}
},
goods_info:{
type:Object,
default:()=>{}
}
},
data() {
return {
backgroundStyle: {},
// getConfig: {},
num:1,
canvas_src:'',
qrcode:''
// v_show_d:this.v_show
};
},
watch: {
},
computed: {
},
onShow() {
// this.$nextTick(() => {
// console.log(2132131)
// this.nGetConfig(this)
// })
},
mounted: function () {
let res2 = wx.getSystemInfoSync();
this.xw_whith = 375;//res2.windowWidth;
this.xw_height = 603;//res2.windowHeight;
// console.log(res2);
// console.log(2132131)
// this.nGetConfig(this,(res)=>{
// //getConfig 子子孙传值不过来 临时解决办法
// // console.log(res)
// this.getConfig=res;
// this.drawShareImg();
// })
// console.log(this.acv_index)
this._shop_details_qrcode();
// this.drawShareImg();
},
methods: {
//生成二维码
_shop_details_qrcode(){
this.nAjax({
url: "index/_shop_details_qrcode",
// clogin: true,
showLoading: true,
// showLoadingTitle: "正在发送",
// 'header':{
// 'content-type':'application/x-www-form-urlencoded',
// 'test':123
// },
// 'method':'GET',
data: {
tuid: this.getConfig._fx.txt.uid,
tshopid: this.goods_info.id,
},
successShow: {
show: false,
type: "toast",
// 'icon':'success',
duration: 1500,
// type: "modal",
// title: "提示",
// showCancel: false,
// // 'cancelText':'取消',
// // 'confirmText':'确定',
// confirm: () => {
// console.log("用户点击确定");
// },
// 'cancel':()=>{
// console.log('用户点击取消');
// },
},
errorShow: {
show: true,
// 'type':'toast',
// 'icon':'error',
// 'duration':3500,
type: "modal",
title: "",
showCancel: false,
// 'cancelText':'取消',
confirmText: "知道了",
confirm: () => {
// console.log("用户点击确定");
},
// 'cancel':()=>{
// console.log('用户点击取消');
// },
},
success: (res) => {
this.qrcode=res.data.qrcode;
this.drawShareImg();
},
// fail:()=>{
// },
// complete:()=>{
// }
});
},
_getImageInfo(src,callback){
uni.getImageInfo({
'src':src,
'success':res=>{
callback(res)
}
});
},
// 合成分享图核心代码
drawShareImg() {
uni.showLoading({
title: '加载中'
});
let img_arr=[
{
'src':this.goods_info.cover_img, //商品封面
'_x':this.getConfig._fx.position.dt._x,
'_y':this.getConfig._fx.position.dt._y,
},
{
'src':this.getConfig['all']['list2']['15'], //底图
'_x':this.getConfig._fx.dt._x,
'_y':this.getConfig._fx.dt._y,
},
{
'src':this.getConfig._fx.txt.avatarUrl || this.getConfig['all']['list2']['16'], //头像
'_x':this.getConfig._fx.position.tx._x,
'_y':this.getConfig._fx.position.tx._y,
},
{
'src':this.qrcode, //二维码 'http://jgy.com/'+
'_x':this.getConfig._fx.position.ewm._x,
'_y':this.getConfig._fx.position.ewm._y,
}
// this.getConfig._fx.ewm
];
// console.log(img_arr)
let img_arr_new=[];
this._getImageInfo(img_arr[0].src,res=>{
//封面
// let width=this.xw_whith;
// let height=res.height*width/res.width;
let height=this.xw_height-160;
let width=res.width*height/res.height;
if(width>this.xw_whith){
img_arr[0]._x=0-(width-this.xw_whith)/2;
}
res.width=width
res.height=height
res._x=img_arr[0]._x;
res._y=img_arr[0]._y;
img_arr_new.push(res);
this._getImageInfo(img_arr[1].src,res=>{
//底图
let width=this.xw_whith;
let height=this.xw_height; //this.xw_whith*res.width/this.xw_height
res.width=width
res.height=height
img_arr_new.push(res)
this._getImageInfo(img_arr[2].src,res=>{
//头像
res._x=img_arr[2]._x;
res.height=res.height*60/res.width;
res.width=60;
res._y=this.xw_height-img_arr[2]._y-res.height;
img_arr_new.push(res)
this._getImageInfo(img_arr[3].src,res=>{
//二维码
// let width=this.xw_whith;
// let height=res.height*width/res.width;
let height=100;
let width=100;
res.width=width
res.height=height
res._x=this.xw_whith-img_arr[3]._x-res.width;
res._y=this.xw_height-img_arr[3]._y-res.height;
img_arr_new.push(res)
this.drawShareImg0(img_arr_new);
})
})
})
})
},
/*
* 参数说明
* ctx Canvas实例
* img 图片地址
* x x轴坐标
* y y轴坐标
* w 宽度
* h 高度
* r 弧度大小
*/
circleImg(ctx, img, x, y, r=13, w=50, h=50) {
ctx.save();
// 画一个图形
if (w < 2 * r) r = w / 2;
if (h < 2 * r) r = h / 2;
ctx.beginPath();
ctx.moveTo(x + r, y);
ctx.arcTo(x + w, y, x + w, y + h, r);
ctx.arcTo(x + w, y + h, x, y + h, r);
ctx.arcTo(x, y + h, x, y, r);
ctx.arcTo(x, y, x + w, y, r);
ctx.closePath();
ctx.strokeStyle = '#FFFFFF'; // 设置绘制圆形边框的颜色
ctx.stroke();
ctx.clip();
ctx.drawImage(img, x, y, w, h);
ctx.restore();
},
/*
* 圆角图片=>参数说明
* ctx Canvas实例
* img 图片地址
* x x轴坐标
* y y轴坐标
* r 圆形半径
*/
circleImg2(ctx, img, x, y, r) {
ctx.save();
let d = 2 * r;
let cx = x + r;
let cy = y + r;
ctx.arc(cx, cy, r, 0, 2 * Math.PI);
ctx.clip();
ctx.drawImage(img, x, y, d, d);
ctx.restore();
},
drawShareImg0(img_arr_new) {
// let that=this;
//用户名
let uname=this.getConfig._fx.txt.uname;
let txt1=this.getConfig._fx.txt.txt1;
let txt2=this.getConfig._fx.txt.txt2;
let shop_title=this.goods_info.title;
let price='¥'+this.goods_info.price;
let price2='¥'+this.goods_info.market_price;
if(!this.goods_info.market_price || this.goods_info.market_price<0.01) price2='';
let ww, hh;
const ctx = uni.createCanvasContext('myCanvas',this)
ww = this.xw_whith; //准确的宽高
hh = this.xw_height;
// ctx.drawImage("https://img.jinguiyuan.cn/FkZdT5PqHitcbcVzGhstB8jasKXQ", 0, 0, ww, hh)
// ctx.drawImage("https://img.jinguiyuan.cn/FkZdT5PqHitcbcVzGhstB8jasKXQ", 30, hh - 87, 50, 50)
//封面
ctx.drawImage(img_arr_new[0].path, img_arr_new[0]._x, img_arr_new[0]._y,img_arr_new[0].width,img_arr_new[0].height);
//底图
ctx.drawImage(img_arr_new[1].path, img_arr_new[1]._x, img_arr_new[1]._y,img_arr_new[1].width,img_arr_new[1].height);
//头像
this.circleImg(ctx,img_arr_new[2].path, img_arr_new[2]._x, img_arr_new[2]._y);
//二维码
ctx.drawImage(img_arr_new[3].path, img_arr_new[3]._x, img_arr_new[3]._y,img_arr_new[3].width,img_arr_new[3].height);
// img_arr_new.forEach((v,i)=>{
// if(2==i){
// this.circleImg(ctx,v.path, v._x, v._y,30)
// }else ctx.drawImage(v.path, v._x, v._y,v.width,v.height);
// })
ctx.setFontSize(16)
ctx.setFillStyle('#000')
ctx.fillText(uname, 100, hh - 105)
ctx.setFontSize(14)
ctx.setFillStyle('#999')
let u_w=120+ctx.measureText(uname).width; //100+uname.length*17+8
ctx.fillText(txt1, u_w, hh - 105)
//商品标题
// console.log(333)
// console.log(ctx.measureText(shop_title.substring(0,15)).width)
let si=0;
let s_shop_title=shop_title;
for(let i=0;i<=shop_title.length;i++){
// console.log(ctx.measureText(shop_title.substring(0,i)).width)
let ss_t=shop_title.substring(0,i)+'...';
if(!si && ctx.measureText(ss_t).width>178) {
si=i;
s_shop_title=ss_t;
}
}
ctx.setFontSize(18)
ctx.setFillStyle('#000')
ctx.fillText(s_shop_title, 18, hh - 55)
//会员价 文字
ctx.setFontSize(14)
ctx.setFillStyle('#000')
ctx.fillText(txt2, 20, hh - 25)
//会员价
ctx.setFontSize(18)
ctx.setFillStyle('#b12704')
ctx.fillText(price, 65, hh - 25)
//市场价
if(price2){
ctx.setFontSize(16)
ctx.setFillStyle('#9fa1a0')
let p_w=82+ctx.measureText(price).width;
ctx.fillText(price2, p_w, hh - 25)
//删除线
ctx.beginPath();
const textWidth = ctx.measureText(price2).width;
ctx.rect(p_w, hh - 31, textWidth+3, 1);
ctx.fillStyle = '#9fa1a0';
ctx.fill();
}
//开始绘画
ctx.draw()
//这里需要做个延迟防止绘制没结束生成图片黑的问题
setTimeout(() => {
uni.canvasToTempFilePath({
canvasId: 'myCanvas',
success: (res)=> {
// 在H5平台下,tempFilePath 为 base64
// console.log(res.tempFilePath)
this.canvas_src=res.tempFilePath;
uni.hideLoading();
}
},this)
}, 1000);
},
close(){
// console.log(this.v_show);
this.$emit("close");
// this.blurInput(,);
},
save_img(){
uni.authorize({
scope: 'scope.writePhotosAlbum',
success:()=> {
//保存图片
uni.saveImageToPhotosAlbum({
filePath:this.canvas_src,
success:(res)=> {
this.close();
uni.showToast({
title: '保存成功',
duration: 2000
});
uni.vibrateLong();
}
})
},
fail:()=>{
uni.showModal({
title: '提示',
confirmText:'去设置',
content: '请授权相册',
success: (res)=> {
if (res.confirm) {
uni.openSetting();
// console.log('用户点击确定');
} else if (res.cancel) {
// console.log('用户点击取消');
}
}
});
return;
//只有用户主动操作下的直接回调才会生效。非用户操作或间接回调都不会拉起setting页面
uni.showToast({
title: '请授权相册',
duration: 2000
});
setTimeout(()=>{
uni.openSetting();
},1500)
// console.log(12312)
}
})
}
},
};
</script>
<style scoped>
.tkxj_0{
position: fixed;
left: 0px;
top: 0px;
width: 100vw;
height: 100vh;
z-index: 99998;
background: #000;
opacity: 0.7;
}
.tkxj_1{
position: fixed;
top: 140rpx;
left: 0px;
width: 100vw;
z-index: 99999;
padding-bottom: 100px;
text-align: center;
}
.ggbb_1{
position: absolute;
color: #fff;
left: 36rpx;
top: -45px;
border: 1px solid #fff;
font-size: 16px;
width: 30px;
height: 30px;
line-height: 28px;
border-radius: 50%;
}
.ggbb_2{
color: #fff;
font-size: 18px;
border: 1px solid #fff;
height: 36px;
line-height: 36px;
border-radius: 12px;
display: inline-block;
padding: 0px 15px;
position: absolute;
bottom: 30rpx;
left: 50%;
margin-left: -52px;
width: 104px;
}
</style>
Run code
Cut to clipboard
制作圆形和圆角矩形并不是一个方法,但大同小异
圆形使用的是:arc()
圆角使用的是:arcTo()
圆形:利用 Canvas 先画出一个圆形,然后将图片定位到圆形中心位置进行剪切,将超出圆形的部分去掉,就会形成一个圆形
圆角:利用 Canvas 先画出一个圆角矩形,然后将图片定位到圆角矩形位置进行剪切,将超出圆形的部分去掉,就会形成一个圆角矩形
区别在于,圆角需要我们一段一段的自己画出来,而圆形有现成的方法只用设置想要的值即可
// 开始制作头像
createPlacard() {
uni.getImageInfo({
src: '...7/02/e0eb38388da1c.jpg', // 网络图片需先下载,得到临时本地路径,否则绘入 Canvas 可能会出现空白
success: (img)=> {
const ctx = wx.createCanvasContext('myCanvas', this);
ctx.fillStyle = "#FFFFFF";
ctx.fillRect(0, 0, uni.upx2px(750), uni.upx2px(1000));
// 如何在 Canvas 中绘入圆形图片?
// 原理:利用 Canvas 先画出一个圆形,然后将图片定位到圆形中心位置进行剪切,将超出圆形的部分去掉,就会形成一个圆形
this.circleImgOne(ctx, img.path, uni.upx2px(175), uni.upx2px(95), uni.upx2px(200));
// 如何在 Canvas 中绘入圆角矩形?
// 原理:利用 Canvas 先画出一个圆角矩形,然后将图片定位到圆角矩形位置进行剪切,将超出圆形的部分去掉,就会形成一个圆角矩形
//this.circleImgTwo(ctx, img.path, uni.upx2px(105), uni.upx2px(95), uni.upx2px(512), uni.upx2px(382), uni.upx2px(20));
ctx.draw();
uni.hideLoading()
}
})
}
Run code
Cut to clipboard
/*
* 参数说明
* ctx Canvas实例
* img 图片地址
* x x轴坐标
* y y轴坐标
* r 圆形半径
*/
circleImgOne(ctx, img, x, y, r) {
// 如果在绘制图片之后还有需要绘制别的元素,需启动 save() 、restore() 方法,否则 clip() 方法会导致之后元素都不可见
// save():保存当前 Canvas 画布状态
// restore():恢复到保存时的状态
/* ctx.save(); */
let d = r * 2;
let cx = x + r;
let cy = y + r;
ctx.arc(cx, cy, r, 0, 2 * Math.PI);
ctx.strokeStyle = '#FFFFFF'; // 设置绘制圆形边框的颜色
ctx.stroke(); // 绘制出圆形,默认为黑色,可通过 ctx.strokeStyle = '#FFFFFF', 设置想要的颜色
ctx.clip();
ctx.drawImage(img, x, y, d, d);
/* ctx.restore(); */
},
Run code
Cut to clipboard
/*
* 参数说明
* ctx Canvas实例
* img 图片地址
* x x轴坐标
* y y轴坐标
* w 宽度
* h 高度
* r 弧度大小
*/
circleImgTwo(ctx, img, x, y, w, h, r) {
// 画一个图形
if (w < 2 * r) r = w / 2;
if (h < 2 * r) r = h / 2;
ctx.beginPath();
ctx.moveTo(x + r, y);
ctx.arcTo(x + w, y, x + w, y + h, r);
ctx.arcTo(x + w, y + h, x, y + h, r);
ctx.arcTo(x, y + h, x, y, r);
ctx.arcTo(x, y, x + w, y, r);
ctx.closePath();
ctx.strokeStyle = '#FFFFFF'; // 设置绘制圆形边框的颜色
ctx.stroke();
ctx.clip();
ctx.drawImage(img, x, y, w, h);
}
Run code
Cut to clipboard
drawText(ctx, txtwid, t, x, y, w){
var chr = t.split("");
var temp = "";
var row = [];
ctx.font = "20px Arial";
ctx.fillStyle = "black";
ctx.textBaseline = "middle";
for(var a = 0; a < chr.length; a++){
if( ctx.measureText(temp).width < w ){
;
}
else{
row.push(temp);
temp = "";
}
temp += chr[a];
}
row.push(temp);
for(var b = 0; b < row.length; b++){
ctx.setFontSize(txtwid);
ctx.setFillStyle("#333333");
ctx.fillText(row[b],x,y+(b+1)*20);
}
},
Run code
Cut to clipboard
canvas组件注册无效,这个因为createCanvasContext方法是有两个参数,
在page页面默认传了一个this,在组件里面需要手动传this。
const ctx = wx.createCanvasContext('myCanvas',this);
Run code
Cut to clipboard
文章:uni-app:iPhone的底部安全区域 发表时间:2022-09-13, 10:24:28
#136
作者:广西南宁市
解决cURL error 60: SSL certificate problem: unable to get local issuer certifica
报错:cURL error 60: SSL certificate problem: unable to get local issuer certifica
报错原因:因为没有配置信任的服务器HTTPS验证。默认情况下,cURL被设为不信任任何CAs,因此浏览器无法通过HTTPs访问你服务器。
解决方式
下载证书

修改php.ini文件,去掉前面“;” 路径带上""

openssl这个扩展开启

报错:cURL error 60: SSL certificate problem: unable to get local issuer certifica
报错原因:因为没有配置信任的服务器HTTPS验证。默认情况下,cURL被设为不信任任何CAs,因此浏览器无法通过HTTPs访问你服务器。
解决方式
下载证书
修改php.ini文件,去掉前面“;” 路径带上""
openssl这个扩展开启
文章:easywechat学习笔记 发表时间:2022-09-13, 10:33:55
#137
作者:广西南宁市
vue deep样式穿透使用
在vue2中使用 ::v-deep
’ >>> ‘和’ /deep/ '支持已弃用。
在vue3中::v-deep可以使用但是不推荐使用,官方推荐v-deep(.className)
在vue2中使用 ::v-deep
::v-deep .el-col {
margin-bottom: 20px;
}
Run code
Cut to clipboard
’ >>> ‘和’ /deep/ '支持已弃用。
在vue3中::v-deep可以使用但是不推荐使用,官方推荐v-deep(.className)
::v-deep(.el-col) {
margin-bottom: 20px;
}
// 缩写
:deep(.el-col) {
margin-bottom: 20px;
}
Run code
Cut to clipboard
全局样式设置 ::v-global(.ClassName) 缩写 :global(.ClassName)
插槽内的样式设置 ::v-slotted(.ClassName) 缩写 :slotted(.ClassName)
Run code
Cut to clipboard
文章:uni-app:iPhone的底部安全区域 发表时间:2022-09-13, 10:27:04
#138
作者:广西南宁市
animate #,广西南宁市,2022-08-01,23:00:23,
实现滚动条滚过一段距离后才调用animate.css
配合wow.js使用,只有当屏幕滚动到添加animate动画区域的时候,动画效果才出现。
WOW.js在页面滚动时展现动感的元素动画效果 #,广西南宁市,2022-09-13,10:15:36, Flex布局在线调试工具 #,广西南宁市,2022-09-13,10:17:10, TP6 模板 ThinkTemplate 内置标签 使用原生php代码 使用php标签 #,广西南宁市,2022-09-13,10:20:26, iconfont-阿里巴巴矢量图标库
实现滚动条滚过一段距离后才调用animate.css
配合wow.js使用,只有当屏幕滚动到添加animate动画区域的时候,动画效果才出现。
WOW.js在页面滚动时展现动感的元素动画效果
文章:程序员编程常用网页工具集[游戏] 发表时间:2022-08-01, 02:01:49
#139
作者:广西南宁市
Thinkphp6 查询结果按in集合顺序显示
use think\Db;
$in = ['张三', '李四', '王五'];
$order= 'field(name, '.$in.')';
return User::whereIn('name',$in)->order(Db::raw($order))->select();
Run code
Cut to clipboard
文章:tp从数据库中随机查n条数据 发表时间:2022-09-13, 10:18:34
#140
作者:广西南宁市
进入manifest文件,进入源码,找到app-plus部分
"safearea": {
"background":"#CCCCCC", // 安全区域外的背景颜色,默认值为"#FFFFFF"
"bottom":{ // 底部安全区域配置
"offset":"none|auto" // 底部安全区域偏移,"none"表示不空出安全区域,"auto"自动计算空出安全区域,默认值为"none"
},
"left": { // 左侧安全区域配置(横屏显示时有效)
"offset":"none|auto"
},
"right: { // 右侧安全区域配置(横屏显示时有效)
"offset":"none|auto"
}
}
iPhoneX的安全区域配置。
Run code
Cut to clipboard
文章:uni-app:iPhone的底部安全区域 发表时间:2022-09-13, 10:09:51
#141
作者:广西南宁市
PHP中让json_encode不自动转义斜杠“/”的方法
最近将使用爬虫爬取的链接保存到 mysql 数据库中时,发现我将链接使用 json_encode 保存时候,在数据库中却显示了转义字符,我并不需要这转义的,看起来不清晰而且占用存储空间。
后来发现在默认的情况之下使用 json_encode 对数组进行 json 格式的转换时候会自动的将数据中含有斜杠的字符串进行转义,但是我们往往有的时候不需要药对它们进行转义的,本文说说如何使用 json_encode 不自动转义斜杠。
对于如下数组 $a,现有两种办法解决:
$a = array(
'http://www.baidu.com',
'http://www.baidu.com',
'http://www.baidu.com',
'http://www.baidu.com',
'http://www.baidu.com'
);
#,广西南宁市,2022-09-07,14:34:05, php json_encode斜杠
小程序内容审核api踩坑笔记 敏感词过滤PHP开发调用msgSecCheck,违规内容也返回无问题
$data = json_encode(array('content'=>$checkContent),JSON_UNESCAPED_UNICODE)
genwxashortlink坑
shortlink.generate 返回40066,参数检查后是对的
把 /pages/detail/index 替换成 pages/detail/index,文档的示例有问题,我们改过来。 #,广西南宁市,2022-09-07,14:34:29, invalid url rid: 631809ad-0a08d4f7-008095fe
最近将使用爬虫爬取的链接保存到 mysql 数据库中时,发现我将链接使用 json_encode 保存时候,在数据库中却显示了转义字符,我并不需要这转义的,看起来不清晰而且占用存储空间。
后来发现在默认的情况之下使用 json_encode 对数组进行 json 格式的转换时候会自动的将数据中含有斜杠的字符串进行转义,但是我们往往有的时候不需要药对它们进行转义的,本文说说如何使用 json_encode 不自动转义斜杠。
对于如下数组 $a,现有两种办法解决:
$a = array(
'http://www.baidu.com',
'http://www.baidu.com',
'http://www.baidu.com',
'http://www.baidu.com',
'http://www.baidu.com'
);
其一,正则替换:
$a = str_replace("\/", "/", json_encode($a));
var_dump($a);
其二,若 php 版本是 5.4 及以上的话:
var_dump(json_encode($a,JSON_UNESCAPED_SLASHES));
Run code
Cut to clipboard
小程序内容审核api踩坑笔记 敏感词过滤PHP开发调用msgSecCheck,违规内容也返回无问题
$data = json_encode(array('content'=>$checkContent),JSON_UNESCAPED_UNICODE)
genwxashortlink坑
shortlink.generate 返回40066,参数检查后是对的
把 /pages/detail/index 替换成 pages/detail/index,文档的示例有问题,我们改过来。
文章:php curl 发送post请求带参数 发表时间:2022-09-07, 14:30:56
#142
作者:广西南宁市
php curl 设置请求头headers和请求体body
#,广西南宁市,2022-09-07,14:30:05,
$url = "http://www.example.com";
//headers数组内的格式
$headers = array();
$headers[] = "app-id:xxxxx";
$headers[] = "Content-Type:application/json";
$body = array(
"username" => "username",
"password" => "password"
);
$postBody = json_encode($body);
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);//设置请求头
curl_setopt($curl, CURLOPT_POSTFIELDS, $postBody);//设置请求体
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');//使用一个自定义的请求信息来代替"GET"或"HEAD"做为HTTP请求。(这个加不加没啥影响)
$data = curl_exec($curl);
echo $data;
Run code
Cut to clipboard
public static function getUserInfo(){
$url = 'http://*****';
$arr = ["111",
"222",
"333",
"444"];
$userIds =json_encode($arr);
$res = self::http($url,$userIds,'GET',['Content-Type:application/json']);
}
public static function http($url, $postfields = '', $method = 'GET', $headers =[])
{
$ci = curl_init();
curl_setopt($ci, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ci, CURLOPT_TIMEOUT, 5);
curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ci, CURLOPT_URL, $url);
if ($method == 'POST') {
curl_setopt($ci, CURLOPT_POST, true);
if ($postfields != '')
curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
}else{
curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'GET' );
curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
}
$response = curl_exec($ci);
curl_close($ci);
$json_r = array();
if ($response != '')
$json_r = json_decode($response, true);
return $json_r;
}
Run code
Cut to clipboard
文章:php curl 发送post请求带参数 发表时间:2022-09-07, 14:29:34
#143
作者:广西南宁市
php获取页面输出内容,PHP CURL获取页面内容输出例子
使用PHP curl获取页面内容或提交数据,有时候希望返回的内容作为变量储存,而不是直接输出。这个时候就必需设置curl的CURLOPT_RETURNTRANSFER选项为1或true。
1、curl获取页面内容, 直接输出例子:
$url = 'https://www.cnblogs.com/xwyphp/';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_exec($ch);
curl_close($ch);
?>
2、curl获取页面内容, 不直接输出例子:
$url = 'https://www.cnblogs.com/xwyphp/';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch); // 已经获取到内容,没有输出到页面上。
curl_close($ch);
echo $response;
?>
PHP curl获取页面内容,不直接输出到页面,CURLOPT_RETURNTRANSFER参数设置
使用PHP curl获取页面内容或提交数据,有时候希望返回的内容作为变量储存,而不是直接输出.这个时候就必需设置curl的或true. 1.curl获取页面内容, 直接输出例子: <?php $ ...
C#获取页面内容的几种方式
常见的Web页面获取页面内容用 WebRequest 或者 HttpWebRequest 来操作 Http 请求. 例如,获取百度网站的 html 页面 var request = WebReques ...
python+selenium 页面中存在选项卡时,获取页面内容的小技巧
最近用selenium读取页面内容时,遇到包含选项卡的页面,由于选项卡多由js加载其中的内容,所以在网址打开时只能获取到默认显示的选项卡中的内容,而tab2.tab3等等都需要傻傻的点击一下才会获取到 ...
POST信息模拟登录获取页面内容
最近项目里有一个是要模拟登录后,访问固定页面获取内容的要求,一开始用JQ AJAX好像不支持跨域请求.后使用.net中HttpWebRequest对象来获取.一开始访问总是无法在第二个页面正常访问,好 ...
最简单的代码,CURL获取页面
function getHTML($url){ $ch = curl_init(); //1.初始化curl curl_setopt($ch,CURLOPT_URL, $url); //2.curl配 ...
python 携带cookie获取页面内容
有时会遇到爬取的页面需要登录,这就要带上cookie了. 下面记录了几种携带cookie的方法 # coding=utf-8 import requests s = requests.Session( ...
php利用simple_html_dom类,获取页面内容,充当爬虫角色
PHP脚本扮演爬虫的角色,可能大家第一时间想到可能会是会正则,个人对正则的规则老是记不住,表示比较难下手,今天工作中有个需求需要爬取某个网站上的一些门店信息 无意间在网上看到一个比较好的类库叫:sim ...
WinForm开发浏览器,WebBrowser获取页面内容,如何解决中文乱码
WebBrowser的编码可以从文档对象中获得,将代码改为如下即可. System.IO.StreamReader getReader = new System.IO.StreamReader(thi ...
JAVA通过url获取页面内容
String address = "http://sports.sina.com.cn/nba/live.html?id=2015050405"; URL url = new UR ...
随机推荐
ActionMapping
在Struts中,ActionServlet只是任务的分派者,它依请求分配任务给其它的对象来执行,而分配的依据是请求的URI以及struts-config.xml的
sqlserver索引小结
1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间 下面举两个简单的例子: 图书馆的例子:一个图书 ...
centos7 firewalld
1.firewalld简介 firewalld是centos7的一大特性,最大的好处有两个: 1.支持动态更新,不用重启服务: 2.加入了防火墙的"zone"概念 firewa ...
logstash中的redis插件
redis作为logstash中的官方broker,既有input插件,还有output插件. redis input插件 data_type属性: 有三种类型, list -> BLPOP - ...
linux 定时任务计划
crond: unrecognized service 无crond解决办法 安装计划任务:yum -y install vixie-cron
Mongodb 启动时 lock文件访问没有权限处理
mongodb 第二次启动时候异常信息: lock file: /data/db/mongod.lock errno:13 Permission denied Is a mongod instance ...
try...catch...finally中try块发生的事件顺序
1.try块在发生异常的地方中断程序的执行.2.如果有catch块,就检查该块是否匹配已抛出的异常类型.如果没有catch块,就执行finally块(如果没有catch块,就一定要有finally块) ...
Android: Receiving Data from the Send Intent,自己app注册系统分享
当用户在系统的专辑,点击共享时.通过我们自己的app.分享此图片. 1.注册 主要是在AndroidManifest.xml中,对activity注冊Intent-filter.如:
[Cqoi2010]扑克牌
Description 你有n种牌,第i种牌的数目为ci.另外有一种特殊的 牌:joker,它的数目是m.你可以用每种牌各一张来组成一套牌,也可以用一张joker和除了某一种牌以外的其他牌各一张组成1 ...
这样入门asp.net core 之 静态文件
本文章主要说明asp.net core中静态资源处理方案: 一.静态文件服务 首先明确contentRoot和webroot这两个概念 contentRoot:web的项目文件夹,其中包含webroo ... #,广西南宁市,2022-09-02,23:13:22, php 替换curl内容,php curl抓取页面内容搜索拦截替换指定内容再输出
CURLOPT_RETURNTRANSFER
使用PHP curl获取页面内容或提交数据,有时候希望返回的内容作为变量储存,而不是直接输出。这个时候就必需设置curl的CURLOPT_RETURNTRANSFER选项为1或true。
1、curl获取页面内容, 直接输出例子:
$url = 'http://baidu.com';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_exec($ch);
curl_close($ch);
?>
2、curl获取页面内容, 不直接输出例子:
$url = 'http://baidu.com';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch); // 已经获取到内容,没有输出到页面上。
curl_close($ch);
echo $response;
?>
str_replace
拦截替换页面内容的方法:
把字符串 "Hello world!" 中的字符 "world" 替换为 "Shanghai":
echo str_replace("world","Shanghai","Hello world!");
?>
PHP str_replace方法,替换字符串定义和用法
str_replace() 函数替换字符串中的一些字符(区分大小写)。
结合演示<?php
$curlobj = curl_init(); // 初始化
curl_setopt($curlobj, CURLOPT_URL, "http://www.baidu.com"); // 设置访问网页的URL
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, true); // 执行之后不直接打印出来
$output = curl_exec($curlobj); // 执行
curl_close($curlobj); // 关闭cURL
echo str_replace("百度", "php", $output);
?> #,广西南宁市,2022-09-02,23:13:48, HTML <base> 标签
使用PHP curl获取页面内容或提交数据,有时候希望返回的内容作为变量储存,而不是直接输出。这个时候就必需设置curl的CURLOPT_RETURNTRANSFER选项为1或true。
1、curl获取页面内容, 直接输出例子:
$url = 'https://www.cnblogs.com/xwyphp/';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_exec($ch);
curl_close($ch);
?>
2、curl获取页面内容, 不直接输出例子:
$url = 'https://www.cnblogs.com/xwyphp/';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch); // 已经获取到内容,没有输出到页面上。
curl_close($ch);
echo $response;
?>
PHP curl获取页面内容,不直接输出到页面,CURLOPT_RETURNTRANSFER参数设置
使用PHP curl获取页面内容或提交数据,有时候希望返回的内容作为变量储存,而不是直接输出.这个时候就必需设置curl的或true. 1.curl获取页面内容, 直接输出例子: <?php $ ...
C#获取页面内容的几种方式
常见的Web页面获取页面内容用 WebRequest 或者 HttpWebRequest 来操作 Http 请求. 例如,获取百度网站的 html 页面 var request = WebReques ...
python+selenium 页面中存在选项卡时,获取页面内容的小技巧
最近用selenium读取页面内容时,遇到包含选项卡的页面,由于选项卡多由js加载其中的内容,所以在网址打开时只能获取到默认显示的选项卡中的内容,而tab2.tab3等等都需要傻傻的点击一下才会获取到 ...
POST信息模拟登录获取页面内容
最近项目里有一个是要模拟登录后,访问固定页面获取内容的要求,一开始用JQ AJAX好像不支持跨域请求.后使用.net中HttpWebRequest对象来获取.一开始访问总是无法在第二个页面正常访问,好 ...
最简单的代码,CURL获取页面
function getHTML($url){ $ch = curl_init(); //1.初始化curl curl_setopt($ch,CURLOPT_URL, $url); //2.curl配 ...
python 携带cookie获取页面内容
有时会遇到爬取的页面需要登录,这就要带上cookie了. 下面记录了几种携带cookie的方法 # coding=utf-8 import requests s = requests.Session( ...
php利用simple_html_dom类,获取页面内容,充当爬虫角色
PHP脚本扮演爬虫的角色,可能大家第一时间想到可能会是会正则,个人对正则的规则老是记不住,表示比较难下手,今天工作中有个需求需要爬取某个网站上的一些门店信息 无意间在网上看到一个比较好的类库叫:sim ...
WinForm开发浏览器,WebBrowser获取页面内容,如何解决中文乱码
WebBrowser的编码可以从文档对象中获得,将代码改为如下即可. System.IO.StreamReader getReader = new System.IO.StreamReader(thi ...
JAVA通过url获取页面内容
String address = "http://sports.sina.com.cn/nba/live.html?id=2015050405"; URL url = new UR ...
随机推荐
ActionMapping
在Struts中,ActionServlet只是任务的分派者,它依请求分配任务给其它的对象来执行,而分配的依据是请求的URI以及struts-config.xml的
sqlserver索引小结
1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间 下面举两个简单的例子: 图书馆的例子:一个图书 ...
centos7 firewalld
1.firewalld简介 firewalld是centos7的一大特性,最大的好处有两个: 1.支持动态更新,不用重启服务: 2.加入了防火墙的"zone"概念 firewa ...
logstash中的redis插件
redis作为logstash中的官方broker,既有input插件,还有output插件. redis input插件 data_type属性: 有三种类型, list -> BLPOP - ...
linux 定时任务计划
crond: unrecognized service 无crond解决办法 安装计划任务:yum -y install vixie-cron
Mongodb 启动时 lock文件访问没有权限处理
mongodb 第二次启动时候异常信息: lock file: /data/db/mongod.lock errno:13 Permission denied Is a mongod instance ...
try...catch...finally中try块发生的事件顺序
1.try块在发生异常的地方中断程序的执行.2.如果有catch块,就检查该块是否匹配已抛出的异常类型.如果没有catch块,就执行finally块(如果没有catch块,就一定要有finally块) ...
Android: Receiving Data from the Send Intent,自己app注册系统分享
当用户在系统的专辑,点击共享时.通过我们自己的app.分享此图片. 1.注册 主要是在AndroidManifest.xml中,对activity注冊Intent-filter.如:
[Cqoi2010]扑克牌
Description 你有n种牌,第i种牌的数目为ci.另外有一种特殊的 牌:joker,它的数目是m.你可以用每种牌各一张来组成一套牌,也可以用一张joker和除了某一种牌以外的其他牌各一张组成1 ...
这样入门asp.net core 之 静态文件
本文章主要说明asp.net core中静态资源处理方案: 一.静态文件服务 首先明确contentRoot和webroot这两个概念 contentRoot:web的项目文件夹,其中包含webroo ...
CURLOPT_RETURNTRANSFER
使用PHP curl获取页面内容或提交数据,有时候希望返回的内容作为变量储存,而不是直接输出。这个时候就必需设置curl的CURLOPT_RETURNTRANSFER选项为1或true。
1、curl获取页面内容, 直接输出例子:
$url = 'http://baidu.com';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_exec($ch);
curl_close($ch);
?>
2、curl获取页面内容, 不直接输出例子:
$url = 'http://baidu.com';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch); // 已经获取到内容,没有输出到页面上。
curl_close($ch);
echo $response;
?>
str_replace
拦截替换页面内容的方法:
把字符串 "Hello world!" 中的字符 "world" 替换为 "Shanghai":
echo str_replace("world","Shanghai","Hello world!");
?>
PHP str_replace方法,替换字符串定义和用法
str_replace() 函数替换字符串中的一些字符(区分大小写)。
结合演示<?php
$curlobj = curl_init(); // 初始化
curl_setopt($curlobj, CURLOPT_URL, "http://www.baidu.com"); // 设置访问网页的URL
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, true); // 执行之后不直接打印出来
$output = curl_exec($curlobj); // 执行
curl_close($curlobj); // 关闭cURL
echo str_replace("百度", "php", $output);
?>
<head>
<base href="http://www.runoob.com/images/" target="_blank">
</head>
<body>
<img src="logo.png" width="24" height="39" alt="Stickman">
<a href="http://www.runoob.com">runoob.com</a>
</body>
Run code
Cut to clipboard
文章:uniapp生成骨架屏 发表时间:2022-09-02, 23:12:47
#144
作者:广西南宁市
Go语言截取指定字符串中间字符串的方法
import "strings"
func GetBetweenStr(str, start, end string) string {
n := strings.Index(str, start)
if n == -1 {
n = 0
}
str = string([]byte(str)[n:])
m := strings.Index(str, end)
if m == -1 {
m = len(str)
}
str = string([]byte(str)[:m])
return str
}
Run code
Cut to clipboard
文章:Golang取中间字符串 发表时间:2022-09-02, 23:04:42
#145
作者:广西-南宁-西乡
利润10%成本除以0.9
20%成本除以0.8
30%成本除以0.7
40%成本除以0.6
#,广西南宁市,2022-09-01,17:48:55,
20%成本除以0.8
30%成本除以0.7
40%成本除以0.6
文章:站时系扣,坐时解扣-西装礼仪 发表时间:2021-09-29, 11:30:31
#146
作者:广西南宁市青秀区
汉字为什么是3个字节
字符集之在UTF-8中,一个汉字为什么需要三个字节?
(一)在UTF-8中,一个汉字为什么需要三个字节?
UNICODE是万能编码,包含了所有符号的编码,它规定了所有符号在计算机底层的二进制的表示顺序。有关Unicode为什么会出现就不叙述了,Unicode是针对所有计算机的使用者定义一套统一的编码规范,这样计算机使用者就避免了编码转换的问题。Unicode定义了所有符号的二进制形式,也就是符号如何在计算机内部存储的,而且每个符号规定都必须使用两个字节来表示,也就是用16位二进制去代表一个符号,这样就导致了一个问题,英文编码的空间浪费,因为在ANSI中的符号都是一个字节来表示的,而使用了UNICODE编码就白白浪费了一个字节。也就代表着Unicode需要使用两倍的空间去存储相应的ANSI编码下的符号。虽然现在硬盘或者内存都很廉价,但是在网络传输中,这个问题就凸显出来了,你可以这样想想,本来1M的带宽在ANSI下可以代表1024*1024个字符,但是在Unicode下却只能代表1024*1024/2个字符。也就是1MB/s的带宽只能等价于512KB/s,这个很可怕啊。所以为了解决符号在网络中传输的浪费问题,就出现了UTF-8编码,Unicode transfer format -8 ,后面的8代表是以8位二进制为单位来传输符号的,但是这样又导致了一个问题,虽然UTF-8可以使用一个字节来表示ANSI下的符号,但是对于其它类似汉语的符号,得需要两个字节来表示,所以计算机不知道如何去截取一个符号,也就是一个符号对应的二进制的截取开始位置和截取结束位置。所以为了解决Unicode下的ANSI符号的空间浪费和网络传输下如何截取字符的问题,UTF规定:如果一个符号只占一个字节,那么这个8位字节的第一位就为0。如果为两个字节,那么规定第一个字节的前两位都为1,然后第一个字节的第三位为0,第二个字节的前两位为10,然后如果是三个字节的话,那么第一个字节的前三位为111,第四位为0,剩余的两个字节的前两位都为10。按照这样的算法去思考一个中文字符的UTF-8是怎么表示的:一个中文字符需要两个字节来表示,两个字节一共是16位,那么UTF-8下,两个字节是不够的,因为两个字节下,第一个字节已经占据了三位:110,然后剩余的一个字节占据了两位:10,现在就只剩下8位,与Unicode下的两个字节,16位去表示任意一个字符是相悖的,也就是Unicode下的16位减去UTF-8下的8位=8位,刚好差了一个字节的空间,所以就使用三个字节去表示非ANSI字符:三个字节下,一共是24位,第一个字节头四位是:1110,后两个字节的前两位都是:10,那么24位-8位=16位,刚好两个字节去表示Unicode下的任意一个非ANSI字符。这也就是为什么UTF-8需要使用三个字节去表示一个非ANSI字符的原因了!
多个字节提供的位数超过了所需要的,多余的位以0补全到编码前面
(二)英文字母和中文汉字在不同字符集编码下的字节数
英文字母:
字节数 : 1;编码:GB2312
字节数 : 1;编码:GBK
字节数 : 1;编码:GB18030
字节数 : 1;编码:ISO-8859-1
字节数 : 1;编码:UTF-8
字节数 : 4;编码:UTF-16
字节数 : 2;编码:UTF-16BE
字节数 : 2;编码:UTF-16LE
中文汉字:
字节数 : 2;编码:GB2312
字节数 : 2;编码:GBK
字节数 : 2;编码:GB18030
字节数 : 1;编码:ISO-8859-1
字节数 : 3;编码:UTF-8
字节数 : 4;编码:UTF-16
字节数 : 2;编码:UTF-16BE
字节数 : 2;编码:UTF-16LE
这是个好问题,可以当作一个笔试题。先从字符编码讲起。
1、美国人首先对其英文字符进行了编码,也就是最早的ascii码,用一个字节的低7位来表示英文的128个字符,高1位统一为0;
2、后来欧洲人发现尼玛你这128位哪够用,比如我高贵的法国人字母上面的还有注音符,这个怎么区分,得,把高1位编进来吧,这样欧洲普遍使用一个全字节进行编码,最多可表示256位。欧美人就是喜欢直来直去,字符少,编码用得位数少;
3、但是即使位数少,不同国家地区用不同的字符编码,虽然0--127表示的符号是一样的,但是128--255这一段的解释完全乱套了,即使2进制完全一样,表示的字符完全不一样,比如135在法语,希伯来语,俄语编码中完全是不同的符号;
4、更麻烦的是,尼玛这电脑高科技传到中国后,中国人发现我们有10万多个汉字,你们欧美这256字塞牙缝都不够。于是就发明了GB2312这些汉字编码,典型的用2个字节来表示绝大部分的常用汉字,最多可以表示65536个汉字字符,这样就不难理解有些汉字你在新华字典里查得到,但是电脑上如果不处理一下你是显示不出来的了吧。
5、这下各用各的字符集编码,这世界咋统一?俄国人发封email给中国人,两边字符集编码不同,尼玛显示都是乱码啊。为了统一,于是就发明了unicode,将世界上所有的符号都纳入其中,每一个符号都给予一个独一无二的编码,现在unicode可以容纳100多万个符号,每个符号的编码都不一样,这下可统一了,所有语言都可以互通,一个网页页面里可以同时显示各国文字。
6、然而,unicode虽然统一了全世界字符的二进制编码,但没有规定如何存储啊,亲。x86和amd体系结构的电脑小端序和大端序都分不清,别提计算机如何识别到底是unicode还是acsii了。如果Unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,文本文件的大小会因此大出二三倍,这对于存储来说是极大的浪费。这样导致一个后果:出现了Unicode的多种存储方式。
7、互联网的兴起,网页上要显示各种字符,必须统一啊,亲。utf-8就是Unicode最重要的实现方式之一。另外还有utf-16、utf-32等。UTF-8不是固定字长编码的,而是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。这是种比较巧妙的设计,如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。
8、注意unicode的字符编码和utf-8的存储编码表示是不同的,例如"严"字的Unicode码是4E25,UTF-8编码是E4B8A5,这个7里面解释了的,UTF-8编码不仅考虑了编码,还考虑了存储,E4B8A5是在存储识别编码的基础上塞进了4E25。
4E25的二进制位 0100,1110,0010,0101 中文汉字在utf-8中到底占几个字节,一般是3个字节(原因见第一章),最常见的编码方式是1110xxxx 10xxxxxx 10xxxxxx。组合起来为 1110,0100,1011,1000,1010,0101 =E4B8A5
9、UTF-8 使用一至四个字节为每个字符编码。128 个 ASCII 字符(Unicode 范围由 U+0000 至 U+007F)只需一个字节,带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及马尔代夫语(Unicode 范围由 U+0080 至 U+07FF)需要二个字节,其他基本多文种平面(BMP)中的字符(CJK属于此类-Qieqie注)使用三个字节,其他 Unicode 辅助平面的字符使用四字节编码。
10、最后,要回答你的问题,常规来看,中文汉字在utf-8中到底占几个字节,一般是3个字节,最常见的编码方式是1110xxxx 10xxxxxx 10xxxxxx。 #,广西南宁市青秀区,2022-08-23,22:17:43, 编码查看转换工具 #,广西南宁市青秀区,2022-08-23,22:21:13, 《计算机组成原理与汇编语言》
字符集之在UTF-8中,一个汉字为什么需要三个字节?
(一)在UTF-8中,一个汉字为什么需要三个字节?
UNICODE是万能编码,包含了所有符号的编码,它规定了所有符号在计算机底层的二进制的表示顺序。有关Unicode为什么会出现就不叙述了,Unicode是针对所有计算机的使用者定义一套统一的编码规范,这样计算机使用者就避免了编码转换的问题。Unicode定义了所有符号的二进制形式,也就是符号如何在计算机内部存储的,而且每个符号规定都必须使用两个字节来表示,也就是用16位二进制去代表一个符号,这样就导致了一个问题,英文编码的空间浪费,因为在ANSI中的符号都是一个字节来表示的,而使用了UNICODE编码就白白浪费了一个字节。也就代表着Unicode需要使用两倍的空间去存储相应的ANSI编码下的符号。虽然现在硬盘或者内存都很廉价,但是在网络传输中,这个问题就凸显出来了,你可以这样想想,本来1M的带宽在ANSI下可以代表1024*1024个字符,但是在Unicode下却只能代表1024*1024/2个字符。也就是1MB/s的带宽只能等价于512KB/s,这个很可怕啊。所以为了解决符号在网络中传输的浪费问题,就出现了UTF-8编码,Unicode transfer format -8 ,后面的8代表是以8位二进制为单位来传输符号的,但是这样又导致了一个问题,虽然UTF-8可以使用一个字节来表示ANSI下的符号,但是对于其它类似汉语的符号,得需要两个字节来表示,所以计算机不知道如何去截取一个符号,也就是一个符号对应的二进制的截取开始位置和截取结束位置。所以为了解决Unicode下的ANSI符号的空间浪费和网络传输下如何截取字符的问题,UTF规定:如果一个符号只占一个字节,那么这个8位字节的第一位就为0。如果为两个字节,那么规定第一个字节的前两位都为1,然后第一个字节的第三位为0,第二个字节的前两位为10,然后如果是三个字节的话,那么第一个字节的前三位为111,第四位为0,剩余的两个字节的前两位都为10。按照这样的算法去思考一个中文字符的UTF-8是怎么表示的:一个中文字符需要两个字节来表示,两个字节一共是16位,那么UTF-8下,两个字节是不够的,因为两个字节下,第一个字节已经占据了三位:110,然后剩余的一个字节占据了两位:10,现在就只剩下8位,与Unicode下的两个字节,16位去表示任意一个字符是相悖的,也就是Unicode下的16位减去UTF-8下的8位=8位,刚好差了一个字节的空间,所以就使用三个字节去表示非ANSI字符:三个字节下,一共是24位,第一个字节头四位是:1110,后两个字节的前两位都是:10,那么24位-8位=16位,刚好两个字节去表示Unicode下的任意一个非ANSI字符。这也就是为什么UTF-8需要使用三个字节去表示一个非ANSI字符的原因了!
多个字节提供的位数超过了所需要的,多余的位以0补全到编码前面
(二)英文字母和中文汉字在不同字符集编码下的字节数
英文字母:
字节数 : 1;编码:GB2312
字节数 : 1;编码:GBK
字节数 : 1;编码:GB18030
字节数 : 1;编码:ISO-8859-1
字节数 : 1;编码:UTF-8
字节数 : 4;编码:UTF-16
字节数 : 2;编码:UTF-16BE
字节数 : 2;编码:UTF-16LE
中文汉字:
字节数 : 2;编码:GB2312
字节数 : 2;编码:GBK
字节数 : 2;编码:GB18030
字节数 : 1;编码:ISO-8859-1
字节数 : 3;编码:UTF-8
字节数 : 4;编码:UTF-16
字节数 : 2;编码:UTF-16BE
字节数 : 2;编码:UTF-16LE
这是个好问题,可以当作一个笔试题。先从字符编码讲起。
1、美国人首先对其英文字符进行了编码,也就是最早的ascii码,用一个字节的低7位来表示英文的128个字符,高1位统一为0;
2、后来欧洲人发现尼玛你这128位哪够用,比如我高贵的法国人字母上面的还有注音符,这个怎么区分,得,把高1位编进来吧,这样欧洲普遍使用一个全字节进行编码,最多可表示256位。欧美人就是喜欢直来直去,字符少,编码用得位数少;
3、但是即使位数少,不同国家地区用不同的字符编码,虽然0--127表示的符号是一样的,但是128--255这一段的解释完全乱套了,即使2进制完全一样,表示的字符完全不一样,比如135在法语,希伯来语,俄语编码中完全是不同的符号;
4、更麻烦的是,尼玛这电脑高科技传到中国后,中国人发现我们有10万多个汉字,你们欧美这256字塞牙缝都不够。于是就发明了GB2312这些汉字编码,典型的用2个字节来表示绝大部分的常用汉字,最多可以表示65536个汉字字符,这样就不难理解有些汉字你在新华字典里查得到,但是电脑上如果不处理一下你是显示不出来的了吧。
5、这下各用各的字符集编码,这世界咋统一?俄国人发封email给中国人,两边字符集编码不同,尼玛显示都是乱码啊。为了统一,于是就发明了unicode,将世界上所有的符号都纳入其中,每一个符号都给予一个独一无二的编码,现在unicode可以容纳100多万个符号,每个符号的编码都不一样,这下可统一了,所有语言都可以互通,一个网页页面里可以同时显示各国文字。
6、然而,unicode虽然统一了全世界字符的二进制编码,但没有规定如何存储啊,亲。x86和amd体系结构的电脑小端序和大端序都分不清,别提计算机如何识别到底是unicode还是acsii了。如果Unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,文本文件的大小会因此大出二三倍,这对于存储来说是极大的浪费。这样导致一个后果:出现了Unicode的多种存储方式。
7、互联网的兴起,网页上要显示各种字符,必须统一啊,亲。utf-8就是Unicode最重要的实现方式之一。另外还有utf-16、utf-32等。UTF-8不是固定字长编码的,而是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。这是种比较巧妙的设计,如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。
8、注意unicode的字符编码和utf-8的存储编码表示是不同的,例如"严"字的Unicode码是4E25,UTF-8编码是E4B8A5,这个7里面解释了的,UTF-8编码不仅考虑了编码,还考虑了存储,E4B8A5是在存储识别编码的基础上塞进了4E25。
4E25的二进制位 0100,1110,0010,0101 中文汉字在utf-8中到底占几个字节,一般是3个字节(原因见第一章),最常见的编码方式是1110xxxx 10xxxxxx 10xxxxxx。组合起来为 1110,0100,1011,1000,1010,0101 =E4B8A5
9、UTF-8 使用一至四个字节为每个字符编码。128 个 ASCII 字符(Unicode 范围由 U+0000 至 U+007F)只需一个字节,带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及马尔代夫语(Unicode 范围由 U+0080 至 U+07FF)需要二个字节,其他基本多文种平面(BMP)中的字符(CJK属于此类-Qieqie注)使用三个字节,其他 Unicode 辅助平面的字符使用四字节编码。
10、最后,要回答你的问题,常规来看,中文汉字在utf-8中到底占几个字节,一般是3个字节,最常见的编码方式是1110xxxx 10xxxxxx 10xxxxxx。
文章:Go判断包含字符串 发表时间:2022-08-23, 22:17:02
#148
作者:广西南宁市
机械键盘的红、黑、青、 茶四种轴区别如下:
1.黑轴,黑轴是一种线性手感的机械轴,线性手感就是直上直下的手感,举个例子,用手指将弹簧按下去,然后弹簧通过弹性势能回弹,同时回馈给手指力道,之就是线性手感。黑轴是最硬的机械轴,同时给予用户的回报就是快速回弹,也就意味着单键连续操作速度快。黑轴适合正常强度玩游戏,少打字的用户。
2.红轴,红轴就是轻量级黑轴。线性手感。红轴适合高速打字员、职业游戏玩家等相对专业性较强的用户。因为专业用户平时需要大量的练习来提高职业技能,同时也要求高速的反应。唯有红轴能满足这样的需求。
3.茶轴,非线性手感,有段落感。段落感就是按下键时微弱卡顿的感觉。茶轴是机械轴中的万金油,适合绝大多数的用户。可打字,可游戏。
4.青轴,将老式打字机的手感引入茶轴中,青轴有明确的段落感以及清脆的点击声,是四种轴中最好玩的轴,使用快感最强,也适合大多数用户。
今天试了试四种轴,我自己的感觉是
茶轴最好,有轻微的段落感,声音清脆一些。
青轴最不舒服,手指感觉很累。所谓的段落感,就是一种按压老式开关的声音和感觉。声音很响。
黑轴感觉按键回弹力量比较大,所以手指按压时受到的阻力较大,感觉也不是很舒服。声音沉闷一些。
红轴的声音最轻,阻力最小。红轴的感觉是不是在敲打键盘。
1.黑轴,黑轴是一种线性手感的机械轴,线性手感就是直上直下的手感,举个例子,用手指将弹簧按下去,然后弹簧通过弹性势能回弹,同时回馈给手指力道,之就是线性手感。黑轴是最硬的机械轴,同时给予用户的回报就是快速回弹,也就意味着单键连续操作速度快。黑轴适合正常强度玩游戏,少打字的用户。
2.红轴,红轴就是轻量级黑轴。线性手感。红轴适合高速打字员、职业游戏玩家等相对专业性较强的用户。因为专业用户平时需要大量的练习来提高职业技能,同时也要求高速的反应。唯有红轴能满足这样的需求。
3.茶轴,非线性手感,有段落感。段落感就是按下键时微弱卡顿的感觉。茶轴是机械轴中的万金油,适合绝大多数的用户。可打字,可游戏。
4.青轴,将老式打字机的手感引入茶轴中,青轴有明确的段落感以及清脆的点击声,是四种轴中最好玩的轴,使用快感最强,也适合大多数用户。
今天试了试四种轴,我自己的感觉是
茶轴最好,有轻微的段落感,声音清脆一些。
青轴最不舒服,手指感觉很累。所谓的段落感,就是一种按压老式开关的声音和感觉。声音很响。
黑轴感觉按键回弹力量比较大,所以手指按压时受到的阻力较大,感觉也不是很舒服。声音沉闷一些。
红轴的声音最轻,阻力最小。红轴的感觉是不是在敲打键盘。
文章:ios h5播放视频不了 发表时间:2022-08-16, 17:39:20
#149
作者:广西南宁市
微信网页分享给朋友updateTimelineShareData自定义分享出去都是url
微信改了外链规则,如果你是点聊天界面的url进去分享出来的是 URL ,如果你是扫描二维码或别人分享进去分享就是 你设置的分享内容。
总结:必须是二维码或分享进去设置的分享内容才有效。
注意:
1、目前还可以从公众号菜单进入分享、访问网页后添加到收藏,从我的收藏进入分享正常。
2、其他入口应该分享都是链接了。
#,广西南宁市,2022-08-16,14:24:32, 这是正常的,微信在上次开放全域名后改的。目前还可以从公众号菜单进入分享、访问网页后添加到收藏,从我的收藏进入分享正常。其他入口应该分享都是链接了。 #,广西南宁市,2022-08-16,14:28:15, 1,在公众号菜单中的链接打开,才能正常分享卡片;2,可以通过收藏链接,再打开分享也是卡片;3,把链接换成二维码,扫码后进入分享也是卡片。所有的前提是你配置必须OK!如果是用微信直接打开链接分享会是链接。 #,广西南宁市,2022-08-16,14:29:48, 我发现还有一个情况,打开聊天框 随便引用一条聊天记录,发送链接,再点进去分享也是卡片
微信改了外链规则,如果你是点聊天界面的url进去分享出来的是 URL ,如果你是扫描二维码或别人分享进去分享就是 你设置的分享内容。
总结:必须是二维码或分享进去设置的分享内容才有效。
注意:
1、目前还可以从公众号菜单进入分享、访问网页后添加到收藏,从我的收藏进入分享正常。
2、其他入口应该分享都是链接了。
文章:微信网页授权snsapi_base,snsapi_userinfo 发表时间:2022-08-16, 14:24:13
#150
作者:广西南宁市
//今天开始
$beginToday = date('Y-m-d 00:00:00', time());
//今天结束
$endToday = date('Y-m-d 23:59:59', time());
//昨天开始
$beginYesterday = date('Y-m-d 00:00:00', strtotime(' -1 day'));
//昨天结束
$endYesterday = date('Y-m-d 23:59:59', strtotime(' -1 day'));
//本周开始,周一开始
$beginThisWeek = date('Y-m-d 00:00:00', strtotime('this week monday'));
//本周结束,周日结束
$endThisWeek = date('Y-m-d 23:59:59', strtotime('this week sunday'));
//上周开始,周一开始
$beginLastWeek = date('Y-m-d 00:00:00', strtotime('last week monday'));
//上周结束,周日结束
$endLastWeek = date('Y-m-d 23:59:59', strtotime('last week sunday'));
//本月开始
$beginThisMonth = date('Y-m-01 00:00:00');
//本月结束
$endThisMonth = date('Y-m-d 23:59:59', strtotime('Last day of this month'));
//上月开始
$beginLastMonth = date('Y-m-01 00:00:00', strtotime('last month'));
//上月结束
$endLastMonth = date('Y-m-d 23:59:59', strtotime('Last day of last month'));
//本季度开始
$beginThisSeason = date('Y-m-01 00:00:00', strtotime((1 - (date('n') % 3 == 0 ? 3 : date('n') % 3)) . ' month'));
//本季度结束
$endThisSeason = date('Y-m-d 23:59:59', strtotime('last day of' . (3 - (date('n') % 3 == 0 ? 3 : date('n') % 3)) . ' month'));
//上季度开始
$beginLastSeason = date('Y-m-01 00:00:00', strtotime((-2 - (date('n') % 3 == 0 ? 3 : date('n') % 3)) . ' month'));
//上季度结束
$endLastSeason = date('Y-m-d 23:59:59', strtotime('last day of' . (- (date('n') % 3 == 0 ? 3 : date('n') % 3)) . ' month'));
//本年度开始
$beginThisYear = date('Y-01-01 00:00:00');
//本年度结束
$endThisYear = date('Y-12-31 23:59:59');
//上年度开始
$beginLastYear = date('Y-01-01 00:00:00', strtotime('last year'));
//上年度结束
$endLastYear = date('Y-12-31 23:59:59', strtotime('last year'));
Run code
Cut to clipboard
文章:PHP获取今日、昨日、本周、上周、本月、上月、本季、上季、今年、去年 发表时间:2022-08-16, 14:17:17
#151
作者:广西南宁市
//php获取今日开始时间戳和结束时间戳
$beginToday=mktime(0,0,0,date('m'),date('d'),date('Y'));
$endToday=mktime(0,0,0,date('m'),date('d')+1,date('Y'))-1;
//php获取昨日起始时间戳和结束时间戳
$beginYesterday=mktime(0,0,0,date('m'),date('d')-1,date('Y'));
$endYesterday=mktime(0,0,0,date('m'),date('d'),date('Y'))-1;
//php获取上周起始时间戳和结束时间戳
$beginLastweek=mktime(0,0,0,date('m'),date('d')-date('w')+1-7,date('Y'));
$endLastweek=mktime(23,59,59,date('m'),date('d')-date('w')+7-7,date('Y'));
//php获取本月起始时间戳和结束时间戳
$beginThismonth=mktime(0,0,0,date('m'),1,date('Y'));
$endThismonth=mktime(23,59,59,date('m'),date('t'),date('Y'));
Run code
Cut to clipboard
文章:PHP获取今日、昨日、本周、上周、本月、上月、本季、上季、今年、去年 发表时间:2022-08-16, 14:16:37
#152
作者:广西南宁市
<?php
//今天
$today = date("Y-m-d");
//昨天
$yesterday = date("Y-m-d", strtotime(date("Y-m-d"))-86400);
//上周
$lastweek_start = date("Y-m-d H:i:s",mktime(0, 0 , 0,date("m"),date("d")-date("w")+1-7,date("Y")));
$lastweek_end = date("Y-m-d H:i:s",mktime(23,59,59,date("m"),date("d")-date("w")+7-7,date("Y")));
//本周
$thisweek_start = date("Y-m-d H:i:s",mktime(0, 0 , 0,date("m"),date("d")-date("w")+1,date("Y")));
$thisweek_end = date("Y-m-d H:i:s",mktime(23,59,59,date("m"),date("d")-date("w")+7,date("Y")));
//上月
$lastmonth_start = date("Y-m-d H:i:s",mktime(0, 0 , 0,date("m")-1,1,date("Y")));
$lastmonth_end = date("Y-m-d H:i:s",mktime(23,59,59,date("m") ,0,date("Y")));
//本月
$thismonth_start = date("Y-m-d H:i:s",mktime(0, 0 , 0,date("m"),1,date("Y")));
$thismonth_end = date("Y-m-d H:i:s",mktime(23,59,59,date("m"),date("t"),date("Y")));
//本季度未最后一月天数
$getMonthDays = date("t",mktime(0, 0 , 0,date('n')+(date('n')-1)%3,1,date("Y")));
//本季度/
$thisquarter_start = date('Y-m-d H:i:s', mktime(0, 0, 0,date('n')-(date('n')-1)%3,1,date('Y')));
$thisquarter_end = date('Y-m-d H:i:s', mktime(23,59,59,date('n')+(date('n')-1)%3,$getMonthDays,date('Y')));
?>
Run code
Cut to clipboard
文章:PHP获取今日、昨日、本周、上周、本月、上月、本季、上季、今年、去年 发表时间:2022-08-16, 14:16:19
SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'appointment.ob_order.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
去掉 sql_mode 配置项参数中逗号后面的空格
打开mysql配置文件,在[mysqld]下添加如下一行:sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,保存重启