【问题标题】:Unable to decode unicode string in Python 2.4无法在 Python 2.4 中解码 unicode 字符串
【发布时间】:2010-10-14 13:32:15
【问题描述】:

这是在 python 2.4 中。这是我的情况。我从数据库中提取了一个字符串,它包含一个变音符号 'o' (\xf6)。此时如果我运行 type(value) 它会返回 str。然后我尝试运行 .decode('utf-8'),我得到一个错误('utf8' 编解码器无法解码位置 1-4 中的字节)。

真的,我的目标只是成功地让 type(value) 返回 unicode。我找到了earlier question 这有一些有用的信息,但从选择的答案的例子似乎并不适合我。我在这里做错了什么吗?

这里有一些代码可以重现:

Name = 'w\xc3\xb6rner'.decode('utf-8')
file.write('Name: %s - %s\n' %(Name, type(Name)))

我从来没有真正接触过 write 语句,因为它在第一条语句上失败了。

感谢您的帮助。

编辑:

我验证了数据库的字符集是 utf8。所以在我的重现代码中,我将 '\xf6' 更改为 '\xc3\xb6',但仍然发生故障。 'utf-8' 和 'utf8' 有区别吗?

使用编解码器写入文件的技巧很方便(我肯定会使用它),但在这种情况下,我只是出于调试目的写入日志文件。

【问题讨论】:

  • 您在数据库表中使用什么字符集?我猜它可能不是utf-8。尝试将其传递给 decode

标签: python unicode decode


【解决方案1】:

您的字符串不是 UTF8 编码。如果要将字符串“解码”为 unicode,则字符串必须采用参数指定的编码。我试过了,效果很好:

print 'w\xf6rner'.decode('cp1250')

编辑

要将 unicode 字符串写入文件,您可以使用 codecs 模块:

import codecs
f = codecs.open("yourfile.txt", "w", "utf8")
f.write( ... )

指定输入/输出的编码并在整个代码中使用“unicode”字符串很方便,而无需担心不同的编码。

【讨论】:

  • +1 表示 import codecscodecs.open()。好东西!
【解决方案2】:

这显然是 1 字节编码。 'ö' 在 UTF-8 中是 '\xc3\xb6'。

编码可能是:

  • ISO-8859-1
  • ISO-8859-2
  • ISO-8859-13
  • ISO-8859-15
  • Win-1250
  • Win-1252

【讨论】:

    【解决方案3】:

    您需要使用“ISO-8859-1”:

    Name = 'w\xf6rner'.decode('iso-8859-1')
    file.write('Name: %s - %s\n' %(Name, type(Name)))
    

    utf-8 使用 2 个字节来转义 ascii 之外的任何内容,但这里只有 1 个字节,所以 iso-8859-1 可能是正确的。

    【讨论】:

      【解决方案4】:

      所以在我的重现代码中,我将'\xf6'更改为'\xc3\xb6',仍然出现故障

      不在第一行它没有:

      >>> 'w\xc3\xb6rner'.decode('utf-8')
      u'w\xf6rner'
      

      第二行会出错:

      >>> file.write('Name: %s - %s\n' %(Name, type(Name)))
      UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 7: ordinal not in range(128)
      

      这完全是您所期望的,尝试将非 ASCII Unicode 字符写入字节流。如果您使用 Jiri 建议的编解码器包装流,您可以直接编写 Unicode,否则您将不得不手动将 Unicode 字符串重新编码为字节。

      为了记录目的,更好的是简单地吐出变量的 repr()。那么您就不必担心其中存在 Unicode 字符、换行符或其他不需要的字符:

      name= 'w\xc3\xb6rner'.decode('utf-8')
      file.write('Name: %r\n' % name)
      
      Name: u'w\xf6rner'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-06
        • 2021-03-11
        • 2013-10-04
        • 2018-09-21
        • 2019-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多