为什么Python 2的raw_input输出unicode字符串?

时间:2016-04-26 05:24:30

标签: python input unicode python-2.x

我在Codecademy's Python lesson

上尝试了以下操作
hobbies = []

# Add your code below!
for i in range(3):
    Hobby = str(raw_input("Enter a hobby:"))
    hobbies.append(Hobby)

print hobbies

有了它,它工作正常,但如果相反,我尝试

Hobby = raw_input("Enter a hobby:")

我得到[u'Hobby1', u'Hobby2', u'Hobby3']。额外的u来自哪里?

4 个答案:

答案 0 :(得分:7)

问题的主题可能有点误导:Python 2的raw_input()通常会返回一个字节字符串,而不是Unicode字符串。

但是,可以返回一个Unicode字符串,如果它或sys.stdin已被更改或替换(由应用程序,或作为Python的替代实现的一部分)。

因此,我相信@ByteCommander的评论是正确的:

也许这与它运行的控制台有什么关系?

Codecademy使用的Python表面上是2.7,但是(a)它是通过使用Emscripten将Python解释器编译为JavaScript并且(b)它在浏览器中运行来实现的;因此,在这些因素之间,Codecademy注入的字符串编码和解码很可能在普通CPython中不存在。

注意:我自己没有使用过Codecademy,也没有内部工作的内部知识。

答案 1 :(得分:4)

'u'表示它是一个unicode。您还可以指定raw_input().encode('utf8')转换为字符串。

编辑: 我检查了python 2.7它返回字节串而不是unicode字符串。所以问题就在这里。

编辑: 如果sys.stdin.encoding是unicode,raw_input()将返回unicode。

在codeacademy python环境中,sys.stdin.encoding和sys.stdout.decoding都是none,默认的endcoding方案是ascii。

只有在无法从环境中找到正确的编码方案时,Python才会使用此默认编码。

答案 2 :(得分:3)

  

额外的u来自哪里?

  • raw_input()返回环境中的Unicode字符串
  • 如果您打印它(转换为字符串),则会为列表中的每个项目调用
  • repr()
  • Unicode字符串的文本表示(repr())与Python中的Unicode文字相同:u'abc'

这就是print [raw_input()]可能产生的原因:[u'abc']

你在第一个代码示例中没有看到u'',因为str(unicode_string)调用等价的unicode_string.encode(sys.getdefaultencoding()),即它将Unicode字符串转换为字节串 - 除非你的意思是不要这样做它

可以raw_input()返回unicode吗?

Yes

#!/usr/bin/env python2
"""Demonstrate that raw_input() can return Unicode."""
import sys

class UnicodeFile:
    def readline(self, n=-1):
        return u'\N{SNOWMAN}'

sys.stdin = UnicodeFile()
s = raw_input()
print type(s)
print s

输出:

<type 'unicode'>
☃

实际示例是win-unicode-console包,它可以替换raw_input()以支持在Windows上的控制台代码页范围之外输入Unicode字符。相关:这是why sys.stdout should be replaced

可以raw_input()返回unicode

raw_input() is documented to return a string

  

然后该函数从输入中读取一行,将其转换为字符串   (剥离尾随换行符),然后返回。

Python 2中的

字符串 是字节字符串或Unicode字符串:isinstance(s, basestring)

raw_input()的CPython 实现明确支持Unicode字符串:builtin_raw_input() can call PyFile_GetLine()PyFile_GetLine() considers bytestrings and Unicode strings to be strings—it raises TypeError("object.readline() returned non-string") otherwise

答案 3 :(得分:1)

您可以在将字符串附加到列表之前对其进行编码:

hobbies = []

# Add your code below!
for i in range(3):
    Hobby = raw_input("Enter a hobby:")
    hobbies.append(Hobby.encode('utf-8')

print hobbies