2015-06-02 89 views
0

我已经尝试了所有以前的答案和解决方案。'ascii'编解码器无法编码字符u' xe9'

我想使用这个值,这给了我编码相关的错误。

ar = [u'http://dbpedia.org/resource/Anne_Hathaway', u'http://dbpedia.org/resource/Jodie_Bain', u'http://dbpedia.org/resource/Wendy_Divine', u'http://dbpedia.org/resource/Jos\xe9_El\xedas_Moreno', u'http://dbpedia.org/resource/Baaba_Maal'] 

所以,我想,

d = [x.decode('utf-8') for x in ar] 

这给:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 31: ordinal not in range(128) 

我尝试了

d = [x.encode('utf-8') for x in ar] 

从而消除错误,但改变了原来的内容

原值为u'http://dbpedia.org/resource/Jos\xe9_El\xedas_Moreno'其转化为'http://dbpedia.org/resource/Jos\xc3\xa9_El\xc3\xadas_Moreno'同时使用encode

什么是对付这种情况下正确的方法是什么?

编辑

错误是当我在

req = urllib2.Request() 
+1

[UnicodeEncodeError:'ascii'编解码器无法在位置20编码字符u'\ xa0':序号不在范围内(128)]的可能重复(http://stackoverflow.com/questions/9942594/unicodeencodeerror- ascii-codec -cant-encode-character -u-xa0-in-position-20) – sirfz

+0

你想对数据做什么? ASCII编码不支持这些字符。这就是为什么我们编码如uff-8。如果您计划在野外使用此应用程序,我强烈建议您跳过ASCII码。 –

+3

如果你已经有unicode字符串,那么你不想把它们解码成unicode字符串。 :-)您可能想要与需要非Unicode字符串的内容进行交互,这意味着通过encode()将其放入可接受的编码中。现在,通常是UTF-8,但这取决于你想要做什么以及与之交互的服务。 – jszakmeister

回答

2

养活这些链接的字符串的第二个版本是你原来的unicode字符串的正确的UTF-8表示。如果要进行有意义的比较,则必须对存储的字符串和用户输入字符串使用相同的表示法。在这里要做的理智是总是在内部使用Unicode字符串(在您的代码中),并确保您的用户输入和存储的字符串都正确解码为 unicode从它们各自的编码在系统边界(存储子系统和用户输入子系统)。

此外,您似乎对unicode和编码有点困惑,因此阅读thisthis可能会有所帮助。

1

Unicode strings python是"raw" unicode,所以一定要确保它们是.encode().decode()。使用utf8编码被认为是全球多个开发组中的最佳实践。 要编码使用quote功能从urllib2库:

from urllib2 import quote 
escaped_string = quote(unicode_string.encode('utf-8')) 

为了解码,使用unquote

from urllib2 import unquote 
src = "http://dbpedia.org/resource/Jos\xc3\xa9_El\xc3\xadas_Moreno" 
unicode_string = unquote(src).decode('utf-8') 

另外,如果你更感兴趣的是Unicode和UTF-8的工作,检查了Unicode HOWTO

0

在您的Unicode列表中,u'http://dbpedia.org/resource/Jos\xe9_El\xedas_Moreno'是表示Unicode字符串的ASCII安全方式。当以支持完整西欧字符集的格式(如UTF-8)编码时,它是:http://dbpedia.org/resource/José_Elías_Moreno

您的.encode("UTF-8")是正确的,在UTF-8编辑器或浏览器中看起来不错。您在编码之后看到的是UTF-8的ASCII安全表示。

例如,你的麻烦字符是é和í。

é = 00E9 Unicode = C3A9 UTF-8 
í = 00ED Unicode = C3AD UTF-8 

总之,你.encode()方法是正确的,应该用于写入文件或浏览器。

相关问题