首页 > 其他分享 >URLEncode和Base64

URLEncode和Base64

时间:2023-10-08 09:58:07浏览次数:32  
标签:URLEncode www Base64 E5% base64 url wq print

1. URLEncode和Base64

在我们访问一个url的时候总能看到这样的一种url

https://www.sogou.com/web?query=%E5%90%83%E9%A5%AD%E7%9D%A1%E8%A7%89%E6%89%93%E8%B1%86%E8%B1%86&_asf=www.sogou.com&_ast=&w=01019900&p=40040100&ie=utf8&from=index-nologin&s_from=index&sut=3119&sst0=1630994614300&lkt=0%2C0%2C0&sugsuv=1606978591882752&sugtime=1630994614300

此时会发现, 在浏览器上明明是能看到中文的. 但是一旦复制出来. 或者在抓包工具里看到的. 都是这种%. 那么这个%是什么鬼? 也是加密么?
非也, 其实我们在访问一个url的时候. 浏览器会自动的进行urlencode操作. 会对我们请求的url进行编码. 这种编码规则被称为百分号编码. 是专门为url(统一资源定位符)准备的一套编码规则.
一个url的完整组成:

scheme://host:port/dir/file?p1=v1&p2=v2#anchor
http  ://www.baidu.com/tieba/index.html?name=alex&age=18
    参数: key=value
    服务器可以通过key拿value

此时. 如果参数中出现一些特殊符号. 比如'=' 我想给服务器传递a=b=c这样的参数. 必然会让整个URL产生歧义.
所以, 把url中的参数部分转化成字节. 每字节的再转化成2个16进制的数字. 前面补%.
看着很复杂. 在python里. 直接一步到位

from urllib.parse import urlencode, unquote, quote

# 单独编码字符串
wq = "米饭怎么吃"
print(quote(wq))  # %E7%B1%B3%E9%A5%AD%E6%80%8E%E4%B9%88%E5%90%83
print(quote(wq, encoding="gbk")) # %C3%D7%B7%B9%D4%F5%C3%B4%B3%D4
# 多个数据统一进行编码
dic = {
    "wq": "米饭怎么吃",
    "new_wq": "想怎么吃就怎么吃"
}
print(urlencode(dic))  # wq=%E7%B1%B3%E9%A5%AD%E6%80%8E%E4%B9%88%E5%90%83&new_wq=%E6%83%B3%E6%80%8E%E4%B9%88%E5%90%83%E5%B0%B1%E6%80%8E%E4%B9%88%E5%90%83
print(urlencode(dic, encoding="utf-8"))  # 也可以指定字符集
# 一个完整的url编码过程
base_url = "http://www.baidu.com/s?"
params = {
    "wd": "大王"
}
url = base_url + urlencode(params)
print(url)  # http://www.baidu.com/s?wd=%E5%A4%A7%E7%8E%8B

解码:

s = "http://www.baidu.com/s?wd=%E5%A4%A7%E7%8E%8B"
print(unquote(s))  # http://www.baidu.com/s?wd=大王

2. Base64

base64其实很容易理解. 通常被加密后的内容是字节. 而我们的密文是用来传输的(不传输谁加密啊). 但是, 在http协议里想要传输字节是很麻烦的一个事儿. 相对应的. 如果传递的是字符串就好控制的多. 此时base64就应运而生了. 26个大写字母+26个小写字母+10个数字+2个特殊符号(+和/)组成了一组类似64进制的计算逻辑. 这就是base64了.

import base64

bs = "我要吃饭".encode("utf-8")
# 把字节转化成b64
print(base64.b64encode(bs).decode())

# 把b64字符串转化成字节
s = "5oiR6KaB5ZCD6aWt"
print(base64.b64decode(s).decode("utf-8"))

注意, b64处理后的字符串长度. 一定是4的倍数. 如果在网页上看到有些密文的b64长度不是4的倍数. 会报错
例如,

import base64

s = "ztKwrsTj0b0"
bb = base64.b64decode(s)
print(bb)

