在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
答案 0 :(得分:5)
@ nye17永远调用setdefaultencoding()
是个好主意(首次使用后会因为某种原因从sys中删除)。一个常见的罪魁祸首是gtk,它会导致各种问题,所以如果IPython导入了gtk,sys.getdefaultencoding()
将返回utf8。 IPython本身不设置默认编码。
@wim我可以问你正在使用的是什么版本的IPython? 0.11中的部分重大改进修复了许多unicode错误,但更多的突然出现(现在主要在Windows上)。
我在IPython 0.11中运行了你的测试用例,并且IPython和Python的行为看起来是一样的,所以我认为这个bug是固定的。
相关值:
至于解释,基本上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
的测试。