我的.py文件中的这一行给出了一个:"UnicodeDecodeError:'utf8‘编解码器不能解码位置8-13:不支持的Unicode代码范围中的字节。“
if line.startswith(u"Fußnote"):该文件保存在utf-8中,编码位于顶部:# --编码: utf-8 --
我在注释和数组中有很多其他带有utf-8编码的中文文本的py文件,例如: arr = u"chinese text",所以我想知道为什么这个例子对我不起作用。
发布于 2011-01-27 11:48:48
让我们非常仔细地检查该错误消息:
"UnicodeDecodeError:'utf8‘编解码器无法解码位置8-13的字节:不支持的Unicode代码范围“
请注意,它写的是“位置8-13的字节”--这是一个6字节UTF-8序列。在黑暗时代,这可能是有效的,但由于Unicode被冻结为21位,最大为4个字节。UTF-8验证和错误报告最近收紧了;令人感兴趣的是,您运行的是哪个版本的Python?
对于2.7.1和2.6.6,该错误变得更有用:“.不能解码位置8的字节XXXX :无效的开始字节”,其中XXXX只能是0xfc或0xfd,如果旧消息建议一个6字节的序列。在ISO-8859-1或cp1252中,0xfc表示U+00FC拉丁文小写字母U(也称为u-umlaut,可能有嫌疑);0xfd表示U+00FD拉丁文小写字母Y(不太可能)。
问题不在于源文件中的if line.startswith(u"Fußnote"):语句。如果它不是正确的UTF-8,您将在编译时得到一条消息,并且消息应该以"SyntaxError“而不是"UnicodeDecodeError”开头。无论如何,该字符串的UTF-8编码只有8个字节长,而不是14字节。
问题是(正如@Mark所指出的)任何“行”所指的问题。它只能是str对象。
为了更进一步,您需要回答Mark的问题(1) print repr(line) (2) site.py更改的结果。
在这个阶段,澄清str和unicode对象混合的问题是个好主意(在许多操作中,不仅仅是a.startswith(b))。
除非该操作被定义为生成str对象,否则它不会强迫unicode对象到str__。a.startswith(b).It将尝试使用默认(通常为'ascii')编码来解码str对象,但情况并非如此。
示例:
>>> "\xff".startswith(u"\xab")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128)
>>> u"\xff".startswith("\xab")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xab in position 0: ordinal not in range(128)此外,说“混合和你得到UnicodeDecodeError”是不正确的。很有可能str对象是在默认编码(通常是'ascii')中有效编码的-没有引发异常。
示例:
>>> "abc".startswith(u"\xff")
False
>>> u"\xff".startswith("abc")
False
>>>发布于 2011-01-27 03:32:05
我可以用以下代码再现UnicodeDecodeError:
#!/usr/bin/env python
# -- coding: utf-8 --
line='Fußnoteno'
if line.startswith(u"Fußnote"):
print('Hi')注意,line是一个字符串对象,但u"Fußnote"是一个unicode对象。由于line是一个字符串对象,所以在调用startswith时,该unicode对象将被转换为string对象。在Python2中,默认情况是尝试使用ascii编解码器进行解码。由于无法用ascii编解码器对u"ß"进行解码,因此会引发UnicodeDecodeError。
如果您首先使line成为unicode对象,则可以避免此错误:
line='Fußnoteno'.decode('utf-8')
if line.startswith(u"Fußnote"):
print('Hi')或者,如果您首先使u"Fußnote"成为一个字符串对象:
line='Fußnoteno'
if line.startswith(u"Fußnote".encode('utf-8')):
print('Hi')发布于 2011-01-27 06:19:16
此错误指示行不是Unicode字符串。在X.startswith(Y)中,X和Y都必须是Unicode或字节字符串。混合,你就可以得到UnicodeDecodeError。print repr(line)检查它。另外,您是否修改了site.py以将默认编码从“ascii”更改为“utf8 8”?通常,Python2.x默认的是'ascii‘编解码器。
https://stackoverflow.com/questions/4812186
复制相似问题