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

Python-编码字符串-瑞典语字母,python,windows,encoding,ascii,decode,Python,Windows,Encoding,Ascii,Decode,我在使用Python的raw_输入命令(Python2.6)时遇到了一些问题, 出于某种原因,原始输入没有得到swedify()生成的转换字符串,这给了我一个我知道的编码错误,这就是为什么我从swedify()开始。 以下是我想做的: elif cmd in ('help', 'hjälp', 'info'): buffert += 'Just nu är programmet relativt begränsat,\nDe funktioner du har att använda ä

我在使用Python的raw_输入命令(Python2.6)时遇到了一些问题, 出于某种原因,原始输入没有得到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)
然后我得到这个:

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)
关于如何获取原始输入以从swedify()读取我的返回值的任何解决方案?
我尝试过从编码导入getencoder、getdecoder和其他功能,但效果并不好。

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

在带有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)
您可能希望在Python3中尝试此功能。看这个

也有兴趣:


根据更新有一种方法可以设置系统的默认编码。这可能值得一试。

在脚本的最顶端尝试以下神奇的注释:

# -*- coding: utf-8 -*-
以下是关于它的一些信息:
许多问题的解决方案:


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

然后,
将其放在代码顶部:

sys.setdefaultencoding('latin-1')

修复瑞典语/非UTF8兼容字符的圣杯。

对我来说,它可以很好地用于:

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

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

Per

Windows命令提示符在使用瑞典地区设置()时使用代码页850。 它的使用可能是因为与旧的MS Dos程序向后兼容

通过输入以下内容,可以将Windows命令提示符设置为使用UTF-8作为编码:
chcp 65001
()

在Windows上,控制台的本机Unicode支持已中断。即使是明显的UTF-8代码页也不是一个合适的修复方法


要使用Windows控制台进行读写,您需要使用它,它直接与底层控制台API一起工作,以便正确地读写多字节字符。

如果我不使用
swedify
,只需在瑞典提示符下调用
raw\u input
。@Ray Toal您使用的是哪种python版本?还有,你是说当你这样做的时候:原始输入(“Hur långt i kilmerär ditt mål:”),因为这对我也适用,但是根据我在哪台机器上运行代码,我会在控制台中得到格式错误的字符,我正试图找到一种通用的方法将字符输出到控制台中(使用不同的操作系统、语言和本地化)。我还测试了删除swedify调用以及它对原始输入的作用。注意,在我的机器上,我必须在一开始就添加它,以使python正确解析脚本:
#coding=utf-8
,它可能会帮助其他人。@Torxed python 2.7.1。但是它在Mac上,我的终端设置为utf-8,因此没有代码页问题。请参阅Lynch的comment并尝试coding=utf-8声明。@Torxed我认为没有一种通用的方法可以让控制台正确显示,因为控制台是本机应用程序。但我可能错了。在web浏览器中,使用HTML,您可以在所有浏览器上使用
å;
显示字符
,即使最终用户欺骗了他们的兄弟,这种方法也有效wser使用与服务器发送的编码不同的编码。但这是一种类似于chcp的黑客行为,您应该避免。正确,在*nix系统上,这将是无用的,因为我的朋友不像我们幸运的朋友那样开明,他们使用的Windows 7具有不同的语言包和“默认语言”这使得在没有100个变通方法的情况下获得一个好的整体解决方案变得很困难。正如您所提到的,它不需要unicode字符串,我可能已经找到了我应该找到的,因为我只是将swedify()部分移到一边,并将其与原始输入一起打印,虽然它不太昂贵,但很有效。原始输入(u'åäö>'.编码('iso-8859-15'))有点工作,给出了奇怪的字母tho。你应该仍然能够工作,因为Windows 7的控制台应用程序应该支持UTF-8。记住Python的
raw_input
使用
sys.stdin
的编码,所以如果你可以强制该编码为UTF-8,并对
sys.stdout
执行同样的操作,它会工作吗?对不起我没有一个Windows 7的盒子来测试这一点。这会起作用的,我记得看到一个解决方案,他们使用了解码(编码(u’…'))和“替换”的一些方法,但我找不到它,但我知道这解决了很多问题。但是强制使用stdin会起作用是的,所以我会将帖子标记为一个解决方案,Windows是一个解决方案,不管怎样:)干杯,雷!@RayToal,Windows控制台不支持UTF-8。有一个代码页看起来支持UTF-8,但它的破坏令人难以置信,并导致各种问题,特别是在读取多字节输入方面。很高兴知道。但很难相信世界上最流行的操作系统之一选择了本机终端(控制台)应用程序,它不处理可以说是世界上最流行的Unicode编码。因此,O.s.背后的公司可以将“控制台支持”留给开源社区的志愿者,让他们通过控制台API构建支持?(如果是,我觉得这是trurth比虚构更陌生的一个例子:)仅就记录而言,这并没有多大帮助。它只告诉文件中需要哪种编码,它不会管理套接字或原始输入的实际输出或输入。sys.setdefaultencoding()被明确地从Python3中删除,并被称为“邪恶”别处:-请不要使用它。这是博德的圣杯。此代码页的用途有限。它具有有限的字符支持,并且不修复读取多字节字符的问题
# -*- coding: utf-8 -*-
sys.setdefaultencoding('latin-1')
#-*- coding: utf-8 -*-
import sys
import codecs
koden=sys.stdin.encoding

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