4

我正在使用 python pycurl 模块从各种网页下载内容。因为我还想支持潜在的 unicode 文本,所以我一直在避免使用 cStringIO.StringIO 函数,根据 python 文档: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,需要坚持这个版本]

4

1 回答 1

1

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

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

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

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

于 2012-10-09T13:32:46.130 回答