Python 如何将百分比编码url转换为带有非ascii字符的字符串?

Python 如何将百分比编码url转换为带有非ascii字符的字符串?,python,python-2.7,unicode,urllib,non-ascii-characters,Python,Python 2.7,Unicode,Urllib,Non Ascii Characters,我希望这应该是一个简单的问题。我有一个网址: http://uploads4.wikiart.org/images/marc-chagall/kopeikin-and-napol%C3%A9on.jpg 使用以下代码保存到json文件中: paintings = get_all_paintings(marc_chagall) with open('chagall.json', 'w') as fb: x = json.dump(paintings, fb) p = u'http://u

我希望这应该是一个简单的问题。我有一个网址:

http://uploads4.wikiart.org/images/marc-chagall/kopeikin-and-napol%C3%A9on.jpg

使用以下代码保存到json文件中:

paintings = get_all_paintings(marc_chagall)
with open('chagall.json', 'w') as fb:
    x = json.dump(paintings, fb)
p = u'http://uploads4.wikiart.org/images/marc-chagall/kopeikin-and-napol\xe9on.jpg'
p = urllib.quote(p.encode('utf8'), safe='/:')
print repr(p) 
> 'http://uploads4.wikiart.org/images/marc-chagall/kopeikin-and-napol%C3%A9on.jpg'
在该文件中,URL已变为:

u'http://uploads4.wikiart.org/images/marc-chagall/kopeikin-and-napol\xe9on.jpg'
我可以使用以下代码获取原始的可用百分比编码URL:

paintings = get_all_paintings(marc_chagall)
with open('chagall.json', 'w') as fb:
    x = json.dump(paintings, fb)
p = u'http://uploads4.wikiart.org/images/marc-chagall/kopeikin-and-napol\xe9on.jpg'
p = urllib.quote(p.encode('utf8'), safe='/:')
print repr(p) 
> 'http://uploads4.wikiart.org/images/marc-chagall/kopeikin-and-napol%C3%A9on.jpg'
现在是棘手的部分。我想得到这个字符串:

http://uploads4.wikiart.org/images/marc-chagall/kopeikin-and-napoléon.jpg

napolé中的非ascii字符保持不变。这是为了在存储桶中命名,而不是为了其他目的。如何生成此字符串?

只需打印unicode值:

>>> print u'http://uploads4.wikiart.org/images/marc-chagall/kopeikin-and-napol\xe9on.jpg'
http://uploads4.wikiart.org/images/marc-chagall/kopeikin-and-napoléon.jpg
不要将Unicode值的python表示形式(故意对非ASCII字符使用转义符以便于调试和内省)与实际值混淆

打印将值编码到控制台或终端使用的编解码器中,前提是Python能够检测到该值。我的终端设置为UTF-8,因此Python将U+00E9 unicode代码点编码为C3 A9字节,然后我的终端将其解释为UTF-8并显示
é


这一切只意味着您已经有了正确的值,但被调试输出抛出。

只需打印unicode值:

>>> print u'http://uploads4.wikiart.org/images/marc-chagall/kopeikin-and-napol\xe9on.jpg'
http://uploads4.wikiart.org/images/marc-chagall/kopeikin-and-napoléon.jpg
不要将Unicode值的python表示形式(故意对非ASCII字符使用转义符以便于调试和内省)与实际值混淆

打印将值编码到控制台或终端使用的编解码器中,前提是Python能够检测到该值。我的终端设置为UTF-8,因此Python将U+00E9 unicode代码点编码为C3 A9字节,然后我的终端将其解释为UTF-8并显示
é

这一切只意味着您已经拥有了正确的值,但是被调试输出抛出了。

您已经拥有了它:

print u'http://uploads4.wikiart.org/images/marc-chagall/kopeikin-and-napol\xe9on.jpg'
p
的值已经是该字符串,只是显示方式不同而已。

您已经有了它:

print u'http://uploads4.wikiart.org/images/marc-chagall/kopeikin-and-napol\xe9on.jpg'

p
的值已经是该字符串了,只是显示方式不同。

将其打印到控制台,但如何将其保存到变量并存储?@edmund_spenser:variable
p
已经包含您想要的字符串(确切地说),只是显示方式不同而已(序列
\xe9
是您想要的字符)。这会将其打印到控制台,但如何将其保存到变量并存储?@edmund\u spenser:variable
p
已经包含了您想要的字符串(确切地说),它只是以不同的方式显示(序列
\xe9
是您想要的字符)。我想将最后一部分保存到变量中,如
x.split('/')[-1]
@edmund_spenser:那就这么做吧。Unicode字符串像字节字符串一样支持拆分。正如你所说,我真的被Unicode值的python表示形式所迷惑。我不知道我有什么。我想把最后一部分保存到一个变量中,比如
x.split('/')[-1]
@edmund_spenser:那就这么做吧。Unicode字符串像字节字符串一样支持拆分。正如你所说,我真的被Unicode值的python表示所迷惑。我不知道我有什么。