加入时的UnicodeDecodeError

Nic*_*son 13 python unicode character-encoding

我有一个包含一些字符串的列表(其中大部分是从sqlite3数据库中获取的):

stats_list = ['Statistik \xc3\xb6ver s\xc3\xa5nger\n', 'Antal\tS\xc3\xa5ng', '1\tCarola - Betlehems Stj\xc3\xa4rna', '\n\nStatistik \xc3\xb6ver datak\xc3\xa4llor\n', 'K\xc3\xa4lla\tAntal', 'MANUAL\t1', '\n\nStatistik \xc3\xb6ver \xc3\xb6nskare\n', 'Antal\tId', u'1\tNiclas']
Run Code Online (Sandbox Code Playgroud)

当我尝试加入时:

return '\n'.join(stats_list)
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 10: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

是否有可能通过查看列表得到任何线索?如果我遍历列表并将其打印到屏幕,我得到这个:

Statistik över sånger

Antal   Sång 
1   Carola - Betlehems Stjärna


Statistik över datakällor

Källa   Antal 
MANUAL  1


Statistik över önskare

Antal   Id
1   Niclas

这正是我所期待的,并没有显示错误.(特殊字符是瑞典语).

编辑:

我试过这个:

   return '\n'.join(i.decode('utf8') for i in stats_list)
Run Code Online (Sandbox Code Playgroud)

但它回来了:

Traceback (most recent call last):
  File "./CyberJukebox.py", line 489, in on_stats_to_clipboard
    stats = self.jbox.get_stats()
  File "/home/nine/dev/python/CyberJukebox/jukebox.py", line 235, in get_stats
    return self._stats.get_string()
  File "/home/nine/dev/python/CyberJukebox/jukebox.py", line 59, in get_string
    return '\n'.join(i.decode('utf8') for i in stats_list)
  File "/home/nine/dev/python/CyberJukebox/jukebox.py", line 59, in <genexpr>
    return '\n'.join(i.decode('utf8') for i in stats_list)
  File "/usr/lib/python2.7/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 10: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

编辑2:

建议的解决方案适用于解释器.但是当我执行代码时,它将无法工作.我无法绕过这个.也许这是显而易见的我错过了所以我在这里粘贴整个方法:

 def get_string(self):
     stats_list = [u'Statistik över sånger\n', u'Antal\tSång']
     stats = sorted([(v, k) for k, v in self.song_stats.iteritems()], reverse=True)
     for row in stats:
         line = '%s\t%s' % row
         stats_list.append(line)

     stats_list.append(u'\n\nStatistik över datakällor\n')
     stats_list.append(u'Källa\tAntal')
     stats = sorted([(k, v) for k, v in self.exts_stats.iteritems()])
     for row in stats:
         line = '%s\t%s' % row
         stats_list.append(line)

     stats_list.append(u'\n\nStatistik över önskare\n')
     stats_list.append(u'Antal\tId')
     stats = sorted([(v, k) for k, v in self.wisher_stats.iteritems() if k != ''], reverse=True)
     for row in stats:
         line = '%s\t%s' % row
         stats_list.append(line)

     return '\n'.join(i.decode('utf8') for i in stats_list)
Run Code Online (Sandbox Code Playgroud)

song_stats,exts_stats并且wisher_stats是班上的字典.

ekh*_*oro 11

您的问题可能是您正在使用字节字符串混合unicode字符串.

"编辑2"中的代码将几个unicode字符串添加到stats_list:

stats_list = [u'Statistik över sånger\n', u'Antal\tSång']
Run Code Online (Sandbox Code Playgroud)

如果你试图解码这些unicode字符串,你会得到一个UnicodeEncodeError.这是因为Python会首先尝试使用默认编码(通常是"ascii")来编码字符串,然后再尝试解码它们.解码字节字符串才有意义.

首先,将函数的最后一行更改为:

return '\n'.join(stats_list)
Run Code Online (Sandbox Code Playgroud)

现在,您需要检查添加的任何其他字符串是否stats_list字节字符串,并确保首先正确解码为unicode字符串.

所以放在print type(line)这三行之后:

line = '%s\t%s' % row
Run Code Online (Sandbox Code Playgroud)

然后无论它打印<type 'str'>,更改以下行:

stats_list.append(line.decode('utf-8'))
Run Code Online (Sandbox Code Playgroud)

当然,如果打印<type 'unicode'>,则无需更改以下行.

这里的一个更好的解决办法是检查有字典song_stats,exts_statswisher_stats创建,并确保它们始终包含unicode字符串(或字节字符串只包含ASCII字符).


ken*_*ytm 7

字符串以UTF-8编码.你需要.decode他们unicode:

>>> 'Statistik \xc3\xb6ver s\xc3\xa5nger\n'.decode('utf-8')
u'Statistik \xf6ver s\xe5nger\n'
>>> print _
Statistik över sånger
Run Code Online (Sandbox Code Playgroud)

使用理解对所有元素执行此操作:

return '\n'.join(x.decode('utf-8') for x in stats_list)
Run Code Online (Sandbox Code Playgroud)