注意:LANG=zh_CN.UTF-8与LANG=en_US.UTF-8不可混淆!

LANG=zh_CN.UTF-8与LANG=en_US.UTF-8有区别 , 所以不可混淆!想之前在python2时代吃过坑,没想到到了统一unicode的python3,因环境不一致也能导致编码问题!

当时环境与功能:

vps系统是ubutnu 14.04, 相关软件python3.4, selenium3+, chrome66, chromedriver。使用crontab启动shell, shell中启动python脚本, 脚本中selenium启动chrome,……

出bug的运行流程:

  1. crontab中的a.sh启动 LANG=zh_CN.UTF-8 bash a.sh
  2. a.sh末尾调用”b中文名.py”, 带中文参数”《xxx》”
  3. b中文.py 中print(参数1) 会异常显示字符串编码问题’ascii’ codec can’t encode characters

调试发现:

  1. print repr(中文参数1), 会打印\udc 开头的而非\x开头的utf8型编码。
  2. 比如”《” 正常编码是 ‘\xe3\x80\x8a’, 此处确是打印了’\udce3\udc80\udc8a’ 。
  3. 改变逻辑,直接ssh到vps并执行 b中文.py 《xxx》 没有问题!

问题定位:

  1. 个人本机ubuntu系统测试不会出现bug,vps才出现,所以应该是shell环境或者是python环境问题。
  2. 打印执行a.sh的shell环境,对比发现本机有LANG=zh_CN.UTF-8和LANGUAGE=zh_CN:zh,vps仅有LANG=zh_CN.UTF-8。
  3. 把crontab中强加的环境变量LANG=zh_CN.UTF-8去掉,此时a.sh的环境变量为LANG=en_US.UTF-8, vps恢复正常。(2小时排查出结果了!)
  4. 总结: 之前觉得LANG=zh_CN.UTF-8与LANG=en_US.UTF-8没什么不同,从此改观。

问题解决:

去掉LANG=zh_CN.UTF-8,之后执行过程中会自动变成默认LANG=en_US.UTF-8

原因探究:

待定

python repr输出udc开头字符串, print(参数)导致异常

'/home/maskuser/path/to/ts/\udce3\udc80\udc8a\udce9\udc80\udc97.....mp4'

Traceback (most recent call last):
  File "/home/maskuser/pathtodir/script/20181105\udce8\udca7\udc86\.....py", line 73, in <module>
    video_upload_testsite(*sys.argv[1:])
  File "/home/maskuser/pathtodir/script/20181105\udce8\udca7\udc86\.....py", line 29, in video_upload_testsite
    print (videopath)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 27-50: ordinal not in range(128)


原文出自发表的https://blog.pythonwood.com/2018/11/神奇的环境bug导致python3中出现udc开头字符串/



扩展阅读