Python 2.4中无法解码Unicode字符串

4
这是Python 2.4。我的情况如下:我从数据库中获取一个字符串,其中包含一个带分音符的 'o'(\xf6)。此时,如果我运行type(value),它会返回str。然后我尝试运行.decode('utf-8'),但我收到一个错误('utf8'编解码器无法解码第1-4个位置的字节)。
我的目标是让type(value)成功返回unicode。我找到了一个较早的问题,其中有一些有用的信息,但是选定答案的示例似乎对我无效。我在这里做错了什么吗?
以下是一些复制代码:
Name = 'w\xc3\xb6rner'.decode('utf-8')
file.write('Name: %s - %s\n' %(Name, type(Name)))

我从未真正执行写入语句,因为它在第一条语句上失败。
谢谢你的帮助。
编辑:
我验证了数据库的字符集是utf8。因此,在我用于复制的代码中,我将'\xf6'更改为'\xc3\xb6',但仍然失败。'utf-8'和'utf8'之间有区别吗?
使用编解码器将内容写入文件的提示很有用(我肯定会使用它),但在这种情况下,我只是为了调试目的而写入日志文件。

你的数据库表使用什么字符集?我猜它可能不是utf-8。请尝试将utf-8传递给decode - elo80ka
4个回答

10

您的字符串不是使用UTF8编码。如果您想要将字符串“解码”为Unicode,那么您的字符串必须使用您指定的参数进行编码。我尝试了这个方法,它完美地运行:

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

编辑

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

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

在编写代码时,指定输入/输出的编码为"unicode"字符串,而不必担心不同的编码方式,这是非常方便的。


+1 for import codecscodecs.open()。太棒啦! - mknaf

5

显然是一字节编码。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 可能是正确的选择。


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'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接