我有一些Python的raw_input命令(Python2.6)的麻烦,出于某种原因,raw_input不会得到swedify()产生的转换后的string,这给我一个编码错误,我知道,这就是为什么我让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)
现在我search了一下,发现了一些“解决scheme”,但没有一个工作,有些伤心,我不得不创build一个批处理脚本,执行chcp? 在一开始,但这不是一个干净的解决scheme国际海事组织。
这里是swedify:
def swedify(inp): try: return inp.decode('utf-8') except: return '(!Dec:) ' + str(inp)
任何解决scheme如何让raw_input从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)
你的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 。
也感兴趣: 如何读取Unicode输入并比较Python中的Unicode字符串? 。
更新根据这个博客文章,有一种方法来设置系统的默认编码。 这可能值得一试。
对我来说,它工作得很好:
#-*- coding: utf-8 -*- import sys import codecs koden=sys.stdin.encoding a=raw_input( u'Frågan är öppen? '.encode(koden)) print a
每
在Windows上,控制台的原生Unicode支持被破坏。 即使是明显的UTF-8代码页也不是一个合适的解决方案。
要使用Windows控制台进行读写,您需要使用https://github.com/Drekin/win-unicode-console ,它直接与底层控制台API一起工作,以便正确读取和写入多字节字符。
使用瑞典语区域设置时,Windows命令提示符使用Codepage 850( https://en.wikipedia.org/wiki/Code_page_850 )。 这可能是因为与旧的MS-Dos程序兼容。
您可以通过输入以下命令来设置Windows命令提示符使用UTF-8作为编码: chcp 65001
( Windows命令行中的Unicode字符 – 如何? )
试试这个神奇的评论在脚本的最上面:
# -*- coding: utf-8 -*-
以下是关于它的一些信息: http : //www.python.org/dev/peps/pep-0263/
解决了很多问题:
编辑:C:\ Python ?? \ Lib \ Site.py用“pass”替换“del sys.setdefaultencoding”
然后,
把它放在你的代码的顶部:
sys.setdefaultencoding('latin-1')
修复瑞典/非UTF8兼容字符的圣杯。