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

无法在Python 2.4中解码unicode字符串,python,unicode,decode,Python,Unicode,Decode,这是在Python2.4中实现的。这是我的情况。我从数据库中提取一个字符串,它包含一个umlauted“o”(\xf6)。此时,如果我运行type(value),它返回str.I,然后尝试运行.decode('utf-8'),我会得到一个错误('utf8'编解码器无法解码位置1-4中的字节) 实际上,我在这里的目标只是成功地使类型(值)返回unicode。我找到了一个 这有一些有用的信息,但从挑选的答案的例子似乎不适合我。我有什么地方做错了吗 下面是一些要复制的代码: Name = 'w\xc3

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

实际上,我在这里的目标只是成功地使类型(值)返回unicode。我找到了一个 这有一些有用的信息,但从挑选的答案的例子似乎不适合我。我有什么地方做错了吗

下面是一些要复制的代码:

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”之间有区别吗

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

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


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

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

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

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

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

指定输入/输出的编码并在整个代码中使用“unicode”字符串非常方便,而不必考虑不同的编码。

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

编码可能是:

  • ISO-8859-1
  • ISO-8859-2
  • ISO-8859-13
  • ISO-8859-15
  • Win-1250
  • Win-1252
因此,在要复制的代码中,我将'\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'

在数据库表中使用什么字符集?我猜它可能不是utf-8。尝试将其传递给
decode
。+1表示
import codec
codec.open()
。好东西!
name= 'w\xc3\xb6rner'.decode('utf-8')
file.write('Name: %r\n' % name)

Name: u'w\xf6rner'