问题描述

如何在命令行上编码和解码percent-encoded(URL编码)字符串?

我正在寻找可以做到这一点的解决方案:

$ percent-encode "ændrük"

%C3%A6ndr%C3%BCk

$ percent-decode "%C3%A6ndr%C3%BCk"

ændrük

最佳解决思路

这些命令可以满足您的需求:

python -c "import urllib, sys; print urllib.quote(sys.argv[1])" æ

python -c "import urllib, sys; print urllib.unquote(sys.argv[1])" %C3%A6

如果要将空格编码为+,请将urllib.quote替换为urllib.quote_plus。

次佳解决思路

shell

请尝试以下命令行:

$ echo "%C3%A6ndr%C3%BCk" | sed 's@+@ @g;s@%@\\x@g' | xargs -0 printf "%b"

ændrük

您可以将其定义为别名并将其添加到shell rc文件中:

$ alias urldecode='sed "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b"'

然后,每当您需要它时,只需使用:

$ echo "http%3A%2F%2Fwww" | urldecode

http://www

bash

编写脚本时,您可以使用以下语法:

input="http%3A%2F%2Fwww"

decoded=$(printf '%b' "${input//%/\\x}")

但是上面的语法不能正确处理加号(+),因此您需要通过sed用空格替换它们。

您还可以使用以下urlencode()和urldecode()功能:

urlencode() {

# urlencode

local length="${#1}"

for (( i = 0; i < length; i++ )); do

local c="${1:i:1}"

case $c in

[a-zA-Z0-9.~_-]) printf "$c" ;;

*) printf '%%%02X' "'$c"

esac

done

}

urldecode() {

# urldecode

local url_encoded="${1//+/ }"

printf '%b' "${url_encoded//%/\\x}"

}

Note that your urldecode() assumes the data contains no backslash.

bash + xxd

使用xxd工具进行Bash功能:

urlencode() {

local length="${#1}"

for (( i = 0; i < length; i++ )); do

local c="${1:i:1}"

case $c in

[a-zA-Z0-9.~_-]) printf "$c" ;;

*) printf "$c" | xxd -p -c1 | while read x;do printf "%%%s" "$x";done

esac

done

}

Python

尝试定义以下别名:

alias urldecode='python -c "import sys, urllib as ul; print ul.unquote_plus(sys.argv[1])"'

alias urlencode='python -c "import sys, urllib as ul; print ul.quote_plus(sys.argv[1])"'

用法:

$ urlencode "ændrük"

C%26ndrC%3Ck

$ urldecode "%C3%A6ndr%C3%BCk"

ændrük

PHP

使用PHP,您可以尝试以下命令:

$ echo oil+and+gas | php -r 'echo urldecode(fgets(STDIN));' // Or: php://stdin

oil and gas

要不就:

php -r 'echo urldecode("oil+and+gas");'

使用-R进行多行输入。

Perl

在Perl中,您可以使用URI::Escape。

decoded_url=$(perl -MURI::Escape -e 'print uri_unescape($ARGV[0])' "$encoded_url")

或者处理文件:

perl -i -MURI::Escape -e 'print uri_unescape($ARGV[0])' file

sed

使用sed可以通过以下方式实现:

cat file | sed -e's/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g' | xargs echo -e

awk

试试anon解决方案:

awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%..

解码文件名

如果需要从文件名中删除url编码,请使用renameutils中的deurlname工具(例如deurlname *.*)。

也可以看看:

有关:

第三种解决思路

Percent-encode保留URI字符和non-ASCII字符

jq -s -R -r @uri

-s(--slurp)将输入行读入数组,-s -R(--slurp --raw-input)将输入读入单个字符串。 -r(--raw-output)输出字符串的内容而不是JSON字符串文字。

Percent-encode所有人物

xxd -p|tr -d \\n|sed 's/../%&/g'

tr -d \\n删除每60个字符后由xxd -p添加的换行符。

Percent-encode除Bash中的ASCII字母数字字符外的所有字符

eu () {

local LC_ALL=C c

while IFS= read -r -n1 -d '' c

do

if [[ $c = [[:alnum:]] ]]

then

printf %s "$c"

else

printf %%%02x "'$c"

fi

done

}

如果没有-d '',这将跳过换行符和空字节。如果没有IFS=,这将用%00替换IFS中的字符。没有LC_ALL=C,这将例如用UTF-8场所中的%3042替换あ。

第四种思路

仅用于解码的纯bash解决方案:

$ a='%C3%A6ndr%C3%BCk'

$ echo -e "${a//%/\\x}"

ændrük

第五种思路

就个人而言,我使用这些别名进行URL编码和解码:

alias urlencode='python -c "import urllib, sys; print urllib.quote( sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1])"'

alias urldecode='python -c "import urllib, sys; print urllib.unquote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1])"'

这两个命令都允许您转换数据,作为命令行参数传递或从标准输入读取,因为one-liners检查是否存在命令行参数(甚至是空参数)并处理它们或者只读取标准输入。

更新2015-07-16(空第1个arg)

……根据@muru评论。

更新2017-05-28(斜杠编码)

如果你还需要对斜杠进行编码,只需在quote函数中添加一个空的第二个参数,然后斜杠也将被编码。

所以,最后Bash中的urlencode别名如下所示:

alias urlencode='python -c "import urllib, sys; print urllib.quote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1], \"\")"'

例子

$ urlencode "Проба пера/Pen test"

%D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test

$ echo "Проба пера/Pen test" | urlencode

%D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test

$ urldecode %D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test

Проба пера/Pen test

$ echo "%D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test" | urldecode

Проба пера/Pen test

