0

我有一个 Unicode 字符串,我正在从 python 中的 Web 服务中检索。

我需要访问从该字符串中解析的 URL,其中包括各种变音符号。

但是,如果我将 unicode 字符串传递给urlllib2,则会产生 unicode 编码错误。与“原始”字符串完全相同r"some string"的字符串可以正常工作。

如何在 python 中获取 unicode 字符串的原始二进制表示,而不将其转换为系统语言环境?

我已经阅读了 python 文档,每件事似乎都回到了codecs模块中。然而,该codecs模块的文档充其量是稀疏的,整个事情似乎非常面向文件。


我在窗户上,如果它很重要的话。

4

1 回答 1

3

您需要将 URL 从 unicode编码为字节串。u''r''产生两种不同的物体;一个 unicode 字符串和一个字节串。

您可以使用该方法将 unicode 字符串编码为字节码.encode(),但您需要知道要使用什么编码。通常,对于 URL,UTF-8 很好,但您也需要转义字节以适应 URL 方案:

import urlparse, urllib

parts = list(urlparse.urlsplit(url))
parts[2] = urllib.quote(parts[2].encode('utf8'))
url = urlparse.urlunsplit(parts)

上面的示例基于一个有根据的猜测,即您面临的问题是由于 URL 的路径部分中的非 ASCII 字符造成的,但是如果没有您提供更多详细信息,它必须保持猜测。

对于域名,您需要应用IDNA RFC3490 编码

parts = list(urlparse.urlsplit(url))
parts[1] = parts[1].encode('idna')
parts = [p.encode('utf8') if isinstance(p, unicode) else p for p in parts]
url = urlparse.urlunsplit(parts)

有关更多信息,请参阅Python Unicode HOWTO。我还强烈建议您阅读Joel on Software Unicode 文章作为编码主题的良好入门。

于 2012-12-28T09:20:02.447 回答