如何用纯 UTF-8 文本替换所有百分比编码的 UTF-8 子字符串?

如何用纯 UTF-8 文本替换所有百分比编码的 UTF-8 子字符串?

我有一个 html 文件,其中 URL 中有很多 % 编码的 UTF-8 文本。

例如,“%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B”代表“ресурсы”(俄语中的“资源”)。

任务是将所有此类子字符串替换为可读的 UTF-8 文本。

%为了简化任务,我们可以考虑文件中没有其他符号用法。字母数字可以是大写和小写。

sed我怀疑这可以用、或其他东西来优雅地完成,perlawk不知道如何做。

这个网络应用程序似乎可以用您粘贴在那里的文本来解决问题。

答案1

对于某些系统上的 bash、zsh、GNU echo 或 ksh 的某些实现,只需将echo -e所有%内容替换为\x.

url_encoded_string="%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B"
temp_string=${url_encoded_string//%/\\x}

printf '%s\n' "$temp_string"
# output: \xD1\x80\xD0\xB5\xD1\x81\xD1\x83\xD1\x80\xD1\x81\xD1\x8B

echo -e "$temp_string"
# output: ресурсы

(它假设字符串本身不包含反斜杠字符,并且不是您的echo命令支持的选项之一)

正如@JoshLee 还指出的那样,可以通过直接使用来避免“回声警告”:

printf ${url_encoded_string//%/\\x}

而不是直接在第一个命令后面。

答案2

使用 Perl:

perl -pe 's/%([0-9A-F]{2})/pack"H2",$1/gei'

或者与URI::Escape

perl -MURI::Escape -pe '$_=uri_unescape$_'

答案3

有一个名为的程序convmv可以帮助您。

只需使用convmv --unescape /some_path/target_file.它将进行一次试运行。

确认后,请使用convmv --notest --unescape /some_path/target_file继续。

该程序的主页是:http://j3e.de/linux/convmv/

相关内容