Bash中等效于Python的字符串字面量进行utf字符串转换

1 投票
2 回答
1157 浏览
提问于 2025-04-16 00:54

我正在写一个bash脚本,需要处理包含特殊字符的html,比如@!'ó。目前我的脚本已经运行了,但它对这些特殊字符要么不理会,要么出错,因为服务器返回这些字符时是以十进制unicode的形式,比如'。我已经找到了如何解析这些字符并转换成十六进制,然后加载到python中再转换回它们的符号。我想知道bash是否可以直接完成这个最后的转换。以下是一个在python中的简单示例:

print ur"\u0032" ur"\u0033" ur"\u0040"

输出结果是

23@

我能在Bash中实现同样的结果吗?我查过iconv,但我觉得它可能无法满足我的需求,或者更可能的是我不知道怎么用。

这里有一些相关的信息:

Python字符串字面量

Python中的十六进制到UTF转换

以下是一些预期的输入输出示例。

Ludwig van Beethoven - 5th Symphony and 6th Symphony ''Pastoral'' - Boston Symphony Orchestra - Charles Munch

Ludwig van Beethoven - 5th Symphony and 6th Symphony ''Pastoral'' - Boston Symphony Orchestra - Charles Munch

АлисА (Alisa) - Мы вместе. ХХ лет (My vmeste XX let)

АлисА (Alisa) - Мы вместе. ХХ лет (My vmeste XX let)

2 个回答

1

可能的解决方案,比如:

$ function conv() { echo $* | python -c 'import re, sys; print re.sub(r"&#(\d+);", lambda x: unichr(int(x.group(1))), sys.stdin.read()).rstrip()' ; }
$ conv 'АлисА (Alisa)' 
АлисА (Alisa)
2

Bash里的printf这个内置命令不支持Unicode编码,但在我的GNU系统上,外部的printf是支持的:

$ /usr/bin/printf "\u0410\u043b\u0438\u0441\u0410"
АлисА

或者这样做,可以从你的路径中选择printf,以防它不在/usr/bin目录下:

$ $(type -P printf) "\u0410\u043b\u0438\u0441\u0410"
АлисА

或者

$ env printf "\u0410\u043b\u0438\u0441\u0410"
АлисА

撰写回答