$ urlencode "Проба пера/Pen test" | urldecode

Проба пера/Pen test

$ echo "Проба пера/Pen test" | urlencode | urldecode

Проба пера/Pen test

第六种思路

我找到了一个包renameutils,它包含实用程序deurlname,它能够重命名包含”percent-encoded”字符的文件。

不幸的是,它不解码stdin或命令行选项,而只重命名文件,因此你必须创建一个虚拟文件来获取解码(重命名文件的名称),但是使用一些bash脚本可以自动化该过程。

没有关于编码部分的信息,即使因为编码哪些字符可能有问题。只有non-ASCII?

我认为应该有一些更好的工具/方法。

参考资料

php指令字符编码,如何在命令行上编码和解码percent-encoded字符串?相关推荐

  1. 命令行实现URL编解码

    命令行实现URL编解码 文章目录 命令行实现URL编解码 1. 实现 2. 原理 2.1 url 的编码规则 2.2 printf 附:参考资料 1. 实现 这里的脚本在 GNU bash, vers ...

  2. 如何用git命令行上传本地代码到github

    如何用git命令行上传本地代码到github 2016年09月19日 16:10:36 阅读数:9337 注意:安装的前提条件是配置好git的相关环境或者安装好git.exe,此处不再重点提及 上传的 ...

  3. 如何在命令行上创建符合特定规范的密码?

    在命令行上创建符合特定规范的密码.大多数网站或应用都要求用户创建带有安全密码的账户,以便他们能够迎合用户体验.虽然这有利于网站开发者,但肯定不会让用户的生活更轻松. 有时,创建密码的规则是如此严格,以 ...

  4. eclipse导入jar包_在命令行上操作JAR,WAR和EAR

    eclipse导入jar包 尽管Java IDE和许多图形工具使查看和操作Java归档文件(JAR,WAR和EAR)文件的内容比以往更加容易,但有时我还是更喜欢使用命令行jar命令来完成这些任务. 当 ...

  5. Linux 在一个命令行上执行多个命令

    Linux 在一个命令行上执行多个命令 1. [ ; ] 如果被分号(;)所分隔的命令会连续的执行下去,就算是错误的命令也会继续执行后面的命令. 2. [ && ] 如果命令被 &am ...

  6. linux脚本求命令行上整数和,shell脚本--cut命令与awk简单使用

    cut:对内容进行列切割 -d 后面的是分割符,表示用什么符号来分割符来分割列,分隔符使用引号括起来: -f后面跟着要选择的字段列,从1开始,表示第一列,如果要多列,可以用逗号分隔 : -c参数后面跟 ...

  7. jar 、war、ear_在命令行上操作JAR,WAR和EAR

    jar .war.ear 尽管Java IDE和许多图形工具使查看和操作Java归档文件(JAR,WAR和EAR)文件的内容比以往更加容易,但有时我还是更喜欢使用命令行jar命令来完成这些任务. 当我 ...

  8. 在命令行上操作JAR,WAR和EAR

    尽管Java IDE和许多图形工具使查看和操作Java归档文件(JAR,WAR和EAR)文件的内容比以往更加容易,但有时我还是更喜欢使用命令行jar命令来完成这些任务. 当我必须重复做某事或作为脚本的 ...

  9. Linux 命令行上执行多个命令(分隔符简介使用)

    Linux 系统可以在一个命令行上执行多个命令,相应的命令行的分隔符简介及使用如下: ; 如果命令被分号(;)所分隔,那么命令会连续的执行下去,就算是错误的命令也会继续执行后面的命令.示例如下: ls ...

最新文章

  1. Linux下ftp+ssl实现ftps
  2. Java反射之将对象转成map
  3. 操作多个表_7_基于子串的连接
  4. (SSO)单点登录原理和总结
  5. Wannafly挑战赛22 B 字符路径 ( 拓扑排序+dp )
  6. hadoop可以解决什么问题_聊一聊,临时工外包可以为企业解决什么问题
  7. ios 静态库合成_iOS : 静态库(.framework)合并
  8. 基于Linux命令行终端的ftp客户端程序
  9. oracle数据如何导入hadoop,hadoop hive 与 Oracle 互相导入数据
  10. append从一个添加到另一_麻城一总投资1.5亿项目开工建设,另一项目预计9月底开工,还有一个年产值14亿的5G项目快速推进中...
  11. python基础教程自学网-Python基础系统管理学习手册视频教程
  12. [开发回忆录]第三方模块的松耦合
  13. python中re是什么库_Python正则表达式和re库知识点总结
  14. 计算机程序设计vb怎么保存,VB编程:读取文本文件和保存文本文件的方法
  15. PC安装Mac系统详解
  16. 應用高解析度線掃描CCD於ITO導電玻璃表面瑕疵檢測之研究
  17. dmac学习之基于shadow register的multi block transfer
  18. 计算机地图制图的优势,计算机地图制图
  19. Ubuntu硬盘挂载
  20. 开源H5选择器UI组件——Picker.js

热门文章

  1. 导航标签位于左侧的纵向选项卡
  2. 全国地区城市行政代码字典表(带城市天气代码)
  3. day01-java基础语法
  4. n_person指针一直为空不知是何原因
  5. ubuntu下常用windows的替代软件
  6. Pregel Worker
  7. android支付宝语音播报,支付宝商家语音播报 PushVoiceBroadcast
  8. 他是香港九龙皇帝,疯狂涂鸦51年,无数次进出警察局,黄家驹都曾为他写歌
  9. AI虚拟主播软件系统 搭建24小时不间断运营的数字人直播间的操作教程分享
  10. NPDP 和PMP 产品经理应该考哪个?