Подтвердить что ты не робот

Как исключить строку urlencoded unicode в python?

У меня есть строка юникода, такая как "Tanım", которая каким-то образом закодирована как "Tan% u0131m". Как я могу преобразовать эту закодированную строку обратно в исходный Unicode. Очевидно, urllib.unquote не поддерживает unicode.

4b9b3361

Ответ 1

% uXXXX является нестандартной схемой кодирования, которая была отвергнута w3c, несмотря на то, что реализация продолжает жить в Земля JavaScript.

Более распространенный метод, по-видимому, состоит в том, чтобы UTF-8 кодировал строку, а затем% удалял полученные байты, используя% XX. Эта схема поддерживается urllib.unquote:

>>> urllib2.unquote("%0a")
'\n'

К сожалению, если вам действительно нужно , чтобы поддерживать% uXXXX, вам, вероятно, придется катить свой собственный декодер. В противном случае, скорее всего, будет гораздо предпочтительнее просто UTF-8 кодировать ваш Юникод, а затем% избежать получающихся байтов.

Более полный пример:

>>> u"Tanım"
u'Tan\u0131m'
>>> url = urllib.quote(u"Tanım".encode('utf8'))
>>> urllib.unquote(url).decode('utf8')
u'Tan\u0131m'

Ответ 2

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)

Ответ 3

Это будет сделано, если вам это абсолютно необходимо (я действительно согласен с криками "нестандартных" ):

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

Ответ 4

есть ошибка в вышеприведенной версии, где она иногда возникает, когда в строке есть как закодированные в кодировке ascii, так и кодированные в кодировке Unicode символы. Я думаю, что это особенно важно, когда в дополнение к unicode есть символы из верхнего диапазона 128, например '\ xab'.

например. "% 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