我在使用Python的raw_input命令(Python2.6)时遇到了一些麻烦,
出于某种原因,raw_input无法获得swedify()生成的转换后的字符串,这给了我一个我知道的编码错误,这就是为什么我使swedify()开始的原因。
这是我想做的事情:
elif cmd in ('help', 'hjälp', 'info'):
buffert += 'Just nu är programmet relativt begränsat,\nDe funktioner du har att använda är:\n'
buffert += ' * historik :: skriver ut all din historik\n'
buffert += ' * ändra <något> :: ändrar något i databasen, följande finns att ändra:\n'
print swedify(buffert)
这工作得很好,就像我想要他们将瑞典语字符输出到控制台一样。
但是,当我尝试(在相同的代码中,具有相同的\x ??值时,请打印以下内容:
core['goalDistance'] = raw_input(swedify('Hur långt i kilometer är ditt mål: '))
core['goalTime'] = raw_input(swedify('Vad är ditt mål i minuter att springa ' + core['goalDistance'] + 'km på: '))
然后我得到这个:
C:\Users\Anon>python löp.py
Traceback (most recent call last):
File "l÷p.py", line 92, in <module>
core['goalDistance'] = raw_input(swedify('Hur långt i kilometer är ditt mål: '))
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe5' in position 5: ordinal not in range(128)
现在我已经四处搜寻,找到了一些“解决方案”,但是它们都不起作用,有些可悲的是我不得不创建一个执行chcp的批处理脚本?刚开始时,但这不是IMO的干净解决方案。
这是swedify:
def swedify(inp):
try:
return inp.decode('utf-8')
except:
return '(!Dec:) ' + str(inp)
关于如何使raw_input从swedify()读取我的返回值的任何解决方案?
我试过从编码导入getencoder,getdecoder和其他,但是没有更好的方法。
最佳答案
您提到了一个事实,即您收到一个编码错误,该错误首先促使您编写swedify
,并且您已经找到了作为Windows命令chcp
的解决方案。
在带有UTF-8终端的* nix系统上,不需要swedify
:
>>> raw_input('Hur långt i kilometer är ditt mål: ')
Hur långt i kilometer är ditt mål: 100
'100'
>>> a = raw_input('Hur långt i kilometer är ditt mål: ')
Hur långt i kilometer är ditt mål: 200
>>> a
'200'
FWIW,当我确实使用
swedify
时,遇到相同的错误:>>> def swedify(inp):
... try:
... return inp.decode('utf-8')
... except:
... return '(!Dec:) ' + str(inp)
...
>>> swedify('Hur långt i kilometer är ditt mål: ')
u'Hur l\xe5ngt i kilometer \xe4r ditt m\xe5l: '
>>> raw_input(swedify('Hur långt i kilometer är ditt mål: '))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe5' in position 5: ordinal not in range(128)
您的
swedify
函数返回一个unicode对象。内置的raw_input
对unicode对象不满意。>>> raw_input("å")
åeee
'eee'
>>> raw_input(u"å")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe5' in position 0: ordinal not in range(128)
您可能想在Python 3中尝试。请参见Python bug。
也有意思:How to read Unicode input and compare Unicode strings in Python?。
更新根据this blog post,有一种方法可以设置系统的默认编码。这可能值得一试。