Как декодировать закодированную url-строку Unicode в Python?
У меня есть строка в юникоде, например "Tanım", которая каким-то образом закодирована как "Tan%u0131m". Как я могу преобразовать эту закодированную строку обратно в оригинальный юникод? Судя по всему, функция urllib.unquote
не поддерживает юникод.
3 ответ(ов)
Если вы хотите перевести данный фрагмент кода на русский язык в стиле ответа на 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
для преобразования.
Если у вас есть дополнительные вопросы по этому коду, не стесняйтесь задавать их!
Если вам абсолютно необходимо это сделать (я действительно согласен с тем, что это "не стандартно"), вы можете использовать следующий код:
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
. Имейте в виду, что использование этого метода может рассматриваться как не стандартное решение, и вам следует учитывать это при разработке.
В приведенной версии кода есть ошибка, которая проявляется, когда в строке присутствуют как символы 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
для остальных символов. Это позволит избежать ошибок при смешанном использовании кодировок.
UnicodeEncodeError: 'ascii' кодек не может закодировать символ u'\xa0' на позиции 20: номер не в диапазоне (128)
Как скачать файл по HTTP?
UnicodeDecodeError: Кодек 'charmap' не может декодировать байт X в позиции Y: символ отображается как <неопределённый>
Как лучше всего удалить акценты (нормализовать) в строке Unicode Python?
Как получить не-ASCII URL с помощью urlopen?