UnicodeDecodeError:错误的位置

时间:2018-11-24 13:58:09

标签: python python-unicode

在编写一些计算程序时,我经常会遇到“ 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))

1 个答案:

答案 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 -*-
    

    文件开头 如PEP 263 -- Defining Python Source Code Encodings中所述。

  • 将您的Python源代码保存为UTF-8。 并依靠UTF-8作为Python解释器的默认源编码。
  • 将Python源代码保存为UTF-8。 并添加行

     # -*- coding:utf-8 -*-
    

我希望第一个或第三个选项。