0

Как декодировать закодированную url-строку Unicode в Python?

10

У меня есть строка в юникоде, например "Tanım", которая каким-то образом закодирована как "Tan%u0131m". Как я могу преобразовать эту закодированную строку обратно в оригинальный юникод? Судя по всему, функция urllib.unquote не поддерживает юникод.

3 ответ(ов)

0

Если вы хотите перевести данный фрагмент кода на русский язык в стиле ответа на StackOverflow, это может выглядеть следующим образом:

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)

Этот код определяет функцию unquote, которая принимает строку text в качестве аргумента. Внутри функции определена ещё одна функция unicode_unquoter, которая используется для замены символов формата %uXXXX, где XXXX — это 4-значное шестнадцатеричное число, на соответствующий символ Unicode.

В функции unicode_unquoter происходит следующее:

  • match.group(1) получает часть строки, соответствующую группе с шестнадцатеричным числом.
  • int(match.group(1), 16) преобразует шестнадцатеричное число в десятичное.
  • unichr(...) возвращает символ Unicode, соответствующий полученному числу.

Основная функция unquote использует re.sub для замены всех вхождений шаблона %uXXXX в строке text на соответствующие символы Unicode, используя функцию unicode_unquoter для преобразования.

Если у вас есть дополнительные вопросы по этому коду, не стесняйтесь задавать их!

0

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

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

Этот код использует функцию unquote для декодирования URL-строки и дополнительно обрабатывает случаи, когда в строке присутствуют символы Unicode, закодированные в формате %u. Имейте в виду, что использование этого метода может рассматриваться как не стандартное решение, и вам следует учитывать это при разработке.

0

В приведенной версии кода есть ошибка, которая проявляется, когда в строке присутствуют как символы 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

Таким образом, сначала следует заменить '%u' на '\u' и декодировать строку с помощью unicode_escape, а затем применять функцию unquote для остальных символов. Это позволит избежать ошибок при смешанном использовании кодировок.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь