Python - 编码字符串 - 瑞典语字母

时间:2011-09-06 06:19:53

标签: python windows encoding ascii decode

我在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和其他人,但没有更好的。

6 个答案:

答案 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 65001Unicode characters in Windows command line - how?

答案 4 :(得分:-1)

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

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

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

答案 5 :(得分:-1)

解决很多问题:


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

然后,
将此放在代码的顶部:

sys.setdefaultencoding('latin-1')

修复瑞典/非UTF8兼容角色的圣杯。