Python - 编码字符串 - 瑞典字母
我在使用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 ???,但我觉得这不是个干净的解决办法。
这是swedify的代码:
def swedify(inp):
try:
return inp.decode('utf-8')
except:
return '(!Dec:) ' + str(inp)
有没有什么办法让raw_input能够读取我从swedify()返回的值?我尝试过从encodings导入getencoder、getdecoder等,但都没有改善。
6 个回答
对我来说,使用这个方法效果很好:
#-*- coding: utf-8 -*-
import sys
import codecs
koden=sys.stdin.encoding
a=raw_input( u'Frågan är öppen? '.encode(koden))
print a
每个
你提到你遇到了编码错误,这让你决定写一个叫 swedify
的程序。你还找到了一些关于 chcp
的解决办法,这个是Windows系统的一个命令。
在使用UTF-8终端的*类Unix系统上,其实不需要 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'
顺便说一下,当我使用 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。
还有一个有趣的链接:如何在Python中读取Unicode输入并比较Unicode字符串?.
更新 根据这篇博客,有一种方法可以设置系统的默认编码。这个可以试试。
解决很多问题的方法:
编辑:C:\Python??\Lib\Site.py
把“del sys.setdefaultencoding”替换成“pass”
然后,
把这个放在你代码的最上面:
sys.setdefaultencoding('latin-1')
这是修复瑞典字符和不支持UTF8字符的终极方法。