一个字符串有多少个字节

How many bytes does a string have

提问人:Richard Knop 提问时间:10/25/2010 更新时间:6/30/2017 访问量:100865

问:

有没有一些函数可以告诉我一个字符串在内存中占用了多少字节?

我需要设置套接字缓冲区的大小,以便一次传输整个字符串。

评论

7赞 Joey 10/25/2010
因此,您不关心字符串在内存中的大小,而是关心它在特定编码中的长度。通常的方法是将字符串转换为您需要传输的编码(例如 UTF-8)中的字节数组(在 Python 中可能是字节字符串)并获取长度。
0赞 0xc0de 12/7/2015
@Joey:我不明白,为什么你认为这是编码中的长度?即使我面临同样的问题,也需要知道要通过电线发送的(字符串)内容的大小。我真正需要的是大小,以字节为单位,我将如何处理该字符串的长度?
0赞 tzot 7/6/2016
@0xc0de:“纯”Unicode 不能通过网络发送,除非编码为字节。最常见的通用编码是“utf-32”、“utf-16-be”/“utf-16-le”或“utf-8”(这是一个非常明智的选择,因为它不包含空字节)。

答:

68赞 eumiro 10/25/2010 #1
import sys
sys.getsizeof(s)

# getsizeof(object, default) -> int
# Return the size of object in bytes.

但实际上你需要知道它所代表的长度,所以这样的东西应该就足够了。len(s)

评论

5赞 Noufal Ibrahim 10/25/2010
+1 表示功能。这难道不会归还所有额外的行李来代表对象吗?PyObject 中的其余字段。
6赞 eumiro 10/25/2010
@Noufal - 没错。对于简单的“a”字符串,它返回 41。
2赞 tzot 10/26/2010
我的“a”需要 25 个字节;因此,要么您运行 64 位 Python,要么我使用的字体具有更简单的笔画:)
9赞 John Machin 10/26/2010
暂时忽略与 OP 的问题完全无关:25 或 41 的大小是无稽之谈; 朋友通常会分配大小是 where 的倍数的内存块,肯定大于 1,并且其中一些块被 malloc 开销占用,并且不允许任何这些(因为它不知道 malloc 实现的任何细节)。sys.getsizeof()malloc()2 ** nnsys.getsizeof()
4赞 Brōtsyorfuzthrāx 9/16/2014
len(s)Unicode 是不够的,因为许多字符占用多个字节。请参阅 tzot 的答案(使用 Unicode 时首先转换为字节)。
101赞 tzot 10/25/2010 #2

如果是 Python 2.x ,则获取其 .如果是 Python 3.x(或 Python 2.x),则首先使用首选编码( 是一个不错的选择)编码为(或分别为 ),然后获取编码的字节/str 对象。strlenstrunicodebytesstr'utf-8'len


例如,ASCII 字符每个使用 1 个字节:

>>> len("hello".encode("utf8"))
5

而中文的则每个使用 3 个字节:

>>> len("你好".encode("utf8"))
6

评论

12赞 Tom 2/17/2016
事实上,这是正确的答案。这并不能给你你想要的。所以,如果你有一个 utf-8 编码的字符串,而不是说 ,就说sys.getsizeof()len(myString)len(myString.encode("utf8"))
2赞 Taywee 11/29/2016
这应该是正确的答案。它会准确地告诉你字符串需要多少字节,无论是否是 unicode。无论如何,字符串很有可能被编码为字节进行传输,所以我怀疑甚至会不会对性能造成影响。