【发布时间】:2012-01-15 19:50:58
【问题描述】:
考虑下一个例子:
>>> s = u"баба"
>>> s
u'\xe1\xe0\xe1\xe0'
>>> print s
áàáà
我在空闲时使用cp1251 编码,但似乎解释器实际上使用latin1 来创建unicode 字符串:
>>> print s.encode('latin1')
баба
为什么会这样?这种行为有规范吗?
CPython,2.7。
编辑
我真正要找的代码是
>>> u'\xe1\xe0\xe1\xe0' == u'\u00e1\u00e0\u00e1\u00e0'
True
似乎在使用 latin1 编解码器编码 unicode 时,所有小于 256 的 unicode 点都被简单地留下,因此导致我之前输入的字节。
【问题讨论】:
-
你问错问题了。问题不是“Unicode 字符串文字使用什么编码”(一个毫无意义的问题;编码是输入/输出的东西,内部表示显然是可以表示 Unicode 的东西,这就是您需要知道的全部内容)。您真正想知道答案的问题是“为什么 IDLE 会弄乱我的文本编码,它是发生在输入还是输出上,我如何让它做我想做的事?”
-
你是如何定义你的编码的?请参阅python.org/dev/peps/pep-0263 在源文件中定义编码。请也提供您的python版本。根据docs.python.org/howto/unicode.html,使用的默认编码将是 ASCII。 2.4 之前的 Python 版本以欧洲为中心,并假定 Latin-1 作为字符串文字的默认编码
-
@kindall 好吧,afaik,我们确实需要在创建 unicode 对象时进行编码(因为我们不需要字节,而是有意义的字符)。那么为什么解释器不使用我的实际编码来执行字节->字符转换呢?
-
@Gagandeep cp1251 只是我的默认操作系统编码。
-
除非您提供,否则解释器无法知道编码。