4

エンコーディングエラーの非常に一般的な原因は、Python 2で文字列をunicode追加すると、文字列を強制的に強制変換することですunicode。これにより、混合エンコーディングの問題が発生する可能性があり、デバッグが非常に困難になる可能性があります。

例えば:

import urllib
import webbrowser
name = raw_input("What's your name?\nName: ")
greeting = "Hello, %s" % name
if name == "John":
    greeting += u' (Feliz cumplea\xf1os!)'
webbrowser.open('http://lmgtf\x79.com?q=' + urllib.quote_plus(greeting))

「John」と入力すると、不可解なエラーで失敗します。

/usr/lib/python2.7/urllib.py:1268: UnicodeWarning: Unicode equal comparison faile
d to convert both arguments to Unicode - interpreting them as being unequal
  return ''.join(map(quoter, s))
Traceback (most recent call last):
  File "feliz.py", line 7, in <module>
    webbrowser.open('http://lmgtf\x79.com?q=' + urllib.quote_plus(greeting))
  File "/usr/lib/python2.7/urllib.py", line 1273, in quote_plus
    s = quote(s, safe + ' ')
  File "/usr/lib/python2.7/urllib.py", line 1268, in quote
    return ''.join(map(quoter, s))
KeyError: u'\xf1'

実際のエラーが実際の強制が発生した場所から遠く離れた場所にある場合、追跡するのは特に困難です。

文字列がUnicodeに強制変換されたときにすぐに警告または例外を出すようにPythonを構成するにはどうすればよいですか?

4

2 に答える 2

4

この質問をした後、もう少し調査を行い、完璧な答えを見つけました。Armin Ronacherは、 unicode-naziと呼ばれる素晴らしい小さなツールを作成しました。インストールして、次のようにプログラムを実行するだけです。

python -Werror -municodenazi myprog.py

そして、強制が発生した場所でトレースバックを取得します。

Traceback (most recent call last):
  File "/usr/lib/python2.7/runpy.py", line 162, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "SITE-PACKAGES/unicodenazi.py", line 128, in <module>
    main()
  File "SITE-PACKAGES/unicodenazi.py", line 119, in main
    execfile(sys.argv[0], main_mod.__dict__)
  File "myprog.py", line 4, in <module>
    print foo()
  File "myprog.py", line 2, in foo
    return 'bar' + u'baz'
  File "SITE-PACKAGES/unicodenazi.py", line 34, in warning_decode
    stacklevel=2)
UnicodeWarning: Implicit conversion of str to unicode

暗黙の強制をトリガーするPythonライブラリを扱っていて、例外をキャッチしたり回避したりできない場合は、-Werror:を省略できます。

python -municodenazi myprog.py

少なくとも、発生したときにstderrに出力される警告を確認してください。

/SITE-PACKAGES/unicodenazi.py:119: UnicodeWarning: Implicit conversion of str to unicode
  execfile(sys.argv[0], main_mod.__dict__)
barbaz
于 2012-09-24T01:47:09.043 に答える
0

そのエラーはまったく不可解ではありません。そこから、urllib.quote()(withはによって呼び出されquote_plus()ます)ユニコードをうまく処理できないことがわかります。いくつかの簡単なグーグルと私は、ユニコードの安全な代替案を求めるこの前のSOの質問を見つけました。残念ながら、何も存在しないようです。

于 2012-09-24T00:58:53.020 に答える