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

时间:2014-11-11 12:15:00

标签: 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)

在文件中,URL已变为:

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

我可以使用以下代码获取原始的,可用的,百分比编码的URL:

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éon完整的非ascii字符。这是用于存储桶中的命名目的,而不是用于任何其他目的。我怎样才能产生这个字符串?

2 个答案:

答案 0 :(得分:4)

只需打印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并显示é

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

答案 1 :(得分:1)

你已经拥有它:

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

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