无法在Python 2.4中解码unicode字符串

时间:2009-03-20 14:36:32

标签: python unicode decode

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

我的目标是成功使类型(值)返回unicode。我找到了earlier question 这有一些有用的信息,但选择的答案中的例子似乎不适合我。我在这里做错了吗?

以下是一些要重现的代码:

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

我从未真正进入write语句,因为它在第一个语句中失败了。

感谢您的帮助。

修改

我验证了DB的字符集是utf8。因此,在我的代码重现中,我将'\ xf6'更改为'\ xc3 \ xb6',但仍然会发生故障。 'utf-8'和'utf8'之间有区别吗?

使用编解码器写入文件的提示非常方便(我肯定会使用它),但在这种情况下,我只是为了调试目的而写入日志文件。

4 个答案:

答案 0 :(得分:10)

您的字符串不是,采用UTF8编码。如果要将字符串“解码”为unicode,则字符串必须采用参数指定的编码。我试过这个并且它完美无缺:

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

修改

要将unicode字符串写入文件,您可以使用编解码器模块:

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

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

答案 1 :(得分:5)

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

编码可能是:

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

答案 2 :(得分: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可能是正确的。

答案 3 :(得分:2)

  

所以在我的代码重现中我将'\ 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'