【无标题】

URL编码以及余下编码

2023年7月22日

12:12

URL编码

URL编码是为了解决url中 可能存在歧义的字符以及不在网络标准RFC1738中规定的字符。

RFC3986文档规定,Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符!*'();:@&=+$,/?#[]。

Url编码通常也被称为百分号编码(Url Encoding,also known as percent-encoding),是因为它的编码方式非常简单,使用%百分号加上两位的字符(0123456789ABCDEF)——代表一个字节的十六进制形式。Url编码默认使用的字符集是US-ASCII。

ASCII与拓展的ASCII

通常说的ASCII码是指128种字符,

0~31及127(共33个)是控制字符或通信专用字符

其余为可显示(打印)字符

拓展ASCII码参见 HTML URL 编码

需要注意的是,在不同国家的ASCII编码方式中,不一样的只是128–255的这一段,0–127表示的符号是一样的

显然,有些ASCII可打印字符必须编码才能传输

有些规定的字符就不用编码就可以在URL中传输。

但是在不同的浏览器中,对RFC3986文档的规定并不是很好的执行。

具体的内容可以参见 为什么要进行URL编码

抓包查看URL编码后的数据

如图蓝色部分就是URL编码后在网络中传输的数据。

单引号被编码、‘中国’被编码

#锚点后面的数据不会在网络中传输,只是页面展示使用,#被认成ASCII码0x20就是空格,然后这里的#没有被编码。这里的+也没有被编码,+被认成ASCII码0x2b。#和+都只占一个字节。

在URL格式中,空格会被被编码成%20,就和上面的单引号一样,在HTTP数据包中占三个字节。

‘中国’被编码成%E4%B8%AD%E5%9B%BD

对于Unicode字符,RFC文档建议使用utf-8对其进行编码得到相应的字节,然后对每个字节执行百分号编码。如"中文"使用UTF-8字符集得到的字节为0xE4 0xB8 0xAD 0xE6 0x96 0x87,经过Url编码之后得到"%E4%B8%AD%E6%96%87"。

unicode编码、utf-8编码、UCS、UTF

参见 :

字符编码笔记:ASCII,Unicode 和 UTF-8

程序员趣味读物:谈谈Unicode编码

unicode编码:将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是 Unicode,就像它的名字都表示的,这是一种所有符号的编码。Unicode 当然是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的大写字母A,U+4E25表示汉字严。Unicode通常用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填为0就可以。

需要注意的是,Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。

unicode的问题:没有规定读取方式、存储方式太过浪费

utf8编码:UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式。其他实现方式还包括 UTF-16和 UTF-32。UTF-8 是 Unicode 的实现方式之一。

UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8 的编码规则很简单,只有二条:

从上图可以看见,中文属于三个字节的编码范围。所以从unicode到uft8,‘中国’被URL编码成%E4%B8%AD%E5%9B%BD(六个字节)

Unicode也是一种字符编码方法,不过它是由国际组织设计,可以容纳全世界所有语言文字的编码方案。Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。UCS可以看作是"Unicode Character Set"的缩写。

UCS有两种格式:UCS-2和UCS-4。顾名思义,UCS-2就是用两个字节编码,UCS-4就是用4个字节(实际上只用了31位,最高位必须为0)编码。

将UCS-4去掉前面的两个零字节就得到了UCS-2。在UCS-2的两个字节前加上两个零字节,就得到了UCS-4的BMP。而目前的UCS-4规范中还没有任何字符被分配在BMP之外。

UCS规定了怎么用多个字节表示各种文字。怎样传输这些编码,是由UTF(UCS Transformation Format)规范规定的,常见的UTF规范包括UTF-8、UTF-7、UTF-16。

ANSI、gb系列、Big-5

ANSI是windows默认编码统称。微软用一个叫“Windows code pages”(在命令行下执行chcp命令可以查看当前code page的值)的值来判断系统默认编码。

Windows下code page是根据当前系统区域(locale)来设置的,要想修改系统默认的“ANSI编码”,我们可以通过修改系统区域来实现。

不同国家默认的ANSI不同。

为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5。

历史:

GB2312(1980年)一共收录了7445个字符。

GBK1.0(1995年)的汉字扩展规范收录了21886个符号。

GB18030(2000年)取代GBK1.0的正式国家标准。该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。

Big5,又称为大五码或五大码,是使用繁体中文(正体中文)社区中最常用的电脑汉字字符集标准,共收录13,060个汉字。

从ASCII、GB2312、GBK到GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。

而Unicode只与ASCII兼容(更准确地说,是与ISO-8859-1兼容),与GB码不兼容。

