2

我有这个字符串:

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

如您所见,它包含两种形式:

  • %xx。例如%3%2F等。
  • \uxxxx。例如,\u0026

我需要将它们转换为它们的 unicode 字符表示。我正在使用Python 3.3.1, 并且urllib.parse.unquote(s)仅转换%xx为它们的 unicode 字符表示。但是,它不会转换\uxxxx为它们的 unicode 字符表示。例如,\u0026应转换为&.

我怎样才能转换它们?

4

2 回答 2

4

两种选择:

  • 选择将其解释为 JSON;该格式使用相同的转义码。输入确实需要在其周围加上引号才能被视为字符串。

  • 编码为 latin 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 源代码中读取字符串文字时所做的那样。

于 2013-05-05T18:08:57.447 回答
2

如果我猜对了,这或多或少是一个 URL。'%xx' 对允许字符集之外的单个字节进行编码。'\uxxxx' 编码一个 Unicode 代码点。我认为 URL 将 Unicode 字符编码为 UTF-8,然后将允许的字符集之外的字节编码为 '%xx' 是正常的(这会影响所有多字节 UTF-8 序列)。令人惊讶的是,已经有 '%xx' 编码的字节,因为翻译 Unicode 代码点会使转换不可逆。

确保您进行了测试并且可以验证实际结果,因为这似乎是不安全的。至少不完全理解这里的要求。

于 2013-05-05T18:14:32.260 回答