在编写一些计算程序时,我经常会遇到“ UnicodeDecodeError”。例如:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 57: invalid continuation byte
我的问题是:如何找到代码中哪个词导致错误?我不知道如何知道这个“ 57位”的位置。顺便说一句,“无效的连续字节”是什么意思?
感谢您的回答。
PS:此错误来自此代码,在该代码中我尝试将四阶Runge-Kutta方法应用于Lorenz方程:
# Auteur : Bastien Massion
# NOMA : 13701700
# Date création fichier : 23 novembre 2018 18h24
# Date dernière modification : 23 novembre 2018 19h05
# Je jure que ceci est le fruit de mon travail personnel
from numpy import *
def lorfunction(t, u): # u = [u_0, u_1, u_2] = [x, y, z]
fx = 10*u[1] - 10*u[0]
fy = 28*u[0] - u[0]*u[2] - u[1]
fz = u[0]*u[1] - 8/3*u[2]
return [fx, fy, fz]
def lorenz(Tstart, Tend, Ustart, n):
T, h = linspace(Tstart,Tend, n+1, retstep = True)
U = zeros((n+1, 3))
U[0,:] = Ustart
for i in range(0, n):
Ka = lorfunction(T[i], U[i])
Kb = lorfunction(T[i] + h/2, U[i] + h/2*Ka)
Kc = lorfunction(T[i] + h/2, U[i] + h/2*Kb)
Kd = lorfunction(T[i] + h, U[i] + h*Kc)
U[i+1] = U[i] + h/6*(Ka + 2*Kb + 2*Kc + Kd)
return T,U
print (lorenz(0.0, 100.0, [0,1,0,], 10000))
答案 0 :(得分:2)
UnicodeDecodeError:“ utf-8”编解码器无法解码位置57的字节0xe9:无效的连续字节
57
是Python源文件中投诉的字节位置。
您的情况似乎是é
在# Date création fichier
中的位置。
0xe9
是该位置的字节。我将其识别为ISO-8859-1
(又称ISO-Latin-1)字符é
的表示形式。
因此,看来您的Python源文件实际上是用ISO-8859-1编码的, 但是Python解释器出于某种原因假定它是在UTF-8中进行编码的。
顺便说一句:
在128以上的UTF-8字符中,使用2个或更多字节进行编码,
第一个称为起始字节,其他的称为连续字节。
有关更多说明,请参见UTF-8 examples。
要了解该错误,我需要详细说明。
考虑一下Python文件中出现的字节0xe9 0x61 0x74
:
将3个字节解码为ISO-8859-1(采用单字节编码)将导致3个字符:éat
。
与UTF-8解码相同的字节更加复杂。
字节0xe9
(因为从1110
位开始)是一个起始字节
后跟2个连续字节。
每个连续字节需要以10
位开头,
但是接下来的2个字节(0x61 0x74
)违反了此条件。
因此,抛出了 UnicodeError 说无效的连续字节。
为避免此类问题,您可以选择以下替代方法:
保留以ISO-8859-1编码的Python源 并添加行
# -*- coding:iso-8859-1 -*-
将Python源代码保存为UTF-8。 并添加行
# -*- coding:utf-8 -*-
我希望第一个或第三个选项。