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

3 投票
6 回答
25614 浏览
提问于 2025-04-17 01:33

我在使用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 个回答

3

对我来说,使用这个方法效果很好:

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

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

每个

3

你提到你遇到了编码错误,这让你决定写一个叫 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字符串?.

更新 根据这篇博客,有一种方法可以设置系统的默认编码。这个可以试试。

-1

解决很多问题的方法:


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

然后,
把这个放在你代码的最上面:

sys.setdefaultencoding('latin-1')

这是修复瑞典字符和不支持UTF8字符的终极方法。

撰写回答