【问题标题】:Python(2.6) cStringIO unicode support?Python(2.6) cStringIO unicode 支持?
【发布时间】:2012-09-29 20:25:54
【问题描述】:

我正在使用 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,需要坚持这个版本]

【问题讨论】:

    标签: python pycurl stringio


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 嗯,我仍然觉得它有点混乱我想我现在会去谷歌更多......基本上我无法想象我会收到错误的情况,因为我正在使用 cStringIO 和不是 StringIO ...在什么情况下我需要将字节编码为 un​​icode 文本?在我看来,我可以像现在一样对数据进行任何操作(但我必须承认我没有尝试过任何东西......我现在会尝试一下)......顺便说一句,感谢您的超快速响应;)
    • decode 到 unicode 文本;该页面已以 UTF-8 编码。不,您不需要解码,因为您的 解析器 知道如何处理编码的 XML 或 HTML。
    • 是否有可能将某些页面编码为 un​​icode(我认为是 UTF-16?)。因此,如果我四处爬行,我可能会因为尝试存储在 cStringIO 中而遇到这样的页面并出错?
    • @IvanKovacevic:不,因为 UTF-16 仍然是使用简单字节的编码。可以放入磁盘文件中的所有内容都可以放入cStringIO 对象中。只有 python unicode 类型不能存储在这样的对象中,除非先将其编码为字节串。
    • 不,cStringIO 应该没问题。
    猜你喜欢
    • 2010-12-23
    • 2011-03-08
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 2013-07-16
    • 2012-08-02
    相关资源
    最近更新 更多