我有一个Unicode字符串,我正在从python中的Web服务中检索。
我需要访问我从该字符串中解析的URL,其中包含各种变音符号。
但是,如果我将unicode字符串传递给urlllib2
,则会产生unicode编码错误。 完全相同的字符串,作为“原始”字符串r"some string"
正常工作。
如何在python中获取unicode字符串的原始二进制表示形式,而不将其转换为系统语言环境?
我已经浏览过python文档,而且每件事似乎都会回到codecs
模块。但是,codecs
模块的文档最多是稀疏的,整个过程似乎都是面向文件的。
我在窗户上,如果它很重要。
答案 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作为编码主题的一个很好的入门。