ipython和python以不同的方式处理我的字符串,为什么?

时间:2011-09-29 06:45:13

标签: python string unicode encoding ipython

在python(2.7.1)中:

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

而在ipython:

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

这里发生了什么?


编辑:包括以下评论中要求的其他信息

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

2 个答案:

答案 0 :(得分:5)

@ 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 字符,您可以看到:

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)

答案 1 :(得分:1)

如果你这样做

import sys
sys.getdefaultencoding()

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

您可以执行的另一项测试是键入以下内容以将其作为默认语言环境

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

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