Hexo


  • 首页

  • 归档

encodeURI与encodeURIComponent

发表于 2022-05-25

从MDN上,把定义粘过来。

* encodeURI()  函数通过将特定字符的每个实例替换为一个、两个、三或四转义序列来对统一资源标识符 (URI) 进行编码 (该字符的 UTF-8 编码仅为四转义序列)由两个 "代理" 字符组成)。
* decodeURI() 函数能解码由encodeURI 创建或其它流程得到的统一资源标识符(URI)。
* encodeURIComponent() 函数通过将一个,两个,三个或四个表示字符的 UTF-8 编码的转义序列替换某些字符的每个实例来编码 URI(对于由两个“代理”字符组成的字符而言,将仅是四个转义序列)。
* decodeURIComponent() 方法用于解码由 encodeURIComponent 方法或者其它类似方法编码的部分统一资源标识符(URI)。

为什么要对URI编码?

http中传输参数的话,是这样的格式key,value的形式,比如这样,”?name1=value1&name2=value2”,这样,服务端接收参数的时候,是用“&”来切割参数,但是,如果value里如果有=&这种特殊字符的话或者空格等等,就会导致解析的结果跟预期有偏差,所以这种时候就需要对UTRI进行编码。

哪些字符需要编码

RFC3986文档规定,Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符。RFC3986文档对Url的编解码问题做出了详细的建议,指出了哪些字符需要被编码才不会引起Url语义的转变,以及对为什么这些字符需要编码做出了相应的解释。

US-ASCII字符集中没有对应的可打印字符:Url中只允许使用可打印字符。US-ASCII码中的10-7F字节全都表示控制字符,这些字符都不能直接出现在Url中。同时,对于80-FF字节(ISO-8859-1),由于已经超出了US-ACII定义的字节范围,因此也不可以放在Url中。

