如何使用中文字符串作为bash中另一个命令的输入?

如何使用中文字符串作为bash中另一个命令的输入?

我目前正在使用命令将一些汉字转换为拼音,这要求 bash 中的字符串是 Unicode 安全的,并将结果放入另一个变量中。我可以正常运行以下命令:

  chinese="你好"
  to-pinyin.py $chinese

它将按预期打印输出,但是,由于我希望输出在变量中,所以我尝试执行以下操作:

  chinese="你好"
  pinyin=$(to-pinyin.py $chinese)

python 将失败并显示:

Traceback (most recent call last):
  File "/~/to-pinyin.py", line 31, in <module>
    print pinyin.get(hanzi, delimiter=" ").capitalize()
UnicodeEncodeError: 'ascii' codec can't encode character u'\u01d0' in position 1: ordinal not in range(128)

反引号也会发生同样的情况。我想我将通过将输出写入文件并在那里进行转换来解决,然后将字符串加载到变量中。我还能如何解决此问题以避免出现解决方法?

编辑:

这里每个请求是语言环境的输出:

$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

使用的解决方案

感谢muru的回复和一些帮助这个另一个答案我添加.encode('utf-8')到 python 脚本中打印字符串的末尾。

我希望我可以切换到python3,但是那里没有默认的拼音包,而且我似乎无法安装任何好的拼音包来让我在python3中快速完成工作。我记得尝试了一段时间,但 python3 一直拒绝导入我安装的包,所以我只是在 python2 中安装了一个包,它开箱即用。

答案1

这是一个问题Python 2 的print,以及支持 Python 3 一致的 Unicode 处理的理由。

现在为什么重定向到文件会导致问题?这是因为 print()在python2中被特殊对待。而 python 中的其他类似文件的对象总是转换为ASCII码除非你以不同的方式设置它们,使用print()输出到终端将使用用户的区域设置进行转换,然后再将输出发送到终端。什么时候print()不输出到终端(例如,重定向到文件),print()决定它不知道该文件使用什么区域设置,因此它尝试转换为ASCII码反而。

相关内容