我在使用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,有一种方法可以设置系统的默认编码。这可能值得一试。

08-28 12:51