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

Iva*_*van 9 character-encoding text-processing unicode text

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

例如“%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B”代表“???????” (俄语中的“资源”)。

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

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

我怀疑这可以用优雅来完成sedperlawk或东西,但不知道怎么办。

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

Liu*_* 刘研 9

使用 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: ???????
Run Code Online (Sandbox Code Playgroud)

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

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

printf ${url_encoded_string//%/\\x}
Run Code Online (Sandbox Code Playgroud)

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


Sté*_*las 5

使用 perl:

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

或与URI::Escape

perl -MURI::Escape -pe '$_=uri_unescape$_'
Run Code Online (Sandbox Code Playgroud)