在Python中从套接字读取时解码内容

时间:2014-12-27 21:16:00

标签: python sockets unicode utf-8

假设我在Python中读取了socket中的一些内容 并且必须在运行中将其解码为UTF-8。

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

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

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

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

  • 但这种方法有多可靠?
  • 如何知道或确定我是否可以解码当前内容?
  • 如何做到正确?

由于

2 个答案:

答案 0 :(得分:6)

Guido的时间机器再次出现。

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

答案 1 :(得分:1)

如何使用functools.partialcodecs.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)

免责声明:我对codecs没什么经验,所以我不是百分百肯定这会做你想要的,但是(据我所知),它确实如此,对吗?

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完成)