【问题标题】:unicode string tolerance in Eclipse+PyDevEclipse+PyDev 中的 unicode 字符串容差
【发布时间】:2013-06-28 07:05:09
【问题描述】:

我正在使用 Eclipse+PyDev 编写代码,并且在将此代码移至生产环境时经常遇到 unicode 问题。原因在这个小例子中展示了

a = u'фыва '\
'фыва'

如果 Eclipse 看到这一点,它会像什么都没发生一样创建 unicode 字符串,但如果直接向 Python shell(Python 2.7.3) 输入相同的命令,你会得到这个:

SyntaxError: (unicode error) 'ascii' codec can't decode byte 0xd1 in position 0: ordinal not in range(128)

因为正确的代码是:

a = u'фыва '\
u'фыва'

但由于 Eclipse+PyDev 的“宽容”,我总是遇到麻烦 :( 我如何强制 PyDev “遵守规则”?

【问题讨论】:

  • 从 PyDev 运行脚本时检查 sys.version 是 Python 2.x 和 sys.defaultencoding() 是 'ascii'。检查 PyDev 是否​​更改了 sitecustomize、usercustomize 模块。如果它以交互方式运行脚本;检查 PYTHONSTARTUP 环境变量指向的位置
  • @jf-sebastian, sys.version 2.7.3(默认,2012 年 8 月 1 日,05:14:39)[GCC 4.6.3],sys.defaultencoding()——没有这样的功能。
  • sys.getdefaultencoding()
  • @j-f-sebastian,你是对的。 shell 中的默认编码是“ascii”,PyDev 中的默认编码是“UTF-8”。如何在 Eclipse 中更改它?
  • 我将编码更改为 US-ASCII,但这没有帮助。

标签: python eclipse unicode pydev


【解决方案1】:

这是因为控制台的编码是 utf-8。

目前无法在 UI 中进行全局设置,但您可以通过编辑进行更改:\plugins\org.python.pydev_2.7.6\pysrc\pydev_sitecustomize\sitecustomize.py

只需删除对以下内容的调用:(第 108 行)sys.setdefaultencoding(encoding)

【讨论】:

    【解决方案2】:

    这个问题应该在 PyDev 3.4.0(尚未发布)中得到修复。 Fabio(PyDev 维护者)说:“从现在开始,PyDev 将只设置 PYTHONIOENCODING 而不会再更改默认编码”。从 Python 2.6 开始支持 PYTHONIOENCODING

    这里是commit on GitHub

    【讨论】:

      【解决方案3】:

      尝试将# -*- coding: utf-8 -*- 添加为源文件的第一行。它应该使 Python 正常运行。

      【讨论】:

      • 您是否在自己的代码中或对于来自外部来源的数据出现此错误?前任用于从文件读取、从网络表单或数据库接收的数据。
      • 没有外部来源,也没有错误。问题是没有这个错误!
      【解决方案4】:

      这在我的源代码中为我解决了这个问题,而无需修改 pydev sitecustomize.py 文件:

      import sys
      reload(sys).setdefaultencoding("utf-8")
      

      您可以使用“ascii”或您想使用的任何其他编码。

      就我而言,当我在命令行上运行程序时,PyDev 使用的是“utf-8”,而控制台错误地设置了“ascii”。

      【讨论】:

      • 谢谢,但我决定改用 PyCharm,我再也没有这个问题了
      【解决方案5】:

      这可能不是您要问的。但就我而言,我意外地从各种来源复制了我的代码,得到了这些 UTF-8 字符。为了找出我在 Eclipse Mars 中惹麻烦的角色:

      Edit->set encoding
      other->US ASCII
      

      然后我尝试保存我的文件。我有模态窗口告诉我“保存问题”。有按钮"Select First Character" 它向我展示了令人不安的字符,我只是删除了该字符并输入了 ASCII 字符。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-30
        • 2019-05-12
        • 2011-03-02
        • 2019-09-23
        相关资源
        最近更新 更多