这是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)))

我从未真正到达 write 语句,因为它在第一个语句上失败。

感谢您的帮助。

编辑:

我验证了数据库的字符集是utf8。因此,在我要重现的代码中,我将 '\xf6' 更改为 '\xc3\xb6',但失败仍然发生。“utf-8”和“utf8”之间有区别吗?

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

有帮助吗?

解决方案

  

所以在我的代码重现我改变“\ 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字符写入字节流。如果使用一个编解码器包裹的流的伊日的建议可以直接写的Unicode,否则你将不得不重新编码的Unicode字符串为字节手动

更好,用于记录目的,将简单地吐出变量的再版()。然后,你不必担心Unicode字符在那里之中,或换行或其他有害的字符:

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

Name: u'w\xf6rner'

其他提示

您串的在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
  • 赢-1250
  • 赢-1252

您需要使用 “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可能是正确的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top