在升级到EL Capitan后,SSH到远端的Server,运行Python脚本处理数据。结果脚本报告出现异常:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 18-21: ordinal not in range(128)
出现异常的地方是如下代码:
print(app[‘name’], file=f) # 将app的名称(可能含有中文)打印到文件中。
脚本没有改动过,怎么会出现UnicodeEncodeError呢?肯定是和系统升级有关。Google搜索时发现了下面这篇有用的Blog。
系统升级后locale设置有所变化:LANG和LC_CTYPE变为了en_AU.UTF-8。当ssh到server时,会把locale信息传给sshd,然后sshd根据locale信息来设置ssh session,由此会影响python的编解码。sys.stdout.encoding自动设置为'ANSI_X3.4-1968’。
SSH时使用“-vvv”选项打印出Debug信息后,发现果然会传locale信息。
debug1: Sending env LC_CTYPE = en_AU.UTF-8
解决方法就是在bashrc或bash_profile中更新如下环境变量,使SSH客户端和服务器端保持一致:
export LANG=en_US.UTF-8
export LC_CTYPE=en_US.UTF-8
export LC_ALL=en_US.UTF-8