2011-09-06 20 views
3
我在与Python的命令的raw_input(python2.6的), 出于某种原因,有些麻烦

里,raw_input没有拿到swedify()产生,这给了我一个编码转换后的字符串我意识到的错误,这就是为什么我要swedify()开始。 这里就是我想要做的事:Python的 - 编码字符串 - 瑞典快报

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 13值,打印这片:

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和其他人,但没有。

+1

当我在swedify中忽略瑞典提示符下的'raw_input'时,它工作正常。 –

+0

@ Ray-Toal你正在使用哪个python版本?另外,你的意思是当你这样做的时候:raw_input('Hurlāngi kilometreärdittmål:')因为这对我很有用,但是随后我在控制台中得到格式错误的字符,这取决于我运行我的代码的机器我试图找到一种通用的方法将控制台输出到控制台(使用不同的操作系统,语言和本地化)。 – Torxed

+0

我测试过除去swedify调用,并且它的工作原始输入。注意在我的机器上,我不得不在开始时添加这个来正确地解析脚本:'#coding = utf-8'可能会帮助其他人。 – Lynch

回答

-1

解决了很多问题:


编辑:C:\ Python ?? \ Lib \ Site.py 用“pass”替换“del sys.setdefaultencoding”

然后,
在你的代码的顶部将这个:

sys.setdefaultencoding('latin-1') 

固定瑞典/非UTF8兼容字符的圣杯。

+1

sys.setdefaultencoding()明确从Python3中删除,并在其他地方称为“邪恶”:http://ziade.org/2008/01/08/syssetdefaultencoding-is-evil/ - 请不要使用它。 – anarcat

+1

这是旅行者的圣杯 –

3

您提到了一个事实,即您收到了一个编码错误,它促使您首先编写swedify,并且您已找到围绕chcp这是一个Windows命令的解决方案。

在使用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?

UPDATE根据this blog post有一种方法来设置系统的默认编码。这可能值得一试。

+0

正确,在* nix系统上,这将毫无用处,因为我的朋友不像我们的幸运者那样开明,他们使用带有不同语言包和“默认语言”的Windows 7,这使得难以获得良好的整体解决方案没有100个解决方法。 正如你提到的,它没有考虑,我可能应该想通了,我有点没因为我刚刚搬到了swedify()部分的方式进行,并以这是不是所有的印刷的raw_input沿侧unicode字符串为pritty,但它的作品。 raw_input(u'åäö>'。encode('iso-8859-15'))工作的排序,给出奇数字tho。 – Torxed

+0

因为Windows 7应该支持其控制台应用程序的UTF-8,所以你仍然应该能够开始工作。请记住,Python的'raw_input'使用'sys.stdin'的编码,所以如果你可以强制编码为UTF-8,并且对'sys.stdout'执行相同的操作,它会起作用吗?对不起,我没有Windows 7盒来测试这个。 –

+0

这将工作,我记得看到一个解决方案,他们使用解码(编码(ü'...'))'替换'一些如何,但我找不到它,但我知道这解决了很多问题。但强制stdin会工作,所以我会将该帖子标记为解决方案,无论如何,Windows都是解决方案:) Cheers Ray! – Torxed

-1

试着在你的脚本的最顶部这个神奇的评论:

# -*- coding: utf-8 -*- 

下面是一些关于它的信息: http://www.python.org/dev/peps/pep-0263/

+1

只是为了记录,这并没有太大的帮助。它只会告诉文件中哪个编码是预期的,它不会管理来自套接字或raw_input的实际输出或输入。 – Torxed

2

对我来说它工作得很好用:

#-*- coding: utf-8 -*- 
import sys 
import codecs 
koden=sys.stdin.encoding 

a=raw_input(u'Frågan är öppen? '.encode(koden)) 
print a 

2

在Windows中,控制台的原生支持Unicode坏了。即使是明显的UTF-8代码页也不是一个合适的解决方案。

要使用Windows控制台进行读写,您需要使用https://github.com/Drekin/win-unicode-console,该工具可直接与底层控制台API一起工作,以便正确读取和写入多字节字符。