0

PythonのWebサービスから取得しているUnicode文字列があります。

この文字列から解析したURLにアクセスする必要があります。これには、さまざまな発音区別符号が含まれています。

ただし、Unicode文字列をに渡すとurlllib2、Unicodeエンコーディングエラーが発生します。「生の」文字列とまったく同じr"some string"文字列が正しく機能します。

システムロケールに変換せずに、PythonでUnicode文字列の生のバイナリ表現を取得するにはどうすればよいですか?

私はPythonのドキュメントを読みましたが、すべてがcodecsモジュールに戻ってきたようです。ただし、codecsモジュールのドキュメントはせいぜいまばらであり、全体が非常にファイル指向のようです。


それが重要なら、私は窓にいます。

4

1 に答える 1

3

URLをUnicodeからバイトストリングにエンコードする必要があります。2種類のオブジェクトを生成ますu''。Unicode文字列とバイト文字列。r''

このメソッドを使用してUnicode文字列をバイトコードにエンコードでき.encode()ますが、使用するエンコードを知っておく必要があります。通常、URLの場合、UTF-8は優れていますが、URLスキームに合わせてバイトをエスケープする必要もあります。

import urlparse, urllib

parts = list(urlparse.urlsplit(url))
parts[2] = urllib.quote(parts[2].encode('utf8'))
url = urlparse.urlunsplit(parts)

上記の例は、あなたが直面している問題はURLのパス部分の非ASCII文字が原因であるという知識に基づいた推測に基づいていますが、それ以上の詳細がなければ推測のままにする必要があります。

ドメイン名については、 IDNARFC3490エンコーディングを適用する必要があります。

parts = list(urlparse.urlsplit(url))
parts[1] = parts[1].encode('idna')
parts = [p.encode('utf8') if isinstance(p, unicode) else p for p in parts]
url = urlparse.urlunsplit(parts)

詳細については、PythonUnicodeHOWTOを参照してください。また、エンコーディングに関する優れた入門書として、Joel onSoftwareUnicodeの記事を読むことを強くお勧めします。

于 2012-12-28T09:20:02.447 に答える