特殊情况下的URL编码(表单提交)

参见:资料

当html的表单被提交时,每个表单域都会被Url编码之后才在被发送。

由于历史的原因,表单使用的Url编码实现并不符合最新的标准。

例如对于空格不会被编码,而是空格被认成ASCII码0x2b,是+号。

+号会被编码成%2B。

对于非ASCII字符,使用的编码字符集取决于当前文档使用的字符集。

一般来说,网页设置的是content="text/html; charset=utf-8,所以对于表单提交的中文unicode字符会用utf-8编码后的URL编码。

但是在国内,还有很多网页的charset是gb系列。这个时候中文unicode字符会用gb系列编码后的URL编码。

其实是因为 该html文件在储存时是按照utf-8编码存储的。所以一个汉字对应三个字节,两个汉字就是六个字节。

但是浏览器在打开这个html文件时读取charset的属性却是gb2312。所以它会两个字节的去读。这样就造成登录的六个字节渲染成三个汉字鐧诲綍。

同样,中文也是被读成三个汉字涓枃,然后根据utf-8的字符集(一个汉字对应三个字节)URL编码成九个字节。

上文有说到utf-16编码方式。这种方式在我们的记事本可以看到。

UTF-8 有高字节的1的个数确定编码一个字符的字节个数,不需要字节序。

UTF-16是两个字节确定一个字符,就需要确定字节序。

Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。

在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。

如果收到FEFF,就表明这个字节流是Big-Endian的

如果收到FFFE,就表明这个字节流是Little-Endian的

打开记事本,输入一段字符,然后选择另存为,然后确定编码方式。使用UE编辑器可以查看其十六进制字节流。

URL解码

说了太多题外话了,本篇博客是接着上篇的主题。那么URL是在什么地方解码的呢??

其实不难看出:在浏览器发送请求时,被百分号编码的就是一些特殊的字符以及人为百分号编码的字符,这时传输一个字符需要占据数据包的三个字节。数据包到达目的主机时,经过物理层、数据链路层、网络层、传输层、最后到达应用层。到达应用层的数据就是HTTP协议中的数据

如图就是蓝色选中部分。使用不同函数会返回不同的数据,有些被URL解码了,有些没有。

至少$_GET $_POST $_REQUEST是经过URL解码后的。

PHP解释器从内存中拿到数据,如果要URL解码,就把数据一个字节一个字节的拿出来并转换成ASCII码摆成一排。然后看哪里有%号。假如结果如下:

PHP解释器内心OS:第一个是%,哦,那这个肯定是URL编码了,看看它后面是什么?2,哦在00-7f之间,那就好,原来%27是一个整体,好,解码。然后看7后面的,还是%?好嘛,又要解码了,它后面是27嗯,在范围内,解码!然后找啊找遇到%E4.emmmm,E4不在00-7f之间,那就是unicode字符了。

但是PHP解释器怎么知道他是gb系列的URL编码还是UTF-8系列的编码呢??

这里就存在这些字符串是会被服务器直接使用,还是直接发给浏览器。

如果服务器要使用这些字符串并展示出来,就要设定解码方式。

如果是直接传给浏览器就不用设定解码方式。如果是原始数据,就直接将内存的内容发给浏览器,如果要解码后的数据,就把%号去掉,然后将字符以ASCII码形式返回,不管是几字节的编码。

下图就是HTTP响应包,浏览器知道自己的编码字符集,就可以顺利解码。

URL 简介

概述

URL 是“统一资源定位符”(Uniform Resource Locator)的首字母缩写,中文译为“网址”,表示各种资源的互联网地址。下面就是一个典型的 URL。

所谓资源,可以简单理解成各种可以通过互联网访问的文件,比如网页、图像、音频、视频、JavaScript 脚本等等。只有知道了它们的 URL,才能在互联网上获取它们。

只要资源可以通过互联网访问,它就必然有对应的 URL。一个 URL 对应一个资源,但是同一个资源可能对应多个 URL。

URL 是互联网的基础。互联网之所以“互联”,就是因为网页可以通过“链接”(link),包含其他 URL。用户只要点击,就可以从一个 URL 跳转到另一个 URL,前往不同的网站。

网址的组成部分

URL 由多个部分组成。下面是一个比较复杂的 URL,实际的 URL 通常不会有这么多部分。

我们看看,这个 URL 的各个部分。

协议

协议(scheme)是浏览器请求服务器资源的方法,上例是https://的部分,表示使用 HTTPS 协议。

