【问题标题】:UnicodeEncodeError in python3python3中的UnicodeEncodeError
【发布时间】:2017-02-28 00:54:54
【问题描述】:

我的一些应用程序库依赖于能够将 UTF-8 字符打印到 stdout 和 stderr。因此这一定不能失败:

print('\u2122')

在我的本地机器上它可以工作,但在我的远程服务器上它会引发UnicodeEncodeError: 'ascii' codec can't encode character '\u2122' in position 0: ordinal not in range(128)

我试过$ PYTHONIOENCODING=utf8,没有明显效果。

sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())

工作了一段时间,然后停止并最终以ValueError: underlying buffer has been detached 失败

sys.getdefaultencoding() 返回'utf-8'sys.stdout.encoding 返回'ANSI_X3.4-1968'

我能做什么?我不想编辑第三方库。

【问题讨论】:

  • 我认为this link 会帮助你。
  • 旁注:即使其他一切正常,PYTHONIOENCODING=utf8 也不会工作,除非你 export 它(或在 Python 启动前加上它)。否则,它是bash 中的局部变量,不会在子进程的环境中继承。 export PYTHONIOENCODING=utf-8 将在bash 中设置和导出它。
  • @SamuelPS:最佳答案的建议是......次优。 Forcibly reloading sys to regain access to setdefaultencoding can cause problems,无论如何,现代 Python (>=3.3) 上的正确解决方案是确保您的系统使用广泛有用的完整 Unicode,支持全局默认编码。其他任何事情都意味着您正在使用 hack 来输出操作系统官方甚至无法识别的字符,并且依赖于它继续播放,尽管它​​声称它不会工作。

标签: python python-3.x unicode utf-8 locale


【解决方案1】:

来自@ShadowRanger 对我的问题的评论,

PYTHONIOENCODING=utf8 除非你 export 它(或在 Python 启动前加上它)才能工作。否则,它是bash 中的局部变量,不会在子进程的环境中继承。 export PYTHONIOENCODING=utf-8 将在bash 中设置和导出它。

export PYTHONIOENCODING=utf-8 成功了,UTF-8 字符不再引发 UnicodeEncodeError

【讨论】:

  • 这行 export PYTHONIOENCODING=utf-8 放在哪里?我阅读了几个类似的问题,但仍然无法理解我应该修改什么文件或脚本
  • @VicNicethemer 在运行 python your_script.py 之前在 bash 中运行 export PYTHONIOENCODING=utf-8
  • 我已经这样做了,不幸的是这并不能解决我的问题
  • 它只适用于stdout/in,但不适用于fileIO,你需要将LC_CTYPE设置为utf-8来处理一切
【解决方案2】:

我猜您使用的是类 UNIX 系统,并且您的环境将 LANG(或 LC_ALL 或其他)设置为 C

尝试编辑默认 shell 的启动文件,将 LANG 设置为 en_US.utf-8(或任何对您有意义的语言环境)?例如,在 bash 中,编辑 ~/.bash_profile(或 ~/.profile,如果您使用它来代替 sh 兼容性)并添加:

export LANG="en_US.utf-8"

对于 (t)csh,编辑 ~/.cshrc(或 ~/.tcshrc,如果您正在使用)以添加:

setenv LANG "en_US.utf-8"

使更改“实时”不起作用,因为您的 shell 可能托管在一个终端中,该终端已根据启动时生效的LANG=C 单独配置为 ASCII 显示(并且许多终端都进行会话合并,因此即使您更改了LANG,然后启动了一个新终端,它也会与过期的LANG 的共享终端进程合并)。因此,在您更改 ~/.bash_profile 后,请注销然后重新登录,这样您的根 shell 将为所有其他进程正确设置 LANG(因为它们最终都来自根 shell 的 fork)。

【讨论】:

  • echo $LANG 默认返回en_US.UTF-8
  • @Mirac7:这并不一定意味着它是在登录时设置的。例如,如果您在 .bashrc 中设置它(并且按照正常设置,.bashrc 不会针对登录 shell 运行),您会在终端中看到它,但终端本身不会看到它。跨度>
猜你喜欢
  • 2016-09-25
  • 1970-01-01
  • 2021-12-17
  • 2017-12-08
  • 1970-01-01
  • 2019-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多