我有一个带有plone对象的json
文件,并且有一个对象字段给我一个错误:
UnicodeDecodeError('ascii', '{"id":"aluminio-prata", "nome":"ALUM\xc3\x8dNIO PRATA", "num_demaos":0, "rendimento": 0.0, "unidade":"litros", "url":"", "particular":[], "profissional":[], "unidades":[]},', 36, 37, 'ordinal not in range(128)') (Also, the following error occurred while attempting to render the standard error message, please see the event log for full details: 'NoneType' object has no attribute 'getMethodAliases')
我已经知道女巫领域是,"title"
from title = obj.pretty_title_or_id()
,当我从这里删除它时,确定:
json += '{"id":"' + str(id) + '", "nome":"' + title + '", "num_demaos":' + str(num_demaos) + ', "rendimento": ' + str(rendimento) + ', "unidade":"' + str(unidade) + '", "url":"' + link_produto + '", "particular":' + arr_area_particular + ', "profissional":' + arr_area_profissional + ', "unidades":' + json_qtd + '},
但是当我离开它时,我遇到了这个错误。
UnicodeDecodeError('ascii', '{"id":"aluminio-prata", "nome":"ALUM\xc3\x8dNIO PRATA", "num_demaos":0, "rendimento": 0.0, "unidade":"litros", "url":"", "particular":[], "profissional":[], "unidades":[]},', 36, 37, 'ordinal not in range(128)') (Also, the following error occurred while attempting to render the standard error message, please see the event log for full details: 'NoneType' object has no attribute 'getMethodAliases')
答案 0 :(得分:2)
我将假设当你读取 JSON文件时会发生错误。
在内部,Plone几乎可以使用Python Unicode字符串。如果从文件中读取字符串,则需要在Plone可以使用之前将其解码为Unicode。如果您没有给出任何指示,Python将假定该字符串被编码为ASCII,并将在此基础上尝试其Unicode转换。它与写作类似:
unicode("ALUM\xc3\x8dNIO PRATA")
会产生同样的错误。
实际上,您使用的字符串显然是使用UTF-8字符集编码的。从“\ xc3”中可以看出这一点,这也是有道理的,因为这是Plone在向外界发送数据时使用的字符集。
那么,你如何解决这个问题呢?您必须指定转换为Unicode时要使用的字符集:
"ALUM\xc3\x8dNIO PRATA".decode('UTF8')
这为您提供了一个没有错误的Python Unicode字符串。
因此,在您将JSON文件读入字符串(让我们称之为mystring
)之后,您需要使用mystring.decode('UTF8')
对其进行显式解码。 unicode(mystring, 'UTF8')
是同一操作的另一种形式。
答案 1 :(得分:0)
史蒂夫已经写过了title.decode('utf8')
一个例子说明了事实:
>>> u"Ä" == u"\xc4"
True # the native unicode char and escaped versions are the same
>>> "Ä" == u"\xc4"
False # the native unicode char is '\xc3\x84' in latin1
>>> "Ä".decode('utf8') == u"\xc4"
True # one can decode the string to get unicode
>>> "Ä" == "\xc4"
False # the native character and the escaped string are
# of course not equal ('\xc3\x84' != '\xc4').
我发现这个Thread对UTF-8的编码/解码问题和理解非常有帮助。