互联网支持多种协议,必须指明网址使用哪一种协议,默认是 HTTP 协议。也就是说,如果省略协议,直接在浏览器地址栏输入www.example.com,那么浏览器默认会访问http://www.example.com。HTTPS 是 HTTP 的加密版本,出于安全考虑,越来越多的网站使用这个协议。

HTTP 和 HTTPS 的协议名称后面,紧跟着一个冒号和两个斜杠(://)。其他协议不一定如此,邮件地址协议mailto:的协议名后面只有一个冒号,比如mailto:foo@example.com。

主机

主机(host)是资源所在的网站名或服务器的名字,又称为域名。上例的主机是www.example.com。

有些主机没有域名,只有 IP 地址,比如192.168.2.15。这种情况常常出现在局域网。

端口

同一个域名下面可能同时包含多个网站,它们之间通过端口(port)区分。“端口”就是一个整数,可以简单理解成,访问者告诉服务器,想要访问哪一个网站。HTTP 协议的默认端口是80,如果省略了这个参数,服务器就会返回80端口的网站。

端口紧跟在域名后面,两者之间使用冒号分隔,比如www.example.com:80。

路径

路径(path)是资源在网站的位置。比如,/path/index.html这个路径,指向网站的/path子目录下面的网页文件index.html。

互联网的早期,路径是真实存在的物理位置。现在由于服务器可以模拟这些位置,所以路径只是虚拟位置。

路径可能只包含目录,不包含文件名,比如/foo/,甚至结尾的斜杠都可以省略。这时,服务器通常会默认跳转到该目录里面的index.html文件(即等同于请求/foo/index.html),但也可能有其他的处理(比如列出目录里面的所有文件),这取决于服务器的设置。一般来说,访问www.example.com这个网址,很可能返回的是网页文件www.example.com/index.html。

查询参数

查询参数(parameter)是提供给服务器的额外信息。参数的位置是在路径后面,两者之间使用?分隔,上例是?key1=value1&key2=value2。

查询参数可以有一组或多组。每组参数都是键值对(key-value pair)的形式,同时具有键名(key)和键值(value),它们之间使用等号(=)连接。比如,key1=value就是一个键值对,key1是键名,value1是键值。

多组参数之间使用&连接,比如key1=value1&key2=value2。

锚点

锚点(anchor)是网页内部的定位点,使用#加上锚点名称,放在网址的最后,比如#anchor。浏览器加载页面以后,会自动滚动到锚点所在的位置。

锚点名称通过网页元素的id属性命名,详见《元素的属性》一章。

URL 字符

URL 的各个组成部分,只能使用以下这些字符。

26个英语字母(包括大写和小写)

10个阿拉伯数字

连词号(-)

句点(.)

下划线(_)

此外,还有18个字符属于 URL 的保留字符,只能在给定的位置出现。比如,查询参数的开头是问号(?),也就是说,问号只能出现查询参数的开头,出现在其他位置就是非法的,会导致网址解析错误。网址的其他部分如果要使用这些保留字符,必须使用它们的转义形式。

URL 字符转义的方法是,在这些字符的十六进制 ASCII 码前面加上百分号(%)。下面是这18个字符及其转义形式。

!:%21

#:%23

$:%24

&:%26

':%27

(:%28

):%29

*:%2A

+:%2B

,:%2C

/:%2F

::%3A

;:%3B

=:%3D

?:%3F

@:%40

[:%5B

]:%5D

举例来说,有一个网页的 URL 是foo?bar.html,即文件里面包含一个问号,那么需要写成foo%3Fbar.html。

URL 的合法字符,其实也可以采用这种转义方法,但是不建议使用。比如,字母a的十六进制 ASCII 码是61,转义形式后就是%61。因此,www.apple.com又可以写成www.%61pple.com,浏览器一样识别。

值得注意的是,空格的转义形式是%20。对于那些包含空格的文件名,这个转义是必须的。

既不属于合法字符、也不属于保留字符的其他字符(比如汉字),理论上不需要手动转义,可以直接写在 URL 里面,比如www.example.com/中国.html,浏览器会自动将它们转义,发给服务器。转义方法是使用这些字符的十六进制 UTF-8 编码,每两位算作一组,然后每组头部添加百分号(%)。

举例来说,汉字中的 UTF-8 十六进制编码是e4b8ad,每两个字符一组,URL 转义后就为%e4%b8%ad。也就是说,URL 里面凡是有汉字中的地方,都要写成%e4%b8%ad。因此,访问www.example.com/中国.html这个网址,需要写成下面的样子。

上面代码中,中的转义形式是%e4%b8%ad,国是%e5%9b%bd。

绝对 URL 和相对 URL

URL 分成两种:绝对 URL 和相对 URL。

绝对 URL 指的是,只靠 URL 本身就能确定资源的位置。这意味着,URL 必须带有资源的完整信息,包含协议、主机、路径等部分。前面的例子都是绝对 URL。

相对 URL 指的是,URL 不包含资源位置的全部信息,必须结合当前网页的位置,才能定位资源。比如,当前网页的 URL 是https://www.example.com/path/index.html,该网页上面有一个资源,URL 指向a.html,这个就是相对 URL。因为只知道a.html,并不能定位资源。浏览器假定,a.html与当前网址在同一个子目录下面,从而得到绝对 URL https://www.example.com/path/a.html

相对 URL 如果以斜杠(/)开头,就表示网站的根目录。否则,必须以当前目录为起点,推算资源的位置。比如,相对 URL /foo/bar.html表示网站根目录的子目录foo,foo/bar.html表示在当前目录的foo子目录。

URL 还可以使用两个特殊简写,表示特定位置。

.:表示当前目录,比如./a.html(当前目录下的a.html文件)

..:表示上级目录,比如../a.html(上级目录下的a.html文件)

这两种简写可以多个连用,比如../../表示上两级目录。

绝对 URL 也可以使用这两个简写,比如www.example.com/./index.html等同于www.example.com/index.html,这时.相当于根目录的当前目录,即根目录本身。

<base>

<base>标签指定网页内部的所有相对 URL 的计算基准。整张网页只能有一个<base>标签,而且只能放在<head>里面。它是单独使用的标签,没有闭合标签,下面是一个例子。

<base>标签的href属性给出计算的基准网址,target属性给出如何打开链接的说明(参见《链接》一章)。已知计算基准是https://www.example.com/files/,那么相对 URL foo.html,就可以转成绝对 URL https://www.example.com/files/foo.html

注意,<base>标签必须至少具有href属性或target属性之一。

一旦设置了<base>,就对整个网页都有效。如果要改变某个链接的行为,只能用绝对链接替代相对链接。尤其需要注意锚点,这时锚点也是针对<base>计算的,而不是针对当前网页的 URL。

urlcode

urlcode 的简介

urlcode 是一种编码方式,就是把http请求串的url 进行urlcode的编码,让httpserver 可以识别,不至于http的client、server 之前出现乱码或者误解。

把为什么要用urlcode进行编码呢

因为在把字符串用url方式传送给httpserver时,字符串中不能出现中文和特殊字符(空格、换行符);

所以要对url 进行urlcode

每一个中文字符都有一个urlcode 编码

每一个特殊字符都有一个urlcode编码

可以在 urlcode 在线工具进行查看: UrlEncode编码/UrlDecode解码 - 站长工具

英文的urlcode 是本身,不会变化

urldecode 的原理

当httpserver 收到client 发送过来的url后,首先进行urldecode进行urlcode 的解析,获取到最原始的query后再进行代码逻辑实现

哭护短在进行网页请求时,可能会传送一些非ASCII码的内容,而这种输入在服务器中是不被允许的,需要用URLEncode编码地址,将亡之众的非ASCII码转为可以传输的字符.

不会被编码的内容:

1.大写字母A-Z

2.小写字母a-z

3.数字 0-9

4.标点符 - _ . ! ~ * ’ (和 ,)

urlcode格式

%+一个十六进制字符

URLEncode

对汉字以及特殊字符进行编码.称为百分号编码,也称作URL编码,是“统一资源定位符”的编码机制.

转换规则

1.此字符串中除了-_.之外的所有非字母数字字符都会被替换成百分号(%)后跟两位十六进制数

2.空格则编码为加号(+)

1

2

当你在浏览器里输入某个url…

当client接收到符合urlcode编码范围的字符时,对其进行url编码.

当httpserver 收到client 发送过来的url后,首先对所有符合urlcode解码标准的urlcode进行解析,获取到最原始的query后再进行代码逻辑实现

简介

编码(encode)和解码(decode)是相当广泛的话题,设计计算机对信息处理的方式,常见于加解密中,当然学习WEB也要了解一些常见的编码,可在攻击中使用编码绕过。

ASCII编码

ASCII (American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。

到目前为止共定义了128个字符:

常见ASCII码的大小规则:0~9<A~Z<a~z。

1)数字比字母要小。如 “7”<“F”;

2)数字0比数字9要小,并按0到9顺序递增。如 “3”<“8” ;

