从python中的unicode字符串获取原始字符串

时间:2012-12-28 08:46:29

标签: unicode python-2.7

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

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

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

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

我已经浏览过python文档,而且每件事似乎都会回到codecs模块。但是,codecs模块的文档最多是稀疏的,整个过程似乎都是面向文件的。


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

1 个答案:

答案 0 :(得分:1)

您需要编码从unicode到bytestring的URL。 u''r''生成两种不同的种类的对象;一个unicode字符串和一个bytestring。

您可以使用.encode()方法将unicode字符串编码为字节码,但您需要知道要使用的编码。通常,对于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 encoding

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 article作为编码主题的一个很好的入门。