def _oauth_escape(val):
if isinstance(val, unicode):# useful ?
val = val.encode("utf-8")#useful ?
return urllib.quote(val, safe="~")
役に立たないと思いますが、
はい ??
更新しました
ユニコードは「utf-8」だと思います、はい?
他の人がすでに言っているように、Unicode と utf-8 は同じではありません。Utf-8 は、Unicode の多くのエンコーディングの 1 つです。
unicode
オブジェクトは「エンコードされていない」ユニコード文字列と考えてください。一方、string
オブジェクトは特定のエンコーディングでエンコードされています (残念ながら、文字列オブジェクトには、エンコード方法を示す属性がありません)。
val.encode("utf-8")
この Unicode オブジェクトを utf-8 でエンコードされた文字列オブジェクトに変換します。
urllib
Python 2.6 では、 Unicode を適切に処理できないため、これが必要です。
>>> import urllib
>>> urllib.quote(u"")
''
>>> urllib.quote(u"ä")
/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib.py:1216: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
res = map(safe_map.__getitem__, s)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/urllib.py", line 1216, in quote
res = map(safe_map.__getitem__, s)
KeyError: u'\xe4'
>>> urllib.quote(u"ä".encode("utf-8"))
'%C3%A4'
ただし、すべての文字列が Unicode である Python 3.x (エンコードされた文字列に相当する Python 3 はbytes
オブジェクトです) では、もう必要ありません。
>>> import urllib.parse
>>> urllib.parse.quote("ä")
'%C3%A4'
utf-8 はエンコーディングであり、Unicode データを一連のバイトとして具体的に表現するためのレシピです。これは、そのような多くのエンコーディングの 1 つです。Pythonstr
オブジェクトはバイト文字列であり、特定のエンコーディングのテキストなど、任意のバイナリ データを表すことができます。
Python の unicode 型は、テキストを表現するための抽象的でエンコードされていない方法です。Unicode 文字列は、多くのエンコーディングのいずれかでエンコードできます。
Python 3.0 では、すべての文字列が Unicode をサポートしていますが、以前のバージョンでは、文字列を明示的に Unicode 文字列にエンコードする必要がありました。それはそれでしょうか?
(utf-8 は唯一ではありませんが、Unicode の最も一般的なエンコーディングです。これを読んでください。)