「Tan%u0131m」としてエンコードされた「Tanım」のようなユニコード文字列があります。このエンコードされた文字列を元のユニコードに変換するにはどうすればよいですか。どうやら urllib.unquote はユニコードをサポートしていないようです。
5 に答える
%uXXXX は、実装が JavaScript の世界で生き続けているという事実にもかかわらず、w3c によって拒否された非標準のエンコーディング スキームです。
より一般的な手法は、文字列を UTF-8 でエンコードし、%XX を使用して結果のバイトを % エスケープすることです。このスキームは urllib.unquote でサポートされています:
>>> urllib2.unquote("%0a")
'\n'
残念ながら、本当に%uXXXX をサポートする必要がある場合は、おそらく独自のデコーダーを作成する必要があります。それ以外の場合は、単純に Unicode を UTF-8 でエンコードしてから、結果のバイトを % エスケープする方がはるかに望ましい可能性があります。
より完全な例:
>>> u"Tanım"
u'Tan\u0131m'
>>> url = urllib.quote(u"Tanım".encode('utf8'))
>>> urllib.unquote(url).decode('utf8')
u'Tan\u0131m'
def unquote(text):
def unicode_unquoter(match):
return unichr(int(match.group(1),16))
return re.sub(r'%u([0-9a-fA-F]{4})',unicode_unquoter,text)
あなたが絶対にこれを持っている必要があるならば、これはそれをします(私は本当に「非標準」の叫びに同意します):
from urllib import unquote
def unquote_u(source):
result = unquote(source)
if '%u' in result:
result = result.replace('%u','\\u').decode('unicode_escape')
return result
print unquote_u('Tan%u0131m')
> Tanım
上記のバージョンにはバグがあり、文字列に ascii でエンコードされた文字と unicode でエンコードされた文字の両方が含まれていると時々異常が発生します。ユニコードに加えて、「\ xab」のような上位128範囲の文字がある場合に特にそう思います。
例えば。「%5B%AB%u03E1%BB%5D」がこのエラーの原因です。
最初にユニコードを実行しただけで問題が解決したことがわかりました。
def unquote_u(source):
result = source
if '%u' in result:
result = result.replace('%u','\\u').decode('unicode_escape')
result = unquote(result)
return result