2013-05-05 2 views
2

Я эту строку:Преобразование Unicode в кодовые символ Unicode, используя Python 3.3.1

sig=45C482D2486105B02211ED4A0E3163A9F7095E81.4DDB3B3A13C77FE508DCFB7C6CC68957096A406C\u0026type=video%2F3gpp%3B+codecs%3D%22mp4v.20.3%2C+mp4a.40.2%22\u0026quality=small\u 
0026itag=17\u0026url=http%3A%2F%2Fr6---sn-cx5h-itql.c.youtube.com%2Fvideoplayback%3Fsource%3Dyoutube%26mt%3D1367776467%26expire%3D1367797699%26itag%3D17%26factor%3D1.25%2 
6upn%3DpkX9erXUHx4%26cp%3DU0hVTFdUVV9OU0NONV9PTllHOnhGdTVLUThqUWJW%26key%3Dyt1%26id%3Dab9b0e2f311eaf00%26mv%3Dm%26newshard%3Dyes%26ms%3Dau%26ip%3D49.205.30.138%26sparams% 
3Dalgorithm%252Cburst%252Ccp%252Cfactor%252Cid%252Cip%252Cipbits%252Citag%252Csource%252Cupn%252Cexpire%26burst%3D40%26algorithm%3Dthrottle-factor%26ipbits%3D8%26fexp%3D9 
17000%252C919366%252C916626%252C902533%252C932000%252C932004%252C906383%252C904479%252C901208%252C925714%252C929119%252C931202%252C900821%252C900823%252C912518%252C911416 
%252C930807%252C919373%252C906836%252C926403%252C900824%252C912711%252C929606%252C910075%26sver%3D3\u0026fallback_host=tc.v19.cache2.c.youtube.com 

Как вы можете видеть, что содержит обе формы:

  • % хх. Например, %3, %2F и т.д.
  • \ uxxxx. Например, \u0026

Мне нужно преобразовать их в их представление символов в Юникоде. Я использую Python 3.3.1, а urllib.parse.unquote(s) конвертирует только %xx в их представление символов в Юникоде. Однако он не преобразовывает \uxxxx в представление символов в Юникоде. Например, \u0026 должен преобразовать в &.

Как я могу преобразовать их оба?

+0

Я понимаю, что хочу декодировать это, но что заставляет вас думать, что вам нужно «конвертировать в ASCII»? – hobbs

+0

Я разбираю строку и хочу ее разбить. – Nawaz

+0

Вы также можете разбирать строку Unicode. –

ответ

3

Два варианта:

  • Выберите интерпретировать его как JSON; этот формат использует те же escape-коды. Вход должен иметь кавычки вокруг него, чтобы его можно было рассматривать как строку.

  • Кодировать латинскую 1 (сохранить байты), а затем декодировать с unicode_escape кодеком:

    >>> urllib.parse.unquote(sig).encode('latin1').decode('unicode_escape') 
    '45C482D2486105B02211ED4A0E3163A9F7095E81.4DDB3B3A13C77FE508DCFB7C6CC68957096A406C&type=video/3gpp;+codecs="mp4v.20.3,+mp4a.40.2"&quality=small&itag=17&url=http://r6---sn-cx5h-itql.c.youtube.com/videoplayback?source=youtube&mt=1367776467&expire=1367797699&itag=17&factor=1.25&upn=pkX9erXUHx4&cp=U0hVTFdUVV9OU0NONV9PTllHOnhGdTVLUThqUWJW&key=yt1&id=ab9b0e2f311eaf00&mv=m&newshard=yes&ms=au&ip=49.205.30.138&sparams=algorithm%2Cburst%2Ccp%2Cfactor%2Cid%2Cip%2Cipbits%2Citag%2Csource%2Cupn%2Cexpire&burst=40&algorithm=throttle-factor&ipbits=8&fexp=917000%2C919366%2C916626%2C902533%2C932000%2C932004%2C906383%2C904479%2C901208%2C925714%2C929119%2C931202%2C900821%2C900823%2C912518%2C911416%2C930807%2C919373%2C906836%2C926403%2C900824%2C912711%2C929606%2C910075&sver=3&fallback_host=tc.v19.cache2.c.youtube.com' 
    

Это интерпретирует \u экранирующих коды просто нравится Python будет делать при чтении строки литералов в исходном языке Python код.

+0

Второй вариант сработал. Не могли бы вы объяснить, как это работает? Почему вы использовали 'encode ('latin1')', а затем 'decode ('unicode_escape')'? Что каждый из них делает? – Nawaz

+0

Я бы предложил использовать encode(), который использует вашу собственную кодировку. latin1 действительно вызывает больше проблем, чем решает. Если у вас уже есть символы Юникода, они будут кодироваться. Идя в другую сторону, вы должны заботиться о байтах, которые не соответствуют кодировке. И в этом отношении вы действительно должны использовать обработку ошибок «surrogateescape», если знаете, что вам нужно обрабатывать двоичные данные. – underrun

+0

@Nawaz - для того, чтобы отменить последовательности \ u, вам нужно вызвать 'decode ('unicode_escape')' для декодирования escape-последовательностей unicode. Но 'decode' работает только с байтовыми объектами, а не с юникодными строками (это то, что вы получаете от' parse.unquote'). Он сначала вызывает кодировку, чтобы получить байты из строки, а затем декодирует байты обратно в Юникод, чтобы получить текст с неэкранированными последовательностями. – underrun

2

Если я предполагаю, что это более-менее URL-адрес. «% Xx» кодирует один байт за пределами разрешенного набора символов. «\ Uxxxx» кодирует код Unicode. Я считаю, что для URL-адресов нормально кодировать символы Unicode как UTF-8, а затем кодировать байты вне разрешенной кодировки как «% xx» (что влияет на все многобайтовые UTF-8 последовательностей). Это вызывает удивление, что уже есть «% xx'-encoded bytes», потому что перевод кодовых точек Unicode сделает преобразования необратимыми.

Удостоверьтесь, что у вас есть тесты и вы можете проверить фактические результаты, потому что это похоже на небезопасное. По крайней мере I не полностью понимают требования здесь.

Смежные вопросы