【发布时间】:2014-10-23 16:57:49
【问题描述】:
好吧……
- Unicode 字符串被编码为 Python 2.x 字符串(实际上是字节序列)
- Python 2.x 字符串被解码为 Unicode 字符串
Python UnicodeDecodeError - Am I misunderstanding encode?
我有这个 python 2.7 代码
try:
print '***'
print type(relationsline)
relationsline = relationsline.decode("ascii", "ignore")
print type(relationsline)
relationsline = relationsline.encode("ascii", "ignore")
print type(relationsline)
relations = ast.literal_eval(relationsline)
except ValueError:
return
except UnicodeDecodeError:
return
上面代码的最后一行有时会抛出
UnicodeDecodeError: 'ascii' 编解码器无法在位置解码字节 0xfc 341:序数不在范围内(128)
我认为这将 (1) 以具有某种(未知)编码的字符串开头 (2) 将其解码为 unicode 类型,表示字符串 unicode 字符集与 ascii 编码同时忽略所有可以'不能用ascii编码 (3) 把unicode类型编码成ascii编码的字符串,忽略所有不能用ascii表示的字符。
这是完整的堆栈跟踪:
Traceback (most recent call last):
File "outputprocessor.py", line 69, in <module>
getPersonRelations(lines, fname)
File "outputprocessor.py", line 41, in getPersonRelations
relations = ast.literal_eval(relationsline)
File "/usr/lib/python2.7/ast.py", line 49, in literal_eval
node_or_string = parse(node_or_string, mode='eval')
File "/usr/lib/python2.7/ast.py", line 37, in parse
return compile(source, filename, mode, PyCF_ONLY_AST)
File "<unknown>", line 1
UnicodeDecodeError: 'ascii' codec can't decode byte 0xfc in position 341: ordinal not in range(128)
^
SyntaxError: invalid syntax
但这显然在某些地方是错误的。更令人困惑的是 UnicodeDecodeError 没有捕捉到 UnicodeDecodeError。我错过了什么?也许这就是问题所在? http://bugs.python.org/issue22221
【问题讨论】:
-
您的 ascii 文本不是。严格的 ascii 是一个 7 位字符集(0x00 -> 0x7F),你有一个 > 0x7F 的字符,这意味着它不是 ascii。也许它是扩展 ascii、iso8859-1 或其他。但它不是“ascii”。
-
如果您能找出一个始终抛出错误的示例,这将更容易调试。建议使用MCVE:一个最小的独立代码示例,运行时会运行并产生您所说的错误。
-
另外,请向我们展示异常的完整堆栈跟踪。
-
我想这是一个 ast 语法错误