【问题标题】:decode content while reading from socket in Python在 Python 中从套接字读取时解码内容
【发布时间】:2014-12-27 21:16:00
【问题描述】:

假设我从 Python 中的套接字读取了一些内容 并且必须即时将其解码为 UTF-8。

我无法将所有内容都保存在内存中, 所以我必须在收到并保存到文件时对其进行解码。

可能会发生,我只会收到部分字符字节, (€-符号由三个字节表示,例如在 Python 中为 '\xe2\x82\xac')。

假设我只收到前两个字节 (\xe2\x82),如果我尝试解码 它,正如预期的那样,我得到了“UnicodeDecodeError”。

我总是可以尝试解码当前内容并检查它是否抛出异常

  • 但是这种方法的可靠性如何?
  • 我如何知道或确定我是否可以解码当前内容?
  • 如何正确操作?

谢谢

【问题讨论】:

    标签: python sockets unicode utf-8


    【解决方案1】:

    Guido 的时间机器又来了。

    >>> dec = codecs.getincrementaldecoder('utf-8')()
    >>> dec.decode('foo\xe2\x82')
    u'foo'
    >>> dec.decode('\xac')
    u'\u20ac'
    

    【讨论】:

    • 有效!这个解码器是否保持状态?否则它如何知道其中已经可用的字节?内存消耗呢?我是否必须每隔一段时间重新创建解码器?
    • 它可能将未解码的字节存储在某处。使用 UTF-8 意味着它将存储多达 3 个字节。 decode() 的第二个参数最终确定了当前的解码操作,并允许您使用 reset() 来回收它。
    【解决方案2】:

    如何使用functools.partial 和codecs.iterdecode 的组合(如图here)?

    我创建了一个包含 € 符号的文件,并且似乎可以按预期工作(尽管您不是从文件中读取,如下所示,而是从您的套接字中读取):

    #!/usr/bin/env python
    
    import codecs
    import functools
    import sys
    
    with open('stack70.txt', 'rb') as euro_file:
        f_iterator = iter(functools.partial(euro_file.read, 1), '')
        for item in codecs.iterdecode(f_iterator, 'utf-8'):
            print "sizeof item: %s, item: %s" % (sys.getsizeof(item), item)
    

    免责声明:我对@9​​87654325@ 几乎没有经验,所以我不能 100% 确定这会满足您的需求,但是(据我所知)确实如此,对?

    stack70.txt 是充满“欧元”符号的文件。上面的代码输出:

    sizeof item: 56, item: €
    sizeof item: 56, item: €
    sizeof item: 56, item: €
    sizeof item: 56, item: €
    sizeof item: 56, item: €
    

    (使用 python 2.7 完成)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-10
      • 1970-01-01
      • 2011-10-29
      • 2016-10-05
      • 1970-01-01
      相关资源
      最近更新 更多