python syntaxerror 結合時のUnicodeDecodeError



unicodedecodeerror ascii (3)

私はいくつかの文字列(ほとんどが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']

私がそれに参加しようとするとき:

return '\n'.join(stats_list)

私はこのエラーが発生します:

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

リストを見るだけで何が起こるのか、何か手がかりを得ることは可能ですか? リストをループして画面に表示すると、次のようになります。

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)

しかしそれは戻った:

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)

編集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)

song_statsexts_stats 、およびwisher_statsはクラス内の辞書です。


Answer #1

Pythonは文字列'Statistik \xc3\xb6ver s\xc3\xa5nger\n'をASCII文字列に変換できないと訴えています。 すべてのUNICODE文字列の先頭にu付けてください。

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

Answer #2

文字列はUTF-8でエンコードされます。 それらをunicode.decodeする必要が.decodeます:

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

理解を使用してこれをすべての要素に対して実行します。

return '\n'.join(x.decode('utf-8') for x in stats_list)

Answer #3

あなたの問題はおそらく、ユニコード文字列とバイト文字列を混ぜていることでしょう。

"Edit 2"のコードには、いくつかのUnicode文字列がstats_listに追加されていstats_list

stats_list = [u'Statistik över sånger\n', u'Antal\tSång']

これらのユニコード文字列をデコードしようとすると、 UnicodeEncodeError返されます。 これは、Pythonがデフォルトのエンコーディング(通常は "ascii")を使用してデコードする前に文字列をエンコード するためです。 バイト文字列をデコードするのは今までにない意味があります。

したがって、まず、関数の最終行を次のように変更します。

return '\n'.join(stats_list)

これで、 stats_listに追加される他の文字列がバイト文字列であるかどうかを確認し、最初に正しくUnicode文字列にデコードされるようにする必要があります。

したがって、次のように3行の後にprint type(line)置く:

line = '%s\t%s' % row

<type 'str'>出力するところで、 次の行を次のように変更します

stats_list.append(line.decode('utf-8'))

もちろん、 <type 'unicode'>出力すると、次の行を変更する必要はありません。

もっと良い解決策は、辞書のsong_statsexts_stats 、およびwisher_statsがどのように作成されているかを調べ、それらが常にUnicode文字列(またはASCII文字のみを含むバイト文字列)を含んでいることを確認することです。





character-encoding