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

Unable to decode unicode string in Python 2.4

这在python 2.4中。这是我的情况。我从数据库中拉出一个字符串,它包含一个斜线"o"(xf6)。此时,如果我运行type(value),它将返回str.i,然后尝试运行.decode("utf-8"),我会得到一个错误("utf8"codec无法解码位置1-4中的字节)。

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

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

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

实际上,我从未到达WRITE语句,因为它在第一个语句上失败。

谢谢你的帮助。

编辑:

我验证了数据库的字符集是utf8。因此,在我的代码中,我将'xf6'更改为'xc3xb6',但仍然失败。"utf-8"和"utf8"有区别吗?

使用编解码器写入文件的技巧很方便(我肯定会使用它),但是在这个场景中,我只是为了调试而写入日志文件。


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

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

编辑

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

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

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


显然是1字节编码。"?'以utf-8表示'xc3xb6'。

编码可能是:

  • ISO-859-1
  • ISO-859-2
  • ISO-855-13
  • ISO-855-15
  • WE1250
  • WE1252


您需要使用"ISO-8859-1":

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

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


So in my code to reproduce I changed '\xf6' to '\xc3\xb6', and the failure still occurs

不是第一行,不是:

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

但第二行将出错:

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

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

更好的是,为了日志记录的目的,只需吐出变量的repr()。然后,您不必担心Unicode字符在其中,或换行符或其他不需要的字符:

1
2
3
4
5
name= 'w\xc3\xb6rner'.decode('utf-8')
file.write('Name: %r
'
% name)

Name: u'w\xf6rner'