53

「Tan%u0131m」としてエンコードされた「Tanım」のようなユニコード文字列があります。このエンコードされた文字列を元のユニコードに変換するにはどうすればよいですか。どうやら urllib.unquote はユニコードをサポートしていないようです。

4

5 に答える 5

70

%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'
于 2008-11-18T23:22:44.060 に答える
11
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)
于 2008-11-18T23:22:24.703 に答える
7

あなたが絶対にこれを持っている必要があるならば、これはそれをします(私は本当に「非標準」の叫びに同意します):

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
于 2008-11-18T23:32:49.127 に答える
4

上記のバージョンにはバグがあり、文字列に 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
于 2008-12-16T03:13:58.407 に答える