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
来自哪里?
答案 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()
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