Debian终端中的UnicodeEncodeError

时间:2016-01-19 11:44:05

标签: python unicode terminal debian

家伙!我在Debian 7终端试图运行一个python脚本,通过telegram-cli发送消息。以下行给出了一个错误:

check_call(["/usr/local/tg/bin/telegram-cli", "-W", "-k", "/usr/local/tg/tg-server.pub", "-e", msg])

在这一行的末尾,“msg”是一个变量......

错误是这样的:

Traceback (most recent call last):
  File "LogServicos.py", line 60, in <module>
    msg_telegram()
  File "LogServicos.py", line 17, in msg_telegram
    check_call(["/usr/local/tg/bin/telegram-cli", "-W", "-k", "/usr/local/tg/tg-server.pub", "-e", msg])
  File "/usr/local/lib/python3.5/subprocess.py", line 579, in check_call
    retcode = call(*popenargs, **kwargs)
  File "/usr/local/lib/python3.5/subprocess.py", line 560, in call
    with Popen(*popenargs, **kwargs) as p:
  File "/usr/local/lib/python3.5/subprocess.py", line 950, in __init__
    restore_signals, start_new_session)
  File "/usr/local/lib/python3.5/subprocess.py", line 1483, in _execute_child
    restore_signals, start_new_session, preexec_fn)
UnicodeEncodeError: 'ascii' codec can't encode character '\xe7' in position 25: ordinal not in range(128)

使用python 3.5.1,我的debian 15.10上的脚本是完全功能的,与Debian中的相同。

有任何帮助吗?谢谢!

1 个答案:

答案 0 :(得分:0)

传递给telegram-cli的命令行参数包含非ascii字符,在这种情况下msg包含字符ç\xe7)。在* nix上,文件名和命令行参数最后只是字节,因此需要将unicode字符串转换为字节才能使用。

python uses sys.getfilesystemencoding()用于此类转换,通常取决于LANGLC_*环境变量。

对于此程序失败的计算机,默认语言环境仅支持ascii(可能是C语言环境),您可以使用locale命令查看哪一个正确使用。< / p>

要修复此错误,您可以:

  • 编码msg时将其传递给命令行,但只有在telepathy-client不依赖当前语言环境来解释它时才能正常工作,否则你可能会以垃圾字符结束
  • 确保在运行脚本的环境中设置了正确的区域设置。您可以使用locale -a检查系统支持的区域设置,如果列表中没有显示合适的区域设置,则可能需要安装合适的新区域设置(如here或{{3}所述})