php指令字符编码,如何在命令行上编码和解码percent-encoded字符串?
问题描述
如何在命令行上编码和解码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字符串?相关推荐
- 命令行实现URL编解码
命令行实现URL编解码 文章目录 命令行实现URL编解码 1. 实现 2. 原理 2.1 url 的编码规则 2.2 printf 附:参考资料 1. 实现 这里的脚本在 GNU bash, vers ...
- 如何用git命令行上传本地代码到github
如何用git命令行上传本地代码到github 2016年09月19日 16:10:36 阅读数:9337 注意:安装的前提条件是配置好git的相关环境或者安装好git.exe,此处不再重点提及 上传的 ...
- 如何在命令行上创建符合特定规范的密码?
在命令行上创建符合特定规范的密码.大多数网站或应用都要求用户创建带有安全密码的账户,以便他们能够迎合用户体验.虽然这有利于网站开发者,但肯定不会让用户的生活更轻松. 有时,创建密码的规则是如此严格,以 ...
- eclipse导入jar包_在命令行上操作JAR,WAR和EAR
eclipse导入jar包 尽管Java IDE和许多图形工具使查看和操作Java归档文件(JAR,WAR和EAR)文件的内容比以往更加容易,但有时我还是更喜欢使用命令行jar命令来完成这些任务. 当 ...
- Linux 在一个命令行上执行多个命令
Linux 在一个命令行上执行多个命令 1. [ ; ] 如果被分号(;)所分隔的命令会连续的执行下去,就算是错误的命令也会继续执行后面的命令. 2. [ && ] 如果命令被 &am ...
- linux脚本求命令行上整数和,shell脚本--cut命令与awk简单使用
cut:对内容进行列切割 -d 后面的是分割符,表示用什么符号来分割符来分割列,分隔符使用引号括起来: -f后面跟着要选择的字段列,从1开始,表示第一列,如果要多列,可以用逗号分隔 : -c参数后面跟 ...
- jar 、war、ear_在命令行上操作JAR,WAR和EAR
jar .war.ear 尽管Java IDE和许多图形工具使查看和操作Java归档文件(JAR,WAR和EAR)文件的内容比以往更加容易,但有时我还是更喜欢使用命令行jar命令来完成这些任务. 当我 ...
- 在命令行上操作JAR,WAR和EAR
尽管Java IDE和许多图形工具使查看和操作Java归档文件(JAR,WAR和EAR)文件的内容比以往更加容易,但有时我还是更喜欢使用命令行jar命令来完成这些任务. 当我必须重复做某事或作为脚本的 ...
- Linux 命令行上执行多个命令(分隔符简介使用)
Linux 系统可以在一个命令行上执行多个命令,相应的命令行的分隔符简介及使用如下: ; 如果命令被分号(;)所分隔,那么命令会连续的执行下去,就算是错误的命令也会继续执行后面的命令.示例如下: ls ...
最新文章
- Linux下ftp+ssl实现ftps
- Java反射之将对象转成map
- 操作多个表_7_基于子串的连接
- (SSO)单点登录原理和总结
- Wannafly挑战赛22 B	字符路径 ( 拓扑排序+dp )
- hadoop可以解决什么问题_聊一聊,临时工外包可以为企业解决什么问题
- ios 静态库合成_iOS : 静态库(.framework)合并
- 基于Linux命令行终端的ftp客户端程序
- oracle数据如何导入hadoop,hadoop hive 与 Oracle 互相导入数据
- append从一个添加到另一_麻城一总投资1.5亿项目开工建设,另一项目预计9月底开工,还有一个年产值14亿的5G项目快速推进中...
- python基础教程自学网-Python基础系统管理学习手册视频教程
- [开发回忆录]第三方模块的松耦合
- python中re是什么库_Python正则表达式和re库知识点总结
- 计算机程序设计vb怎么保存,VB编程:读取文本文件和保存文本文件的方法
- PC安装Mac系统详解
- 應用高解析度線掃描CCD於ITO導電玻璃表面瑕疵檢測之研究
- dmac学习之基于shadow register的multi block transfer
- 计算机地图制图的优势,计算机地图制图
- Ubuntu硬盘挂载
- 开源H5选择器UI组件——Picker.js