命令行实现URL编解码
命令行实现URL编解码
文章目录
- 命令行实现URL编解码
- 1. 实现
- 2. 原理
- 2.1 url 的编码规则
- 2.2 printf
- 附:参考资料
1. 实现
这里的脚本在 GNU bash, version 5.1.4(1)-release (x86_64) 上测试通过。
# 解码
url_decode(){# 加号对应特殊字符空格,单独处理url=${1//+/ }printf "%b\n" "${url//%/\\x}"
}# 编码
url_encode(){# 先无差别编码# 然后对每个字符反解码,如果无需转码,输出原字符,否则输出编码local cfor num in $(echo -n "$1" | xxd -plain | sed -E 's/(..)/\1\n/g' ); doprintf -v c "\x$num"case $c in[a-zA-Z0-9]) ;&[-_.\!\*~]) ;&[\;,/\?:@\&=+$#]) printf "$c" ;;*) printf "%%$num"esacdoneecho ""
}
示例
$ url_encode "https://github.com/chenxizhan1995/lib/tree/master/精通 Spring Boot 42 讲"
https://github.com/chenxizhan1995/lib/tree/master/%e7%b2%be%e9%80%9a%20Spring%20Boot%2042%20%e8%ae%b2
$ url_decode https://github.com/chenxizhan1995/lib/tree/master/%e7%b2%be%e9%80%9a%20Spring%20Boot%2042%20%e8%ae%b2
https://github.com/chenxizhan1995/lib/tree/master/精通 Spring Boot 42 讲
2. 原理
2.1 url 的编码规则
- URL元字符:
;,/?:@&=+$#
,即:
分号(;
),逗号(,
),斜杠(/
),问号(?
),冒号(:
),at(@
),&
,等号(=
),加号(+
),美元符号($
),井号(#
) - 语义字符: 数字字母和
-_.!~*'()
,即:
数字字母(a-zA-Z0-9
),连词号(-
),下划线(_
),点(.
),感叹号(!
),波浪线(~
),星号(*
),单引号('
),圆括号(()
)
对完整的url进行编码处理,是将元字符和语义字符之外的字符都进行转义。
对URL的组件(如路径或参数)进行编码处理,则是将除了语义字符之外的字符进行转义,包括元字符。
编码时,将需要编码的字符以 %hh 的格式表示,其中 hh 是字符的编码对应的两位十六进制数字。
比如空格的ASCII码值为 0X20
,则它编码后就是 %20
;解码就是反过来,把 %20
替换为空格。
例如 http://example.com/ba r/tmp
含有特殊字符空格,编码后就是 http://example.com/ba%20r/tmp
。
另外,空格特别常用,所以直接把空格替换为+,而不是 %20 也是符合规范的,http://example.com/ba+r/tmp
。
所以解码的时候 后两者都解码为 http://exmaple.com/ba r/tmp
。
2.2 printf
printf 是 Linux 的命令,它类似于 C 语言的 printf() 函数,用于格式化输出字符串。
它的格式是 printf 'fmt_str' arg1 arg2 ... argN
。
例如
printf "hello %s, my name is %s\n" Jack Tom
会打印 hello Jack, my name is Tom
。
该命令支持转义序列
- \b \t \n \r \f ’ " \
- 八进制 \n \nn \mnn
- 十六进制 \xhh \uhhhh \Uhhhhhhhh
printf 'hello,\x20world\n'
会输出 hello,<SP>world<LF>
附:参考资料
linux shell实现中文UrlEncode编解码_beeworkshop的博客-CSDN博客_shell urlencode
如何在命令行上编码和解码percent-encoded字符串? - Ubuntu问答
man printf
命令行实现URL编解码相关推荐
- php指令字符编码,如何在命令行上编码和解码percent-encoded字符串?
问题描述 如何在命令行上编码和解码percent-encoded(URL编码)字符串? 我正在寻找可以做到这一点的解决方案: $ percent-encode "ændrük" % ...
- PHP中文URL编解码(urlencode()rawurlencode()
PHP中文URL编解码(urlencode()rawurlencode() PHP中对于URL进行编码,可以使用 urlencode() 或者 rawurlencode(),二者的区别是前者把空格编码 ...
- javascript:URL编解码和父子窗口交互
简单的URL编解码 URL编码使用javascript的escape实现,在后台也可用System.Web.HttpUtility.UrlEncodeUnicode()实现. 在解码时使用javasc ...
- 小工具发布(2008-01-25更新,HTML、URL编解码工具)
(2008-01-25)HTML.URL编解码工具 [介绍文章][访问该工具]
- MSDK手Q邀请透传参数问题:url编解码与base64编解码
最近做MSDK手Q的邀请功能,遇到一个坑,手Q结构化消息分享功能接口如下: /*** @param scene 标识发送手Q会话或者Qzone* eQQScene.QQScene_QZone: 分享到 ...
- win10如何使用命令行通过URL下载文件?
win10如何使用命令行通过URL下载文件? 1.启动powershell 启动powershell有多种方法,介绍两种: 方法一 快捷键win+R,输入powershell,启动powershel ...
- Jva编解码,加密工具类大全(Base64编解码,URL 编解码,sha56_Hmac加密,MD5对字符串进行加密,java自带类实现SHA-256方式加密)
Base64编解码 /*** Base64编码.*/public static String encodeBase64(byte[] input) {return new String(Base64. ...
- Base64、Unicode、URL编解码加解密
由IFTC(工作室链接:https://shequ.codemao.cn/work_shop/10892)制作的编解码加解密的APP 下载链接:https://creation.codemao.cn/ ...
- 常见加密解密和URL编解码
常见加密解密和URL编解码 Base64 概念: 基于64个可打印字符,用于表示二进制数据,使用的字符包括大小写拉丁字母各26个.数字10个.加号+和斜杠/,共64个字符,等号=用来作为后缀用途 2^ ...
最新文章
- 备份----硬盘对拷
- Oracle RAC 环境下的连接管理
- 戴尔官网全网抄底价! 企业级高性能机Vostro仅¥1,999!更有额外福利等你来领!...
- 信息检索报告_iFixR:缺陷报告驱动程序修复
- Java 装饰器模式详解
- 从零点五开始用Unity做半个2D战棋小游戏(七)
- nginx源码初读(8)--让烦恼从数据结构开始(ngx_event)
- 传记 | 我的大学三年-不以物喜,不以己悲
- if else if与if if语句的区别
- 如何使用 Secret?- 每天5分钟玩转 Docker 容器技术(108)
- 解决Centos7安装docker源问题
- 网站性能测试工具 webbench 的安装和使用-linux
- [渝粤教育] 三江学院 财务管理 参考 资料
- Sword38——字符串的排列
- 如何用计算机做大爆炸模拟,法国完成首个宇宙结构计算机模型 模拟大爆炸至今...
- Python极简讲义一本书入门机器学习和数据分析--自学笔记
- 为什么C标识符不能以数字开头
- Java程序编写----个人所得税计算器编写
- 【C语言刷题】青蛙跳台阶
- 新手必读:一个牛人给的java九点建议