%uXXXX нестандартная схема кодирования , которая была отклонена w3c, несмотря на то, что реализация продолжает жить на на земле JavaScript.
более общая техника, кажется, к UTF-8, кодируют строку, и затем % выходит из получающихся байтов с помощью %XX. Эта схема поддерживается urllib.unquote:
>>> urllib2.unquote("%0a")
'\n'
, К сожалению, если Вы действительно потребность для поддержки %uXXXX Вы будете, вероятно, иметь к декодеру самокрутки. Иначе это, вероятно, будет намного более предпочтительно для просто UTF-8, кодируют Ваш unicode, и затем % выходит из получающихся байтов.
А больше полного примера:
>>> u"Tanım"
u'Tan\u0131m'
>>> url = urllib.quote(u"Tanım".encode('utf8'))
>>> urllib.unquote(url).decode('utf8')
u'Tan\u0131m'
Это сделает это, если у Вас абсолютно должно быть это (я действительно соглашаюсь с криками "нестандартных"):
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
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)
существует ошибка в вышеупомянутой версии, где это волнуется иногда, когда существует и закодированный ASCII и закодированные символы unicode в строке. Я думаю конкретно, когда существуют символы от верхних 128 диапазонов как '\xab' в дополнение к unicode.
, например, "%5B%AB%u03E1%BB%5D" вызывает эту ошибку.
я нашел, сделали ли Вы просто unicode сначала, проблема ушла:
def unquote_u(source):
result = source
if '%u' in result:
result = result.replace('%u','\\u').decode('unicode_escape')
result = unquote(result)
return result