内存方面,是否将字符串存储为比其UTF等价字母便宜的字节?

时间:2011-03-04 17:29:23

标签: c#

如果我将字符串存储为字节,它是否比使用UTF-8存储的内存少?

e.g。

string text = "Hello, World!";

将它编码为字节变量吗?

4 个答案:

答案 0 :(得分:3)

如果你将它存储在字节数组中,那么它比字符串更有效,是的 - 因为所有文本都是ASCII,每个字符编码为一个字节。然而,对于所有字符串来说并不普遍(有些字符需要2个字节,有些字符需要3个字符,而对于非BMP字符则需要更多),这也是一个不太方便的视觉效果以二进制形式工作...

我会坚持使用字符串,除非你有一个非常非常的理由将它们作为字节数组保存在内存中。

答案 1 :(得分:3)

如果坚持使用7bit ascii,UTF8每个字符只能使用1个字节。

但是内部.NET使用UCS-2,每个字符IIRC使用2个字节,所以是的,假设你想将它存储为UTF8,它将使用更少的内存,而不是仅仅将它存储为字符串,假设你正在存储西欧语言(aka,latin1)。

答案 2 :(得分:1)

在您给出的示例中,UTF-8编码会为您节省一些字节,因为您只使用ASCII字符,但它确实依赖于输入字符串 - 某些UTF8编码的字符串实际上可能比相应的UTF-16版本大。

//UTF-16 so 26 bytes
string text = "Hello, World!";

//UTF-8 length will be 13 (only ASCII chars used)
var bytesUTF8 = Encoding.UTF8.GetBytes(text);

//UTF-16 so 26 bytes
var bytesUTF16 = Encoding.Unicode.GetBytes(text);

答案 3 :(得分:0)

字符串是字符数组,在.NET中是UTF-16编码的。因此每个char需要一个Int16(两倍的空间)来存储它的值(代码页的上半部分中的字符使用第二个Char结构来保存第二对字节)。

如果您只处理ASCII,是的,您可以将字符串放在一个字节数组中,该字符串数据占用char数组的一半空间并且不会丢失信息。然而,正如Jon所说,这不是一种使用字符串的非常方便的方法。您有2个GIGABYTES寻址空间可用于单个字符串。作为字节,是的,您将获得20亿个字符,但作为字符串,您仍然可以在一个字符串中获得1个BILLION字符。如果你真的需要比单个字符串更多,我担心你认为你需要它。