假设我在Python中读取了socket中的一些内容 并且必须在运行中将其解码为UTF-8。
我无法将所有内容保存在内存中, 所以我必须在接收时将其解码并保存到文件中。
可能会发生,我只会收到部分字符的字符, (€-sign由三个字节表示,例如在Python中为'\ xe2 \ x82 \ xac')。
如果我尝试解码,假设我只收到前两个字节(\ xe2 \ x82) 它,我正如预期的那样得到'UnicodeDecodeError'。
我总是可以尝试解码当前内容并检查它是否会抛出异常
由于
答案 0 :(得分:6)
Guido的时间机器再次出现。
>>> dec = codecs.getincrementaldecoder('utf-8')()
>>> dec.decode('foo\xe2\x82')
u'foo'
>>> dec.decode('\xac')
u'\u20ac'
答案 1 :(得分:1)
如何使用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)
免责声明:我对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完成)