Unix/Bash命令行(不使用sed)如何将URL ASCII编码转成UTF-8字符?
解决HTML实体转UTF-8字符的简洁命令行方案
如果你不想写繁琐的sed正则来处理{这类十进制HTML实体,下面几个管道友好的方案能帮你快速搞定,都是用现成的工具,不用自己造轮子:
1. Perl 一行命令(推荐,大部分系统默认支持)
Perl的HTML::Entities模块是核心库,几乎所有类Unix系统都预装了,它能自动识别并解码所有HTML实体(包括十进制、十六进制以及命名实体)。
用法直接管道就行:
curl your-target-url | perl -MHTML::Entities -pe 'decode_entities($_)'
比如你的输入:
GET v2.12/...?fields={fieldname_of_type_Tab} HTTP/1.1
经过这个命令处理后,就会输出:
GET v2.12/...?fields={fieldname_of_type_Tab} HTTP/1.1
2. Python 一行命令(跨平台友好)
Python3的标准库html模块自带unescape函数,同样能处理各种HTML实体,适合没有Perl或者更熟悉Python的场景:
curl your-target-url | python3 -c "import sys, html; print(html.unescape(sys.stdin.read()), end='')"
end=''是为了避免额外多输出一个换行符,保持和原输入一致的格式。
3. recode 工具(极简但可能需要安装)
如果你的系统能安装额外工具,recode是更简洁的选择,它专门做字符编码转换,支持HTML实体转UTF-8:
首先安装(以Debian/Ubuntu为例):
sudo apt install recode
然后使用管道:
curl your-target-url | recode html..utf8
为什么这些方案比sed好?
sed需要手动写正则匹配&#(\d+);,然后通过复杂的替换逻辑把数字转换成对应字符,不仅要处理十进制,还要考虑十六进制实体(比如{),代码冗长且容易漏情况。而上面的工具都是专门为处理HTML实体设计的,能覆盖所有合法的HTML实体格式,省心又可靠。
内容的提问来源于stack exchange,提问作者Goldfish
相关产品推荐
相关产品推荐

