UnicodeEncodeError : 'ascii' codec can't encode characters
このエラーそのものは、pythonでマルチバイト文字を扱ってるとよく起きる。
rietveld で diff を登録して View しようとするとエラーでトレースバックでこれが表示。
どうしてだろうと思いながら原因は明白だった。
SVNリポジトリのパスにマルチバイト文字を含んでいたら。
日本でSVNリポジトリに日本語文字列を含んでることって可能性としては低くないはず。
解決するには、 models.py の fetch_base 関数で result = urlfetch.fetch(url) にてHTMLレスポンスを期待してるところをエラーにならんようにする。
エラーにならんようにするには、単純に unicode の url 変数にマルチバイト文字が含まれているのでうまいことその部分をエンコードしてやる。
urlparseを使って回避してみた。
try:
url_list = urlparse.urlparse(url)
url_path = url_list[2] # URLパスを取得
url_path = urllib.quote(url_path.encode('utf-8')).decode('utf-8') # URLパスのマルチバイト文字をURLエンコード
# TODO パラメータもURLエンコード
new_url_list = list(url_list)
new_url_list[2] = url_path # URLパスをエンコードしたunicode型の文字列に入れ替え
url = urlparse.urlunparse(new_url_list) # URL生成
result = urlfetch.fetch(url)
except urlfetch.Error, err:
msg = 'Error fetching %s: %s: %s' % (url, err.__class__.__name__, err)
logging.warn('FetchBase: %s', msg)
raise FetchError(msg)
except Exception:
raise Exception('error')
こんな感じにしました。
そもそもURLにマルチバイト文字を含めるなっつうことですね。
あと、私の環境ではHTTPステータスが401です。
これどうしたもんか。
Basic認証は実装されてない感じ?
0 件のコメント:
コメントを投稿