2012年8月20日月曜日

[python]rietveld で UnicodeEncodeError

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 件のコメント:

コメントを投稿