Python 中简单的 ASCII URL 编码

1 投票
6 回答
7701 浏览
提问于 2025-04-16 00:24

看看这个:

import urllib
print urllib.urlencode(dict(bla='Ã'))

输出是

bla=%C3%BC

我想要的很简单,我希望输出是ascii格式,而不是utf-8,所以我需要这样的输出:

bla=%C3

如果我尝试:

urllib.urlencode(dict(bla='Ã'.decode('iso-8859-1')))

这样不行(我所有的python文件都是utf-8编码的):

'ascii' 编码无法在位置 0-1 编码字符:序号不在范围(128)内

在实际应用中,输入是以unicode格式来的。

6 个回答

2

我想要输出的是ascii格式,而不是utf-8。

其实那不是ascii,因为ascii没有0x80以上的字符。你说的可能是ISO-8859-1,或者是代码页1252(这是基于它的Windows编码)。

'Ã'.decode('iso-8859-1')

这就要看你在源文件中是用什么编码保存字符Ã了,对吧?听起来你的文本编辑器是以UTF-8格式保存的。(这其实很好,因为像ISO-8859-1这样的特定地区编码应该尽快淘汰。)

告诉Python你保存的源文件是UTF-8格式的,按照PEP 263的要求:

# coding=utf-8

urllib.quote(u'Ã'.encode('iso-8859-1'))    # -> %C3

或者,如果你不想麻烦,可以使用反斜杠转义:

urllib.quote(u'\u00C3'.encode('iso-8859-1'))    # -> %C3

不过,无论如何,现代的网页应用应该使用UTF-8作为输入,而不是ISO-8859-1或cp1252。

4

看看这个链接:在Python中进行Unicode音译

from unidecode import unidecode
print unidecode(u"\u5317\u4EB0")

# That prints: Bei Jing

在你的情况下:

bla='Ã'
print unidecode(bla)
'A'

这是一个第三方库,可以很简单地通过以下方式安装:

$ git clone http://code.zemanta.com/tsolc/git/unidecode
$ cd unidecode
$ python setup.py install
0

感谢大家提供的解决方案。你们的思路都差不多。

.encode('iso-8859-1') 

我把正确的代码搞得一团糟。

.decode('iso-8859-1')

最后我把它改回了.encode('iso-8859-1'),这样就能正常工作了。

撰写回答