保留字符:Url可以划分成若干个组件,协议、主机、路径等。有一些字符(:/?#[]@)是用作分隔不同组件的。例如:冒号用于分隔协议和主机,/用于分隔主机和路径,?用于分隔路径和查询参数,等等。

还有一些字符(!$&’()*+,;=)用于在每个组件中起到分隔作用的,如=用于表示查询参数中的键值对,&符号用于分隔查询多个键值对。当组件中的普通数据包含这些特殊字符时,需要对其进行编码。

RFC3986中指定了以下字符为保留字符:! * ‘ ( ) ; : @ & = + $ , / ? # [ ]

不安全字符:还有一些字符,当他们直接放在Url中的时候,可能会引起解析程序的歧义。这些字符被视为不安全字符,原因有很多。

空格:Url在传输的过程,或者用户在排版的过程,或者文本处理程序在处理Url的过程,都有可能引入无关紧要的空格,或者将那些有意义的空格给去掉。
引号以及<>:引号和尖括号通常用于在普通文本中起到分隔Url的作用

#:通常用于表示书签或者锚点
%:百分号本身用作对不安全字符进行编码时使用的特殊字符,因此本身需要编码
{}|\^[]`~:某一些网关或者传输代理会篡改这些字符
需要注意的是,对于Url中的合法字符,编码和不编码是等价的,但是对于上面提到的这些字符,如果不经过编码,那么它们有可能会造成Url语义的不同。因此对于Url而言,只有普通英文字符和数字,特殊字符$-_.+!*’()还有保留字符,才能出现在未经编码的Url之中。其他字符均需要经过编码之后才能出现在Url中。

但是由于历史原因,目前尚存在一些不标准的编码实现。例如对于~符号,虽然RFC3986文档规定,对于波浪符号~,不需要进行Url编码,但是还是有很多老的网关或者传输代理会进行编码。

这三个编码的函数——escape,encodeURI,encodeURIComponent——都是用于将不安全不合法的Url字符转换为合法的Url字符表示,它们有以下几个不同点。

安全字符不同:

下面列出了这三个函数的安全字符(即函数不会对这些字符进行编码)

escape(69个):/@+-._0-9a-zA-Z
encodeURI(82个):!#$&’()
+,/:;=?@-.~0-9a-zA-Z
encodeURIComponent(71个):!’()*-.
~0-9a-zA-Z

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var set1 = ";,/?:@&=+$";  // 保留字符
var set2 = "-_.!~*'()"; // 不转义字符
var set3 = "#"; // 数字标志
var set4 = "ABC abc 123"; // 字母数字字符和空格

console.log(encodeURI(set1)); // ;,/?:@&=+$
console.log(encodeURI(set2)); // -_.!~*'()
console.log(encodeURI(set3)); // #
console.log(encodeURI(set4)); // ABC%20abc%20123 (空格被编码为 %20)

console.log(encodeURIComponent(set1)); // %3B%2C%2F%3F%3A%40%26%3D%2B%24
console.log(encodeURIComponent(set2)); // -_.!~*'()
console.log(encodeURIComponent(set3)); // %23
console.log(encodeURIComponent(set4)); // ABC%20abc%20123 (the space gets encoded as %20)

vue脚手架安装时怎么更改包管理器为yarn还是npm

发表于 2020-03-19

@vue/cli vue脚手架安装时怎么更改包管理器为yarn还是npm

在执行 vue create my-project 之后,如果显示的是,

1
2
cd my-project
npm run serve

则表示当前用的npm创建的项目

如果显示的是:

1
2
cd my-project
yarn run serve

则表示当前用的yarn创建的项目

那么问题来了,如何切换包管理器呢?
在@vue/cli有段描述,

1
2
3
4
5
~/.vuerc

被保存的 preset 将会存在用户的 home 目录下一个名为 .vuerc 的 JSON 文件里。如果你想要修改被保存的 preset / 选项,可以编辑这个文件。

在项目创建的过程中,你也会被提示选择喜欢的包管理器或使用淘宝 npm 镜像源以更快地安装依赖。这些选择也将会存入 ~/.vuerc。

只有第一次创建项目的时候,会询问用npm或yarn,后续如果需要更改的话,则是更改.vuerc文件。
如果是window环境的话,.vuerc文件在 C:/user/administrator/
如果是mac环境的话,在terminal终端输入

1
vi ~/.vuerc

(进入到文件看到文件内容后,摁i键进入插入模式,更改想要更改的内容后,摁Esc退出插入模式,然后摁 :wq 即可保存退出文件编辑。)

.vuerc文件里有一项,

1
2
3
{
"packageManager": "npm"
}

这时,只需要手动更改配置内容npm为yarn,即可更改创建项目时的包管理器了(也可删除 .vuerc 文件(rm -rf ~/.vuerc)重新运行 vue create xx 选择配置)

递归中注意return返回值

发表于 2019-12-27 | 分类于 web前端

递归中注意return返回值

群里一个小伙伴问及递归如果有返回值的话,该怎么写,我想了下,好像之前写递归没有写过返回值呢,于是查了下资料,遂写下这篇博客。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var obj = [{
name:'1',
children: [{
name: '11',
age: 13,
children: [{name: '111'}]
}]
}]
function test(data){
// 此处for循环才可以跳出循环,如果用map或者forEach都不可以,因为他们的参数是一个回调函数,不能跳出循环
for(var i=0;i<data.length;i++){
if(data[i].name === '11'){
return 123;
}else if(data[i].children){
// 这里需要将函数return出来,每一次return都是把最新的函数调用返回给外层的函数调用。
// (这里test(data[i].children)拿到的是执行时的返回值,需要将此返回值return出去)
return test(data[i].children)
}
}
}

写的如果有有问题的地方,烦请指出。

西瓜

西瓜的博客,用来记录学习前端的日常

3 日志
1 分类
1 标签
© 2022 西瓜
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4