Как правильно отменить кавычки url, который должен содержать японские символы


У меня есть, например, следующая строка (которая была построена, как я понял, из неправильно закодированной строки)

Https://ja-jp.facebook.com/%C3%A5%C2%90%C2%8D%C3%A5%C2%8F%C2%A4%C3%A5%C2%B1%E2%80%B9%C3%AF%C2%BD%C5%A0%C3%AF%C2%BD%E2%80%99%C3%A3%E2%80%9A%C2%B2%C3%A3%C6%92%C2%BC%C3%A3%C6%92%CB%86%C3%A3%E2%80%9A%C2%BF%C3%A3%C6%92%C2%AF%C3%A3%C6%92%C2%BC%C3%A3%C6%92%E2%80%BA%C3%A3%C6%92%E2%80%A0%C3%A3%C6%92%C2%AB-219123305237478

Этот url может быть правильно декодируется браузером, показывая следующее:

Https://ja-jp.facebook.com/名古屋jrゲートタワーホテル-219123305237478/

Есть ли способ отменить кавычки / декодировать строку, чтобы она не была представлена следующим образом:

Https://ja-jp.facebook.com/åå ¤å± "i½šï½'ã' 2ム¼ãƒãã 'ããƒãƒ ¼Ã" -219123305237478

Браузер показывает url с таким же мусором изначально в течение короткого времени, но затем без перенаправления он настраивает строку так, чтобы она выглядела хорошо.

Я пытаюсь исправить кодировку с помощью этого простого кода:

def fix_encoding(s):
    for a in aliases:
        for b in aliases:
            try:
                fixed = s.encode(a).decode(b)
            except:
                pass
            else:
                print (a, b)
                print(fixed)

fix_encoding(u'åå¤å±‹ï½Šï½’ゲートタワーホテル-219123305237478')

Лучшие результаты, которые я получил, довольно близки к тому, как это должно выглядеть, но 2 первых символа неверны для всех тех же результатов. Например.:

��屋jrゲートタワーホテル-219123305237478
('1252', 'l8')
2 2

2 ответа:

Первый URL-адрес нарушен. Что произошло, так это то, что некоторые программы считали правильный URL UTF-8 CP1252, хотя в CP1252 было несколько недопустимых байтов. Таким образом, он перевел байты правильного URL из предполагаемого CP1252 в UTF8, но только в том случае, если байты были действительны в CP1252. Недопустимые байты были оставлены, как они были. Именно по этой причине весь URL не восстанавливается одной комбинацией код-декод.

Чтобы обратить описанный процесс, нам нужно, например, следующее код (в Python 2):

#-*-coding:utf8-*-
from six.moves.urllib import parse

correct = 'https://ja-jp.facebook.com/名古屋jrゲートタワーホテル-219123305237478'
url = 'https://ja-jp.facebook.com/%C3%A5%C2%90%C2%8D%C3%A5%C2%8F%C2%A4%C3%A5%C2%B1%E2%80%B9%C3%AF%C2%BD%C5%A0%C3%AF%C2%BD%E2%80%99%C3%A3%E2%80%9A%C2%B2%C3%A3%C6%92%C2%BC%C3%A3%C6%92%CB%86%C3%A3%E2%80%9A%C2%BF%C3%A3%C6%92%C2%AF%C3%A3%C6%92%C2%BC%C3%A3%C6%92%E2%80%BA%C3%A3%C6%92%E2%80%A0%C3%A3%C6%92%C2%AB-219123305237478'
unq_url = parse.unquote(url.encode('ascii'))

res = ''
for c in unq_url.decode('utf8'):
    try:
        res += c.encode('cp1252')
    except:
        res += chr(ord(c))

print res == correct

Я собирался удалить этот вопрос, потому что он кажется бессмысленным, но поскольку он получил некоторые очки, я поделюсь некоторыми мыслями по этому поводу.

[Facebook] скорее всего, url был создан таким образом из-за не кодированного utf-8 текста, который был скопирован откуда-то (или даже с какой-то ошибкой на facebook в прошлом). Некоторые страницы содержат правильно закодированный uri в скриптах рядом со свойством updateURI, которое, по-видимому, используется js для обновления url в адресной строке браузера.

Этот url был вероятно, создается автоматически, где это возможно, или, возможно, добавляется вручную, поэтому старые url из поисковых систем все еще уважаются. Поэтому, скорее всего, бессмысленно искать универсальный способ исправления таких ошибок.