【问题标题】:How to convert percent-encoded url to string with non-ascii chars?如何将百分比编码的 url 转换为非 ascii 字符的字符串?
【发布时间】:2014-11-11 12:15:00
【问题描述】:

我希望这应该很容易。我有一个网址:

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 字符完好无损。这是为了在存储桶中命名,而不是其他任何东西。我怎样才能产生这个字符串?

【问题讨论】:

    标签: python python-2.7 unicode urllib non-ascii-characters


    【解决方案1】:

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

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

    【讨论】:

    • 我想把最后一部分保存到一个变量中,比如x.split('/')[-1]
    • @edmund_spenser:那就这样做吧。 Unicode 字符串支持拆分,就像字节字符串一样。
    • 我真的被 Unicode 值的 python 表示所迷惑,就像你说的那样。我没有意识到我拥有什么。
    【解决方案2】:

    你已经拥有它了:

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

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

    【讨论】:

    • 将其打印到控制台,但如何将其保存到变量并存储?
    • @edmund_spenser:变量p 已经包含你想要的字符串(完全正确),只是显示方式不同(序列\xe9 是你想要的字符)。
    猜你喜欢
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多