3)字母A比字母Z要小,并按A到Z顺序递增,如“A”<“Z” ;同理,字母a比字母z要小,“a”<“z”;

4)同个字母的大写字母比小写字母要小32。如“A”<“a” ;

几个常见字母的ASCII码大小: “0”为 48“、A”为65、“a”为97

当然,不在ASCII码表上的也可以转为ASCII码,例如,汉字,一般汉字是由两个ASCII码表示的,例如,下图的“好”,对应的ASCII码表的十六进制为"0x597d"。

URL与URL编码

URL详解

URL(Uniform Resource Locator,统一资源定位器、定位地址,俗称网页地址,简称网址),是因特网上标准的资源地址,如同在网络上的门牌。

完整格式如下:

scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]

博主翻译为:

[协议类型]://[用户名[:密码]]@[服务器地址]:[端口号]/[资源层级UNIX文件路径][文件名]?[查询]#[片段ID]

协议类型:常见的有http、https,还有ftp、file、mailto、data等。

用户名、密码:这没什么好解释的,就是字面意思。

服务器地址:有的时候你在URL上看到的是域名,其实会通过DNS转为IP地址,所以还是服务器IP地址。

端口号:常见80、443、21、22等。

资源层级文件路径:大部分会隐藏,就是服务器的目录路径,使用"/"区别每一层。

