我目前正在学习Python,我遇到了以下代码:
text=raw_input()
for letter in text:
x=[alpha_dic[letter]]
print x当我写一个umlaut (顺便说一下,在字典中)时,它会给我一个类似于-KeyError的错误:'\xfc'- (在本例中为ü),因为umlauts是以这种方式在内部保存的!我看到了一些使用unicode编码或utf的解决方案,但要么我没有足够的技术来正确地应用它,要么它根本就没有那样的工作方式。
发布于 2016-04-11 17:36:43
Python (2.x)中的多个缺点给您带来了一些麻烦。
raw_input()为您提供系统中没有编码信息的原始字节。因此,如果您有这样一个简单的文件:
x = {'ü': 20, 'ä': 10}并使用python运行它,您将得到一个错误,因为编码是未知的:
SyntaxError: Non-ASCII character '\xfc' in file foo.py on line 1, but no encoding declared;
see http://python.org/dev/peps/pep-0263/ for details当然,可以通过向文件中添加编码头并将文本转换为unicode文本来解决这个问题。
例如,如果编码是CP1252 (就像德国Windows ):
# -*- coding: cp1252 -*-
x = {u'ü': 20, u'ä':30}
print repr(x)这些指纹:
{u'\xfc': 20, u'\xe4': 30}但是,如果标题错误(例如编写CP850而不是CP1252,但保持相同的内容),它会打印:
{u'\xb3': 20, u'\xf5': 30}完全不同。
因此,首先检查编辑器设置是否与文件中的编码头匹配,否则所有非ascii文本都将是错误的。
下一步是修复raw_input()。它按照它说的做,从控制台提供原始输入。只是字节。但对于ISO-8859-1、CP1252、CP850等,UTF-8中的0xc3 + 0xbc,UTF-16中的0x00 + 0xfc或0xfc + 0x00等都可以用不同的字节表示。
因此,您的代码有两个问题:
for letter in text:如果text碰巧是一个多字节编码中的简单字节字符串(例如UTF-8、UTF-16等),那么一个字节并不等于一个字母,所以这样的迭代不会达到预期的效果。对于一个非常简化的letter视图,您可以使用python字符串进行这种迭代(如果适当的话)。因此,您需要首先确保text是一个unicode字符串。
如何将字节字符串转换为unicode?字节串提供decode()方法,该方法接受编码。对于这种编码,一个很好的初步猜测是这里的代码( sys.stdin.encoding or locale.getpreferredencoding(True)) )
把东西放在一起:
alpha_dict = {u'\xfc': u'small umlaut u'}
text = raw_input()
# turn text into unicode
utext = text.decode(sys.stdin.encoding or locale.getpreferredencoding(True))
# iterate over unicode string, not really letters...
for letter in utext:
x=[alpha_dic[letter]]
print x发布于 2016-04-11 16:22:55
我可以借用这的答案来解决这个问题:
# -*- coding: utf-8 -*-
import sys, locale
alpha_dict = {u"ü":"umlaut"}
text= raw_input().decode(sys.stdin.encoding or locale.getpreferredencoding(True))
for letter in text:
x=[alpha_dict[unicode(letter)]]
print x
>>> ü
>>> ['umlaut']Python 2和unicode并不是为了伪装内心.
https://stackoverflow.com/questions/36553896
复制相似问题