У меня есть строка юникода, такая как "Tanım", которая каким-то образом закодирована как "Tan% u0131m". Как я могу преобразовать эту закодированную строку обратно в исходный Unicode. Очевидно, urllib.unquote не поддерживает unicode.
Как исключить строку urlencoded unicode в python?
Ответ 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