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