为什么我不能将 unicode 字符串转换为纯 python 字符串?

Why can't I convert unicode string to plain python string?

url = u'/wiki/Category:%E6%89%93%E7%A3%9A%E5%A1%8A'

解码后的字符串是(通过https://www.urldecoder.org/):

decoded_url = u'/wiki/Category:打磚塊'

在python中,我有以下代码来做这个转换:

decoded_url = url.decode('utf-8')

这段代码根本没有改变它。我也试过:

decoded_url = url.encode('utf-8')

字符串保持不变。如何将其转换为我想要的解码字符串?

不是UTF-8 encoding而是url escapingurl quoting

import urllib.parse

print( urllib.parse.unquote( u'/wiki/Category:%E6%89%93%E7%A3%9A%E5%A1%8A') )

结果

/wiki/Category:打磚塊

Python 3.x 文档:urllib.parse


编辑:

Python 2.7 在模块 urlparse

中有它
 import urlparse

 print( urlparse.unquote(u'/wiki/Category:%E6%89%93%E7%A3%9A%E5%A1%8A') )

Python 2.7 文档:urlparse


编辑:

在使用 Python 2.7 测试后,它需要 encode()unquote() 之前使用 str(纯文本)而不是 unicode

#-*- coding:  utf-8 -*-
import urlparse
 
url = u'/wiki/Category:%e6%89%93%E7%A3%9A%E5%A1%8A'
url = url.encode('utf-8')    # convert `unicode` to `str`
url = urlparse.unquote(url)  # convert `%e6%89%93%E7%A3%9A%E5%A1%8A` to `打磚塊`

print url
print type(url)
print '打磚塊' in url

结果

/wiki/Category:打磚塊
<type 'str'>
True

顺便说一句:Python 3 相同 - 它不需要 encode()

import urllib.parse
 
url = u'/wiki/Category:%e6%89%93%E7%A3%9A%E5%A1%8A'
url = urllib.parse.unquote(url)  # convert `%e6%89%93%E7%A3%9A%E5%A1%8A` to `打磚塊`

print(url)
print(type(url))
print('打磚塊' in url)

结果:

/wiki/Category:打磚塊
<class 'str'>
True

这里是 Python 2.7 代码,可以从您问题的原始字符串中得到您想要的结果:

import urlparse

utfStr = u"/wiki/Category:%E6%89%93%E7%A3%9A%E5%A1%8A"
asciiStr = utfStr.encode()
str = urlparse.unquote(asciiStr)
print(str)

结果:

/wiki/Category:打磚塊

似乎 unquote 在给定一个 unicode 字符串时做了错误的事情。您必须先将其转换为单字节字符串,然后 unquote 才能执行正确的操作。