【问题标题】:Bash equivalent to Python's string literal for utf string conversionBash 相当于 Python 的字符串文字,用于 utf 字符串转换
【发布时间】:2010-07-07 00:20:29
【问题描述】:

我正在编写一个 bash 脚本,该脚本需要解析包含特殊字符(例如 @!'ó)的 html。目前我正在运行整个脚本,它忽略或触发这些查询,因为它们以十进制 unicode 从服务器返回,如下所示:'。我已经想出了如何解析并转换为十六进制并将它们加载到 python 中以将它们转换回它们的符号,我想知道 bash 是否可以本地进行最终转换。 python中的简单示例:

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

打印出来

23@

我可以在 Bash 中获得相同的结果吗?我研究了 iconv,但我认为它不能做我想做的事,或者更可能我只是不知道怎么做。

以下是一些相关信息:

Python String Literals

Hex to UTF conversion in Python

这里有一些预期输入输出的例子。

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)

【问题讨论】:

  • 你不能从那个 bash 脚本调用 python 或 perl 来处理字符串?
  • 几乎完成了:echo 'АлисА (Alisa)' | perl -pe 's/&#(\d+);(?{$x=sprintf("%04x", int($1))})/\N{U+$x}/g' 不幸的是,$x 转换存在一些问题,因此 unicode 字符是错误的

标签: python bash utf-8


【解决方案1】:

Bash 中的 printf 内置不支持 Unicode 代码,但外部 printf(至少在我的基于 GNU 的系统上)支持:

$ /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"
АлисА

【讨论】:

  • Dennis Williamson:这比将字符串发送到一些 python/perl/whatever one-liner 要好得多
  • 谢谢!我认为它不应该像我想象的那么难,但现在我正在研究 python,它看起来相当有吸引力。
  • 更不用说有人已经制作了模块来编码和解码 html。
【解决方案2】:

可能的解决方案,例如:

$ 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)

【讨论】:

  • 如果出现UnicodeEncodeError,则在import re, sys;之后添加reload(sys); sys.setdefaultencoding("UTF-8");
  • 谢谢!我还是编程新手,不知道调用python或其他语言是否会导致大量使用系统资源?
  • @teratomata 是的,它很慢。启动例如perl 比 python 胖得多。但我仍然会比你可以直接在 bash (echo) 中执行它要慢
猜你喜欢
  • 1970-01-01
  • 2021-07-15
  • 2014-03-07
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 2016-03-23
  • 2019-02-21
  • 1970-01-01
相关资源
最近更新 更多