urllib.parse.quote不会使用utf8

时间:2014-02-16 11:13:18

标签: python python-3.x urllib

我正在尝试按预期使用urllib.parse.quote,但无法让它工作。我甚至尝试过文档中给出的例子

Example: quote('/El Niño/') yields '/El%20Ni%C3%B1o/'.

如果我尝试以下情况发生。

quote('/El Niño/')
  File "<stdin>", line 0

    ^
SyntaxError: 'utf-8' codec can't decode byte 0xf1 in position 13: invalid continuation byte

有人提示有什么不对吗?我使用的是Python 3.2.3

PS:链接到文档http://docs.python.org/3.2/library/urllib.parse.html

2 个答案:

答案 0 :(得分:1)

\xf1latin-1编码的ñ

>>> print(b'\xf1'.decode("latin-1"))
ñ

..不是utf-8编码的字符,如Python 3 assumes by default

>>> print(b'\xf1'.decode("utf-8"))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xf1 in position 0: unexpected end of data

意思是,您编写的.py文件或运行Python shell的终端存在编码问题 - 它向Python提供latin-1编码数据,而不是utf-8

答案 1 :(得分:0)

尝试在源代码的开头添加以下行:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os, sys
…

默认情况下,python假定您的源代码是用ASCII编写的,因此它无法读取源文件中的unicode字符串。阅读有关该主题的PEP-0263

但是,如果你切换到python3,你不需要在shebang行之后放置coding: utf-8评论,因为utf-8 is the default

编辑:刚刚注意到你实际上是在尝试做python3,它应该是utf-8-safe。虽然看错误,但我认为你实际上正在执行python2代码,而你认为​​你正在执行python3。

shebang线是否正确设置?

您是否使用正确的口译员调用脚本?

这是正确的shebang线:

#/usr/bin/env python3

#/usr/bin/python3

而不只是/usr/bin/python/usr/bin/env python

你可以提供完整的失败脚本,以及你在问题中调用它的方式吗?