Python:获取字符串的字节大小

129

我有一个字符串需要通过网络发送。 我需要检查它所占用的总字节数。

sys.getsizeof(string_name) 返回额外的字节。 例如,对于sys.getsizeof("a")返回22,而在python中一字符只占1个字节。 是否有其他方法可以找到这个结果?


你使用的是哪个版本的Python? - squiguy
10
这是因为在Python中,字符串"a"是一个包含额外信息的对象。 - Mmm Donuts
1
@有些开发人员,是否有一种方法可以仅获取字符串的字节,而不包含完整对象的额外信息? - Iffat Fatima
@squiguy 我的Python版本是2.7.9。 - Iffat Fatima
1
这个回答解决了你的问题吗?如何在Python中确定UTF-8编码字符串的字节长度? - maxschlepzig
2个回答

231
如果你想获取字符串的字节长度,这个函数应该可以很好地满足你的需求。
def utf8len(s):
    return len(s.encode('utf-8'))

你得到奇怪的数字的原因是因为在一个字符串中封装了许多其他信息,这是因为在Python中字符串是实际对象。

有趣的是,如果你看我的解决方案将字符串编码为“utf-8”,'s'对象(即字符串)上有一个'encode'方法。嗯,它需要被存储在某个地方,对吧?因此,字节数比正常情况要高。它包括了那个方法,以及其他一些方法 :).


没关系。有时候简单的答案会出现在看似奇怪的问题中哈哈。 - Mmm Donuts
28
编码的原因是,在Python 3中,一些单个字符的字符串需要用多个字节来表示。例如:len('你'.encode('utf-8')) - Brad Solomon

28

对于所接受的答案,有一个需要注意的地方。

对于一些多字节编码(例如utf-16),string.encode 在开头会添加一个字节顺序标记 (BOM),这是一系列特殊的字节序列,用于通知读者使用的字节序。因此,您获得的长度实际上是 len(BOM) + len(encoded_word)

如果您不想计算 BOM 字节,请使用编码的小端版本(在后缀中添加 "-le")或大端版本(在后缀中添加 "be")。

>>> len('ciao'.encode('utf-16'))
10
>>> len('ciao'.encode('utf-16-le'))
8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接