.NET字符串的内部格式是什么?

问题描述 投票:7回答:3

[我正在C#.NET中编写一些漂亮的字符串操作密集型代码,并对我记得前一段时间记得的一些Joel Spolsky文章感到好奇:

http://www.joelonsoftware.com/articles/fog0000000319.htmlhttp://www.joelonsoftware.com/articles/Unicode.html

所以,.NET如何做到这一点?每个字符两个字节?有些Unicode chars ^ H ^ H ^ H ^ H ^ H代码点需要的更多。长度是如何编码的?

.net string unicode internals
3个回答
17
投票

在Jon Skeet出现之前,这里是他在C#中的excellent blog on strings的链接。

至少在当前实现中,字符串占用20+(n / 2)* 4字节(将n / 2的值向下舍入),其中n是字符串中的字符数。字符串类型不同寻常,因为对象本身的大小会有所不同]


10
投票

。NET使用UTF-16

来自System.String on MSDN

“字符串中的每个Unicode字符均由Unicode标量值定义,也称为Unicode代码点或Unicode字符的序数(数字)值。每个代码点均使用UTF-16编码和数字值进行编码编码的每个元素的一个由Char对象表示。“


1
投票

String对象非常复杂,以提供一个简短的示例并将给定的文本编码为字符串,以字节值序列的形式显示结果存储的内容。

字符串对象将文本表示为一系列UTF-16代码单元。它是System.Char对象的顺序集合,每个对象对应于一个UTF-16代码单元。一个Char对象通常代表一个代码点。一个代码点可能需要多个编码元素,即。多个Char对象(辅助代码点(或替代对)和字素)。注意:UTF-16是可变宽度编码。

字符串的长度作为String对象的属性存储在内存中。注意:String对象可以包含嵌入的null字符,这些字符算作字符串长度的一部分(与C和C ++相反,其中的null字符表示字符串的结尾,因此不必另外存储长度)。内部字符数组(用于存储Char对象)实际上可以比字符串的长度长(分配策略的结果)。

[如果您难以创建正确的编码来使用(因为找不到任何名为System.Text.Encoding.UTF16的属性),那么UTF-16实际上就是System.Text.Encoding.Unicode,如本示例中所述:] >

string unicodeString = "pi stands for \u03a0";
byte[] encoded = System.Text.Encoding.Unicode.GetBytes(unicodeString);

构造函数Encoding.Unicode,不带任何参数,实际上使用小尾数字节顺序创建一个UnicodeEncoding对象。 UnicodeEncoding类(实现UTF-16编码)也能够处理big endian(也支持字节顺序标记的处理)。 Intel平台的本机字节顺序为低端字节序,因此.NET(和Windows)以这种格式存储Unicode字符串可能更有效。

© www.soinside.com 2019 - 2024. All rights reserved.