UnicodeDecodeError:'utf8'编解码器无法解码3-6位的字节:无效数据

时间:2011-05-30 20:28:58

标签: python unicode python-2.x

8 个答案:

答案 0 :(得分:83)

您尝试解析为JSON的字符串未以UTF-8编码。最有可能的是它是用ISO-8859-1编码的。请尝试以下方法:

json.loads(unicode(opener.open(...), "ISO-8859-1"))

这将处理可能在JSON消息中获得的任何变音符号。

你应该阅读Joel Spolsky的The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)。我希望它能澄清一些围绕Unicode的问题。

答案 1 :(得分:6)

我的解决方案有点滑稽。我从未想过它会像使用UTF-8编解码器一样容易保存。我使用的是notepad ++(v5.6.8)。我没注意到我用ANSI保存了它编解码器最初。我正在使用单独的文件来放置所有本地化的字典。我在Notepad ++的'Encoding'选项卡下找到了我的解决方案。我选择'在没有BOM的UTF-8中编码'并保存它。它的工作非常出色。

答案 2 :(得分:4)

您看到的错误意味着您从远程端收到的数据不是有效的JSON。 JSON(根据规范)通常是UTF-8,但也可以是UTF-16或UTF-32(大端或小端)。您看到的确切错误意味着数据的某些部分不是有效的UTF-8(也不是UTF-16或UTF-32,因为那些会产生不同的错误。)

也许您应该检查从远程端收到的实际响应,而不是盲目地将数据传递给json.loads()。现在,您正在将响应中的所有数据读入字符串并假设它是JSON。而是,检查响应的内容类型。确保网页实际上声称为您提供JSON,而不是,例如,不是 JSON的错误消息。

(另外,在检查响应后使用json.load()通过传递opener.open()返回的类文件对象,而不是将所有数据读入字符串并将其传递给json.loads()。 )

答案 3 :(得分:3)

将编码更改为Latin1 / ISO-8859-1的解决方案解决了我在tex4ht的输出上调用html2text.py时遇到的问题。我使用它来对LaTeX文档进行自动字数统计:tex4ht将它们转换为HTML,然后将html2text.py剥离为纯文本,以便通过wc -w进一步计算。现在,例如,如果德国“变形金刚”通过文献数据库条目进入,那么该过程将失败,因为html2text.py会抱怨,例如。

UnicodeDecodeError:'utf8'编解码器无法解码位置32243-32245中的字节:无效数据

现在这些错误随后会特别难以追踪,基本上你想在你的参考部分中使用变音符号。 html2text.py中的一个简单更改来自

data = data.decode(encoding)

data = data.decode(“ISO-8859-1”)

解决了这个问题;如果您使用HTML文件作为第一个参数调用脚本,您也可以将编码作为第二个参数传递并保留修改。

答案 4 :(得分:1)

以防有人遇到同样的问题。我正在使用带有YouCompleteMe的vim,无法使用此错误消息启动ycmd,我所做的是:export LC_CTYPE="en_US.UTF-8",问题已消失。

答案 5 :(得分:1)

将其粘贴到命令行:

public static void main(String[] args) {
    int sum = 0;
    double average;
    double lowerbound = 1;
    double upperbound = 100;
    double number = lowerbound;
    //double remainder = 1;

    //loop
    while(number<= upperbound)
        if (number%2==1){
            sum += number;
            //remainder = number%2;
            System.out.println(number);
            number++;
        }else{
            number++;
        }


    average = sum/upperbound;

    System.out.println();
    System.out.println ("These are your sums and averages");

    System.out.println (sum);
    System.out.println (average);
}

答案 6 :(得分:0)

临时解决方法:unicode(urllib2.urlopen(url).read(), 'utf8') - 如果返回的内容为UTF-8,则此操作

urlopen().read()返回字节,你必须将它们解码为unicode字符串。另外,从http://bugs.python.org/issue4733

检查补丁会很有帮助

答案 7 :(得分:0)

在你的android_suggest.py中,将那个怪异的单行返回语句分解为one_step_at_a_time个段。在某处记录repr(string_passed_to_json.loads),以便在发生异常后检查它。眼球结果。如果问题不明显,请编辑您的问题以显示代表。