Python(2.6)cStringIO unicode支持?

时间:2012-10-09 13:28:41

标签: python pycurl stringio

我使用python pycurl模块从各种网页下载内容。由于我也想支持潜在的unicode文本,我一直在避免使用cStringIO.StringIO函数,根据python docs:cStringIO - Faster version of StringIO

  

与StringIO模块不同,此模块无法接受无法编码为纯ASCII字符串的Unicode字符串。

...不支持unicode字符串。实际上它声明它不支持无法转换为ASCII字符串的unicode字符串。有人可以向我澄清一下吗?哪些可以和哪些无法转换?

我已经使用以下代码进行了测试,它似乎与unicode一起工作正常:

import pycurl
import cStringIO

downloadedContent = cStringIO.StringIO()
curlHandle = pycurl.Curl()
curlHandle.setopt(pycurl.WRITEFUNCTION, downloadedContent.write)
curlHandle.setopt(pycurl.URL, 'http://www.ltg.ed.ac.uk/~richard/unicode-sample.html')

curlHandle.perform()
content = downloadedContent.getvalue()

fileHandle = open('unicode-test.txt','w')
for char in content:
    fileHandle.write(char)

文件写得正确。我甚至可以在控制台中打印整个内容,所有角色都很好......所以我很困惑的是,cStringIO在哪里失败了?我有什么理由不使用它吗?

[注意:我使用Python 2.6并且需要坚持使用此版本]

1 个答案:

答案 0 :(得分:1)

任何仅使用ASCII代码点(字节值00-7F十六进制)的文本都可以转换为ASCII。基本上任何使用美国英语中不常用的字符的文本都不是ASCII。

在您的示例代码中,您没有将输入转换为Unicode文本;你将它视为未解码的字节。有问题的测试页面以UTF-8编码,您永远不会将其解码为Unicode。

如果您要将解码值转换为Unicode字符串,则无法将该字符串存储在cStringIO对象中。

您可能想要了解Unicode和文本编码(例如ASCII和UTF-8)之间的区别。我可以推荐: