为什么我不能将 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 escaping
或url 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
才能执行正确的操作。
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 escaping
或url 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
才能执行正确的操作。