我在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)
现在我已经google了一下,发现了一些“解决方案”,但没有一个工作,有些可悲的是我必须创建一个执行chcp的批处理脚本???在一开始,但这不是一个干净的解决方案IMO。
这是swedify:
def swedify(inp):
try:
return inp.decode('utf-8')
except:
return '(!Dec:) ' + str(inp)
有关如何让raw_input从swedify()读取返回值的任何解决方案? 我试过从编码导入getencoder,getdecoder和其他人,但没有更好的。
答案 0 :(得分: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?。
更新根据this blog post,有一种方法可以设置系统的默认编码。这可能值得一试。
答案 1 :(得分:3)
对我来说,它适用于:
#-*- coding: utf-8 -*-
import sys
import codecs
koden=sys.stdin.encoding
a=raw_input( u'Frågan är öppen? '.encode(koden))
print a
每
答案 2 :(得分:2)
在Windows上,控制台的本机Unicode支持已损坏。即使是明显的UTF-8代码页也不是一个合适的解决方案。
要使用Windows控制台进行读写,您需要使用https://github.com/Drekin/win-unicode-console,它直接与底层控制台API配合使用,以便正确读取和写入多字节字符。
答案 3 :(得分:0)
Windows命令提示符在使用瑞典语区域设置(https://en.wikipedia.org/wiki/Code_page_850)时使用代码页850。 可能因为向后兼容旧的MS-Dos程序而使用它。
您可以通过输入以下命令将Windows命令提示符设置为使用UTF-8作为编码:
chcp 65001
(Unicode characters in Windows command line - how?)
答案 4 :(得分:-1)
答案 5 :(得分:-1)
解决很多问题:
编辑:C:\ Python ?? \ Lib \ Site.py
将“del sys.setdefaultencoding”替换为“pass”
然后,
将此放在代码的顶部:
sys.setdefaultencoding('latin-1')
修复瑞典/非UTF8兼容角色的圣杯。