字符串长度是否等于字节大小?

时间:2009-01-03 20:30:55

标签: string byte

确切地说:字符串长度是否等于字节大小?语言是否重要?

我认为是,但我只想确定。

附加信息:我只是想知道。我的具体情况是PHP与MySQL。

答案是否定的,这就是我需要知道的全部内容。

6 个答案:

答案 0 :(得分:47)

不。零终止字符串有一个额外字节。 pascal字符串(Delphi短语字符串)有一个额外的字节长度。并且unicode字符串每个字符有多个字节。

通过unicode取决于编码。它可以是每个字符2或4个字节,甚至可以是1,2和4个字节的混合。

答案 1 :(得分:23)

完全取决于平台和表现形式。

例如,在.NET中,每个UTF-16代码点的字符串在内存中占用两个字节 。但是,代理对需要两个UTF-16值作为U + 100000到U + 10FFFF范围内的完整Unicode字符。内存中的形式也有字符串长度的开销,可能还有一些填充,以及类型指针等的正常对象开销。

现在,当您从.NET写入磁盘(或网络等)的字符串时,您可以指定编码(大多数类默认为UTF-8)。此时,大小在很大程度上取决于编码。 ASCII每个字符总是占用一个字节,但是非常有限(没有重音等); UTF-8使用可变编码提供完整的Unicode范围(所有ASCII字符都以单个字节表示,但其他字符占用更多)。对于任何Unicode字符,UTF-32总是使用恰好4个字节 - 列表继续。

正如您所看到的,这不是一个简单的主题。要确定一个字符串将要占用多少空间,你需要指定完全情况是什么 - 它是否是某个平台上的内存中的对象(如果是这样,哪个平台 - 可能甚至到实现和操作系统设置),或者它是否是原始编码形式,如文本文件,如果是,使用哪种编码。

答案 2 :(得分:6)

这取决于你所说的“长度”。如果你的意思是“字符数”,那么,不,许多语言/编码方法每个字符使用多个字节。

答案 3 :(得分:3)

并非总是如此,这取决于编码。

答案 4 :(得分:3)

没有一个答案;它取决于语言的实现(请记住,有些语言有多种实现!)

零终止的ASCII字符串占用至少比字符串的“内容”多一个字节。 (可以分配更多,具体取决于字符串的创建方式。)

非零终止字符串使用描述符(或类似结构)来记录长度,这需要额外的内存某处

Unicode字符串(使用各种语言)每个字符使用两个字节。

对象存储中的字符串可以通过句柄引用,这会增加一层间接(和更多数据)以简化内存管理。

答案 5 :(得分:2)

你是对的。如果您编码为ASCII,则每个字符有一个字节。否则,每个字符是一个或多个字节。

特别重要的是要知道这对子串操作有何影响。如果每个字符没有一个字节,s [n]是否得到第n个字节或第n个字符?获取第n个字符对于大n而不是常量将是低效的,因为每个字符只有一个字节。