在Python中从socket读取内容时解码内容

2024-06-26 00:28:47 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我从Python的socket中读取了一些内容 必须在飞行中把它解码成UTF-8。在

我不能把所有的内容都记在记忆里, 所以我必须在接收时解码并保存到文件中。在

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

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

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

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

谢谢


Tags: 文件方法内容字节socket解码字符utf
2条回答

吉多的时间机器又来了。在

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

使用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是一个充满“euro”符号的文件。上述代码输出:

^{pr2}$

(使用Python2.7完成)

相关问题 更多 >