# 此时运行出现以下问题
Traceback (most recent call last):
  File "D:/PycharmProjects/rrrr.py", line 33, in <module>
    bb = base64.b64decode(s)
  File "D:\Python38\lib\base64.py", line 87, in b64decode
    return binascii.a2b_base64(s)
binascii.Error: Incorrect padding

解决思路. base64长度要求. 字符串长度必须是4的倍数. 填充一下即可

import base64

s = "ztKwrsTj0b0"
s += ("=" * (4 - len(s) % 4))
print("填充后", s)
bb = base64.b64decode(s).decode("gbk")
print(bb)

标签:URLEncode,www,Base64,E5%,base64,url,wq,print
From: https://www.cnblogs.com/zczhaod/p/17748165.html

相关文章

  • Go每日一库之148:base64Captcha(多种形式验证码)
    Base64captcha几行代码就可以定义自己内容的图形验证码库,支持任意unicode字符的内容.1.文档&DemoEnglish中文文档Playground2.快速上手2.1下载base64Captcha包goget-ugithub.com/mojocn/base64Captcha2.2在您的项目中使用base64Captcha2.2.1实现Store......
  • JavaScript下载base64位文件
    1/**2*下载文件3**/4functiondownloadExcel(base64Data){5varmyBlob=this.base64toBlob(base64Data);6varmyUrl=URL.createObjectURL(myBlob);7varlink=document.createElement("a");8......
  • 需要将svg转换成base64的jpg/png
    /****@param{string}fileName下载的文件名*@param{string}fileType需要转的文件类型png/jpg*@param{string}svgstr输入svg*/functionparseSvg(fileName,fileType,svgstr){//1、创建imgvarimg=docu......
  • golang 对字符串进行base64编解码、md5 编码
    内容来自对chagpt的咨询一、对字符串进行base64编解码base64编码要在Go语言中对字符串进行base64编码,你可以使用标准库中的encoding/base64包。以下是一个简单的示例:packagemainimport( "encoding/base64" "fmt")funcmain(){ data:="Hello,World!" enc......
  • 字符串转16进制,16进制转Base64 哈哈哈 uf65/rn+
    测试:哈哈哈uf65/rn+场景描述:对接java接口,字符串转16进制再转base64;遇到转换不一样问题;后来定位对方编码格式不对; privatevoidTest(){stringstr="哈哈哈";str=GetHexByString(str,Encoding.GetEncoding("GB18030"));//Encodi......
  • delphi Base64转换(加密、解密)
    Base64转换(加密、解密)代码字符串加密、解密usesSystem.NetEncoding;procedureTForm1.Button1Click(Sender:TObject);varstr1,str2:string;begin//加密str1:=TNetEncoding.Base64.Encode('测试数据');Memo1.Lines.Add('加密数据'+str1);//解密s......
  • 使用URLDecoder和URLEncoder对中文进行处理
    一URLEncoder HTML格式编码的实用工具类。该类包含了将String转换为application/x-www-form-urlencodedMIME格式的静态方法。有关HTML格式编码的更多信息,请参阅HTML规范。 对String编码时,使用以下规则: 字母数字字符"a"到"z"、"A"到"Z"和"0"到"9"保持不变......
  • File文件流与base64图片格式转换
    //base64转文件exportfunctionbase64ToFile(base64:any,fileName:string){if(!base64)returnletdata=base64.split(',');lettype=data[0].match(/:(.*?);/)[1];constbstr=window.atob(data[1]);letn=bstr.length;constu8arr=......
  • 【java基础】Token令牌生成 token加密串 生成token Aes加密 Base64加密 JWT 【附
    先看效果:Token令牌-生成工具包括:头部(header)+载荷(payload)+签证(signature) 可以自定义加密盐: 源码:地址一:GitLab地址二:123盘地址三:百度盘提取码:666 ......
  • TypeScript编码解码Base64
    constBase64={  _keyStr:'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=',  _utf8_encode:function(string:string){    string=string.replace(/\r\n/g,'\n')    letutftext=''    ......