【问题标题】:ipython and python are handling my string differently, why?ipython 和 python 处理我的字符串的方式不同,为什么?
【发布时间】:2011-09-29 06:45:13
【问题描述】:

在 python (2.7.1) 中:

>>> x = u'$€%'
>>> x.find('%')
2
>>> len(x)
3

而在 ipython 中:

>>> x = u'$€%'
>>> x.find('%')
4
>>> len(x)
5

这是怎么回事?


编辑:包括从下面的 cmets 请求的附加信息

ipython

>>> import sys, locale
>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.setdefaultencoding(locale.getdefaultlocale()[1])
>>> sys.getdefaultencoding()
'UTF8'
>>> x = u'$€%'
>>> x
u'$\xe2\x82\xac%'
>>> print x
$â¬%
>>> len(x)
5

蟒蛇

>>> import sys, locale
>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.setdefaultencoding(locale.getdefaultlocale()[1])
>>> sys.getdefaultencoding()
'UTF8'
>>> x = u'$€%'
>>> x
u'$\u20ac%'
>>> print x
$€%
>>> len(x)
3

【问题讨论】:

  • 如果你在 CPython 的命令行中输入 x &lt;Enter&gt; 会发生什么?你的 shell 使用什么字符编码?
  • print x 给出$€%,而仅x 给出u'$\u20ac%'
  • sys.stdin.encoding is 'UTF-8'
  • 这肯定是 ipython shell 中的一个错误。不过,它不应该影响您正在运行的程序。损坏的 Unicode 终端通常很常见(只需查看 Windows 控制台...),因此依靠能够以任何语言键入和打印 Unicode 到控制台的能力通常非常不确定。它可以在脚本本身和其他 IO 方法中正常工作。

标签: python string unicode encoding ipython


【解决方案1】:

@nye17 打电话给setdefaultencoding() 正式来说不是一个好主意(出于某种原因,它在首次使用后从 sys 中删除)。一个常见的罪魁祸首是 gtk,它会导致各种问题,所以如果 IPython 已经导入了 gtk,sys.getdefaultencoding() 将返回 utf8。 IPython 本身不设置默认编码。

@wim 请问您使用的是哪个版本的 IPython? 0.11 中的部分重大改进是修复了许多 unicode 错误,但确实会出现更多错误(现在主要是在 Windows 上)。

我在 IPython 0.11 中运行了你的测试用例,IPython 和 Python 的行为看起来确实是一样的,所以我认为这个 bug 已经修复。

相关值:

  • sys.stdin.encoding = utf8
  • sys.getdefaultencoding() = ascii
  • 测试平台:Ubuntu 10.04+Python2.6.5、OSX 10.7+Python2.7.1

至于解释,本质上 IPython 没有认识到输入可以是 unicode。在 IPython 0.10 中,不考虑多字节 utf8 输入,因此每个字节 = 1 character,您可以通过以下方式看到:

In [1]: x = '$€%'

In [2]: x
Out[2]: '$\xe2\x82\xac%'

In [3]: y = u'$€%'

In [4]: y
Out[4]: u'$\xe2\x82\xac%'# wrong!

然而,应该发生什么,以及在 0.11 中发生什么,是 y == x.decode(sys.stdin.encoding),而不是 repr(y) == 'u'+repr(x)

【讨论】:

  • 你是对的,这是一个 ipython 错误.. 我构建了 0.12.dev,它现在是。哦,新的内联 qtconsole 也很酷!!
【解决方案2】:

如果你这样做

import sys
sys.getdefaultencoding()

我认为你会在 python 和 ipython 中得到不同的结果,可能是 ascii,另一个是 utf-8,所以这应该只是每个人选择哪种默认编码的问题。

您可以做的另一个测试是输入以下内容以将其作为您的默认语言环境,

import sys, locale
reload(sys)
sys.setdefaultencoding(locale.getdefaultlocale()[1])
sys.getdefaultencoding()

然后尝试在您的问题中测试x

【讨论】:

  • ipython 和 python 都给我'ascii'。
  • @wim 令人不安。我刚刚在我的 ipython 和 python 中进行了测试,lenprint 给出了与你的 questin 中相同的输出,但我的默认编码不同,一个 ascii,一个 utf-8
  • @wim 你能试试我在答案中编辑的测试吗?基本上是在两个地方强制执行相同的编码,以查看字符串的行为方式是否相同。
  • 在 Notebook 中,sys 模块没有setdefaultencoding() 方法,也没有内置的reload() 方法可用。所以我不知道如何让 unicode 在 IPy Notebook 中工作
猜你喜欢
  • 2011-02-14
  • 2018-08-30
  • 2019-11-04
  • 1970-01-01
  • 2011-11-02
  • 2014-08-14
  • 2021-11-01
  • 1970-01-01
  • 2015-01-04
相关资源
最近更新 更多