文件名:如访问网页,可能是xxx.htm、xxx.html、xxx.php等,例如,index.html。

查询:使用"&"连接

片段ID:有的时候被称为“锚点”,一般是指CSS中的id,就是使用浏览器调试时看到的id属性,有时也可通过这个进行XSS或sql注入。

其中[用户名[:密码]]、[端口号]、[查询]、[片段ID]都属于选填项。

举例,百度搜索“URL”

https:协议类型

www.baidu.com:域名,会转为ip

本质上都是转为IP,我们修改为前面的110.242.68.3。

可以看到右侧滑块在最下方,浏览器直接显示到后面。CSDN的目录也是这个原理,鼠标放在文章的目录上,会显示文章的URL#tx,x从0开始编号。

URL编码

任何URL编码的字符都以%作为前缀,有时也称URL编码为百分号编码。

URL编码表

来自 <网络安全-WEB中的常见编码_网络安全代码大全_lady_killer9的博客-CSDN博客>

 对”你好“进行URL编码,得到“%E4%BD%A0%E5%A5%BD”,汉字一般是三个百分号编码,将上访url中的“你好”换为“%E4%BD%A0%E5%A5%BD”会得到同样的页面。在进行攻击,比如sql注入时,可能会过滤and、select等sql关键字,有时可通过URL编码绕过。

使用网站:Jsons.cn

Unicode编码

Unicode编码,又称万国码、国际码、统一码,是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。Unicode 编码共有三种具体实现,分别为utf-8,utf-16,utf-32,其中utf-8占用一到四个字节,utf-16占用二或四个字节,utf-32占用四个字节。

UTF-8的特点是对不同范围的字符使用不同长度的编码。

UTF-16编码以16位无符号整数为单位。我们把Unicode编码记作U。前缀写为\u、%u。

UTF-32编码以32位无符号整数为单位。

Unicode编码与ASCII编码不兼容,但可以转换。

HTML编码

使用标签<meta>,例如

<meta charset="utf-8">

除了utf-8,常见的还有

GB2312

发布于1980年,基本集共收入汉字6763个和非汉字图形字符682个。整个字符集分成94个区,每区有94个位。每个区位上只有一个字符,一个字符占两个字节。

GBK

GBK全称《汉字内码扩展规范》(GBK即“国标”、“扩展”汉语拼音的第一个字母,英文名称:Chinese Internal Code Specification),发布于1995年,GBK 向下与 GB2312 编码兼容。

没找到合适的网站,这个网站也只能一个字,还不如自己敲代码呢。

汉字进行GBK和Unicode编码

编码原理,先转为ASCII,两个一组,转为2进制,4个一组,转为10进制,查表即可。

使用网站:一个工具箱-Base16

Base32

使用网站:一个工具箱-Base32

Base64

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。3个字节相当于24个比特,对应于4个Base64单元,即3个字节可由4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,另外两个一般为“+”、"/"。使用“=”作为后缀,如果不够三个字节,即“=”个数为0、1、2。

使用网站:jsons.cn

可尝试“你好”、“i love you too”,观察“=”的个数

还有一些,Base 58、Base 62、Base 85、Base 91、Base 100。例如,比特币使用的是Base58,即123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz,去除了容易混淆的0、o、I(大写的i)、l(小写的L)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rek'Sai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值