7

今では完全に混乱しています...私はpython/djangoで開発しており、pythonロギングを使用しています。私のアプリはすべて Unicode を必要とし、すべてのモデルにはUnicode ()`, return u'..' メソッドのみが実装されています。ログを記録しているときに、再現できることを発見するのに長い時間がかかったという、本当に奇妙な問題に遭遇しました。Py 2.5.5 と Py 2.6.4 の両方を試しましたが、同じことです。そう

次のような簡単なロギングを行うときはいつでも:

logging.debug(u'new value %s' % group) 

これはモデル グループを呼び出します。unicode (): unicode(group.name) を返します

私のユニコードメソッドはすべて次のようになります。

def __unicode__(self):
    return u'%s - %s (%s)' % (self.group, self.user.get_full_name(), self.role)

これは、group.name が XXX または ÄÄÄ (ユニコードが必要) の場合でも機能します。しかし、何らかの理由でセット、リスト、辞書、django-query セット、および個々のインスタンスをログに記録したい場合、たとえばリストがユニコードであるかどうかにかかわらず、問題が発生します...

したがって、これにより、group.name が Luleå (私の故郷) のような Unicode を必要とするたびに、UnicodeDecodingError が返されます。

logging.debug(u'new groups %s' % list_of_groups)

通常、次のようなエラーが表示されます。

Exception Type:     UnicodeDecodeError
Exception Value:    ('ascii',  '<RBACInstanceRoleSet: s2 | \xc3\x84\xc3\x96\xc3\x96\xc3\x85\xc3\x85\xc3\x85 Gruppen>]', 106, 107, 'ordinal not in range(128)')

しかし、私が行うとprint list_of_groups、端末ですべてがうまくいきます

したがって、私の理解では、リストはそれ自体を生成し始め、そのすべての要素に対して repr() を実行し、値を返します。この場合は 's2 | ÅÄÖÖ' の場合、リストは (ascii, the-stuff-in-the-list) として表示され、asciiを Unicode にデコードしようとすると、もちろん機能しません。リスト内の要素の 1 つが返されたためです。再現が行われたとき、それ自体のu'...'。

でもなんでこれ????´

そして、group.nameなどの単純なものをログに記録し、ユニコードメソッドが呼び出されるたびに、物事が機能し、ユニコード/ asciiが正しく処理されるのはなぜですか。怠惰になってリストをログに記録したいときはいつでも、ユニコード文字に遭遇するたびにセットやその他のものがうまくいきません...

うまくいく例と失敗する例をいくつか。group.nameモデルフィールドに移動してgroup呼び出した場合__unicode__()

    logging.debug("1. group: %s " % group.name) # WORKS
    logging.debug(u"2. group: %s " % group) # WORKS
    logging.debug("3. group: %s " % group) # FAILS
    logging.debug(u"4. group: %s " % group.name) # WORKS
    logging.debug("5. group: %s " % group.name) # WORKS

...そして、私は本当に Unicode を把握していると思っていました ;-(

4

9 に答える 9

2

ここに私のテストコードがあります:

#-*- coding: utf-8 -*-                                      
class Wrap:                                          
    def __init__(self, s): self.s = s
    def __repr__(self): return repr(self.s)    
    def __unicode__(self): return unicode(self.s)
    def __str__(self): return str(self.s)

s = 'hello'  # a plaintext string
u = 'ÅÄÖÖ'.decode('utf-8') 
l = [s,u]
test0 = unicode(repr(l))
test1 = 'string %s' % l
test2 = u'unicode %s' % l

上記は、実行すると正常に機能します。ただし、reprの宣言を次のように変更すると: def repr (self): return unicode(self.s)

次に、次のように中止します。

Traceback (most recent call last):
  File "mytest.py", line 13, in <module> unicode(l)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-3:
   ordinal not in range(128)

そのため、オブジェクト階層の誰かが、通常の文字列ではなく Unicode 文字列を誤って返す repr() 実装を持っているようです。他の誰かが言ったように、次のようなフォーマット文字列を実行すると

'format %s' % mylist

mylist はシーケンスであり、python は自動的に unicode() ではなく repr() を呼び出します (リストを Unicode 文字列として表現する「正しい」方法がないため)。

ここで問題があるのは django である可能性があります。または__repr__、モデルの 1 つで間違って実装した可能性があります。

#
于 2010-09-17T00:11:55.553 に答える
1

このコードを views.py の先頭で使用してみてください

#-*- coding: utf-8 -*-
...
于 2010-05-06T07:30:10.937 に答える
1

簡単なテストでは問題を再現できません。

Python 2.6.4 (r264:75706、2009 年 12 月 7 日、18:45:15)
[GCC 4.4.1] Linux2 で
詳細については、「ヘルプ」、「著作権」、「クレジット」、または「ライセンス」と入力してください。
>>> インポートログ
>>> group = u'Luleå'
>>> logging.warning('グループ: %s', グループ)
WARNING:root:Group: ルレオ
>>> logging.warning(u'Group: %s', group)
WARNING:root:Group: ルレオ
>>>

したがって、ダニエルが言うように、ロギングに渡すものには適切な Unicode ではないものがある可能性があります。

また、使用しているハンドラーはわかりませんが、使用する出力エンコーディングを明示的に指定するファイルハンドラーがあるかどうかを確認し、ストリームハンドラーがある場合は、それを必要とする出力ストリームをエンコーディングでラップしますcodecsモジュールによって提供されるようなラッパー(およびラップされたストリームをロギングに渡します)。

于 2010-01-21T20:18:49.590 に答える
0

set / list / dict / djangoクエリセットをログに記録しようとしたときに、回答されたアドバイスに従い、すべてのコードを調べ、リスト内包表記などを実行しました。したがって、このようなものを適応させて追加することで、私はそれを解決しました:

logging.debug(u"new groups: %s" % [unicode(g) for g in list_of_groups])

だから今私がしなければならないのは、これを忘れないことを決して忘れないことです;-)

于 2010-01-22T09:36:30.453 に答える
0

結果を手動でユニコードにしようとしましたか?

logging.debug(u'new groups %s' % unicode(list_of_groups("UTF-8"))
于 2010-08-11T06:42:54.707 に答える
0

小切手:

import locale
locale.getpreferredencoding()

「utf8」でなければなりません。私は「cp1252」を持っています。

manage.py に追加するのを手伝ってくれました:

import _locale
_locale._getdefaultlocale = (lambda *args: ['en_US', 'utf8'])

Windows 10、Django 1.10.3、Python 3.5.2、ロシア語の問題を修正

于 2016-11-25T10:47:14.537 に答える
0

私が何を言っているのか理解できていないなら、あなたが理解していないことを私は理解していません。あなたの真ん中の段落:

したがって、私の理解では、リストはそれ自体を生成し始め、そのすべての要素に対して repr() を実行し、値を返します。この場合は 's2 | ÅÄÖÖ' の場合、リストは (ascii, the-stuff-in-the-list) として表示され、ascii を Unicode にデコードしようとすると、もちろん機能しません。リスト内の要素の 1 つが返されたためです。再現が行われたとき、それ自体のu'...'。

何が起こっているのかを正確に説明しています-リストの出力は、そのすべての要素を出力することと同じではありません. 生のリストを出力するのではなく、各要素で unicode を呼び出すリスト内包表記をログに記録して、それを修正することができます。

于 2010-01-21T20:10:10.460 に答える
0

同じ問題が発生しました: http://hustoknow.blogspot.com/2012/09/unicode-quirks-in-django.htmlを参照してください。

str () メソッドを宣言して、Django のデフォルトの動作をオーバーライドすると、この問題を回避できます。または、logging() ステートメントの前に常に u' のプレフィックスを付ける必要があります。

于 2012-09-21T14:58:24.997 に答える