【问题标题】:string decode method error in pythonpython中的字符串解码方法错误
【发布时间】:2012-11-25 06:35:37
【问题描述】:

我有这样的功能:

def convert_to_unicode(data):
    row = {}
    if data == None:
        return data
    try:
        for key, val in data.items():
            if isinstance(val, str):
                row[key] = unicode(val.decode('utf8'))
            else:
                row[key] = val
        return row
    except Exception, ex:
        log.debug(ex)

我逐行提供一个结果集(使用MySQLdb.cursors.DictCursor)将所有字符串值转换为unicode(例如{'column_1':'XXX'}变成{'column_1':u'XXX'})。

问题是其中一行的值类似于{'column_1':'Gabriel García Márquez'} 它不会被改变。它抛出这个错误:

'utf8' codec can't decode byte 0xed in position 12: invalid continuation byte

当我搜索这个时,它似乎与 ascii 编码有关。

我尝试的解决方案是:

  1. 在我的文件开头添加# -*- coding: utf-8 -*-...没有帮助

  2. 将行 row[key] = unicode(val.decode('utf8')) 更改为 row[key] = unicode(val.decode('utf8', 'ignore')) ... 正如预期的那样,它会忽略非 ascii 字符并返回 {'column_1':u'Gabriel Garca Mrquez'}

  3. 将行 row[key] = unicode(val.decode('utf8')) 更改为 row[key] = unicode(val.decode('latin-1')) ... 可以,但恐怕它只支持西欧字符(根据 Here

谁能指出我正确的方向。

【问题讨论】:

    标签: python mysql unicode python-2.7 mysql-python


    【解决方案1】:

    首先:

    • 您在结果集中获得的数据显然是 latin-1 编码的,否则您不会观察到这种行为。 完全正确,尝试解码 latin-1-encoded 字节字符串就像它是 utf-8-encoded 一样在你的脸上炸毁。一旦有了latin-1编码的字节串foo,如果你想把它转换成unicode类型,foo.decode('latin1')是正确的做法。

    • 我注意到您的代码中有 unicode(val.decode('utf8')) 表达式。这相当于只是val.decode('utf8');调用字节字符串的 .decode 方法会将其转换为 unicode,因此您在 unicode 字符串上调用 unicode(),它只返回 unicode 字符串。

    其次:

    • 你真正的问题在这里——如果你想能够处理不包括在latin-1编码支持的字符集中的字符——不是Python的字符串类型本身,而是MySQLdb图书馆。这个问题我不是很详细了解,但是据我了解,在MySQL的古版本中,MySQL数据库使用的默认编码是latin-1,但现在是utf-8(已经很多年了) .然而,MySQLdb 库默认仍会与数据库建立latin-1 编码的连接。确实有几十个与 MySQL、Python 和字符串编码相关的 StackOverflow 问题,虽然我并不完全理解它们,但似乎对人们有用的所有此类问题的一种易于使用的解决方案是: http://www.dasprids.de/blog/2007/12/17/python-mysqldb-and-utf-8

    我希望我能给你一个关于 MySQLdb 问题的更全面和自信的答案,但我什至从未使用过 MySQL,我不想冒险发布任何不真实的东西。也许有人可以过来提供更多细节。尽管如此,我希望这对您有所帮助。

    【讨论】:

      【解决方案2】:

      您的第三个解决方案 - 将编码更改为 "latin-1" - 是正确的。您的输入数据被编码为 Latin-1,因此您必须将其解码为。除非有人在某个地方做了一些非常愚蠢的事情,否则该输入数据应该不可能包含该编码的无效字符。

      【讨论】:

      • 感谢大家的帮助:)
      猜你喜欢
      • 2013-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-26
      • 1970-01-01
      • 2011-08-11
      相关资源
      最近更新 更多