path的锅?

用Python进行国际化编码的兄弟对这个错误大抵应该是不陌生的——“UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)”。根据业内“公认”的鄙视链,恭喜老铁们,大家应该都稳稳的占据了第三顺位……不过窃以为这张插图还未画完 ,悬揣接下来的应该是遇到了UnicodeEncodeError依然好似无头苍蝇般执拗的误打误撞吧 ( ̄▽ ̄)ノ 哈哈,skr~~~而止,让我们言归正传。

笔者于近期遇到了这样一个bug,曰:一旦datastore name包含了非英文字符,生成support bundle的过程就会失败并报错。ErrorLog中我们再次重逢了这张熟悉的面孔——UnicodeEncodeError: 'ascii' codec can't encode characters in position 22-23: ordinal not in range(128) 都提示到这份儿上了,还有什么可犹豫的,直接……“等等,我明白了,一定是文件链接导致了path没拿对,不能用abspath获取,而是realpath!”呃……发声的这仁兄一如既往的稳定,妥妥的第四顺位,没毛病!

满足你,来看看abspath跟realpath有啥区别吧,尤其是在应对非英文路径上。首先touch一个文件及其link。

随后编写一个简易的py测试文件并运行。

结果如下。

路径都含有中文,无论是abs还是real打印结果都无任何异常,唯一的不同点在于realpath指向了背后的大佬silva而不是abs中的mc。

所以这真的是path的锅么?心情不错,再免费贴个偏方吧:一钱芯片,二两核桃,炖汤。 得嘞,在完成了每日三捧哏的routine工作后,让我们来直接尝试fix问题吧,示意代码如下。

毫无悬念,问题解决。

面对UnicodeEncodeError这样的问题,尝试总结解决方法如下。

一、在环境变量中,设置PYTHONIOENCODING=utf-8

二、为函数的encoding参数赋值

以python写文件的open方法为例:

三、设置标准输出编码

其实 py2中还提供了另外一个解决办法。

但是这种方法是不建议使用的,或者说是错误的,为什么呢?官方文档这么解释。

Set the current default string encoding used by the Unicode implementation. If name does not match any available encoding, LookupError is raised. This function is only intended to be used by the site module implementation and, where needed, by sitecustomize. Once used by the site module, it is removed from the sys module’s namespace.

从此可见,Python 2 唯一支持的内部编码只有 ASCII,更改其默认编码可能会引发各种奇葩问题。在这里他也说了使用 sys.setdefaultencoding() 的方法是不折不扣的错误,正确的方法应该是修改 stdout 和 stdin 的encoding,还请诸位慎之又慎。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180816G0W16P00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券